首页 > 其他分享 >牛客练习赛 112 B~C题题解

牛客练习赛 112 B~C题题解

时间:2023-07-04 18:56:04浏览次数:53  
标签:cnt 练习赛 int 题解 long 牛客 112 using

卡B题了,难受

B. qsgg and Subarray

B-qsgg and Subarray_牛客练习赛112 (nowcoder.com)

题意

给定一个长为n的序列,求有多少个子区间的按位与和为0。

思路

要想按位与之和为0,那么对于区间的所有数,每个二进制位都要有一个0。设f[i]表示二进制位i的最右边一个0出现的位置,枚举序列的每一个元素,更新数组f,左端点就取所有二进制位的最小值。

代码

#include<bits/stdc++.h>

using namespace std;
using ll = long long;

int main () {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;

    vector<int> v(n+1);
    for(int i = 1; i <= n; i++) {
        cin >> v[i];
    }

    array<int, 31> f{0};
    ll ans = 0;
    for(int i = 1; i <= n; i++) {
        for(int j = 0; j < 31; j++) {
            if(!(v[i] >> j & 1)) {
                f[j] = i;
            }
        }
        int mn = INT_MAX;
        for(int j = 0; j < 31; j++) {
            mn = min(mn, f[j]);
        }
        ans += mn;
    }

    cout << ans << "\n";

    return 0;
}

C. qsgg and Permutation

C-qsgg and Permutation_牛客练习赛112 (nowcoder.com)

题意

给定两个长为n的排列A,B,每次操作可以将A中的一个元素插到任意位置,求最少操作使得A = B。

思路

即求n减去最长公共子序列的长度。求最长公共子序列的O(nlogn)做法为,把B中的元素转化为该元素在A中第一次出现的位置,然后求B的最长上升子序列。

代码

#include<bits/stdc++.h>

using namespace std;
using ll = long long;

int main () {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;

    vector<int> a(n+1), b(n+1);
    for(int i = 1, tmp; i <= n; i++) {
        cin >> tmp;
        a[tmp] = i;
    }
    for(int i = 1; i <= n; i++) {
        cin >> b[i];
        b[i] = a[b[i]];
    }

    int cnt = 1;
    vector<int> p(n+1);
    p[1] = b[1];

    for(int i = 2; i <= n; i++) {
        if(b[i] > p[cnt]) {
            p[++cnt] = b[i];
        } else {
            int j = upper_bound(p.begin(), p.begin() + cnt + 1, b[i]) - p.begin();
            p[j] = b[i];
        }
    }

    cout << n - cnt << "\n";

    return 0;
}

标签:cnt,练习赛,int,题解,long,牛客,112,using
From: https://www.cnblogs.com/cenqi/p/17526735.html

相关文章

  • ABC306E 题解
    题目链接题目大意维护一个数据结构,数列长度为\(n\),\(q\)次操作,每次操作修改一个位置上的值,每次操作后输出数列里前\(k\)小的数的和(\(k\)是给定的)。\(n,k,q\leq5\times10^5\)值域\(1\times10^9\)题目分析开一棵权值线段树,每个节点储存对应区间的数的个数和数的和,......
  • ABC306F 题解
    题目链接题目大意对于\(S_1\capS_2=\emptyset\),定义长度为\(|S_1|+|S_2|\)的序列\(A\),为\(S_1\cupS_2\)排序后的结果。定义二元函数\(f(S_1,S_2)=\sum\limits_{1\leqi\leq|S_1|+|S_2|}i\times[A_i\inS_1]\)。给定\(n\)个大小为\(m\)的正整数集合\(S\)......
  • NOIP 模拟赛 2023.07.04 题解--zhengjun
    linkT1转化为\((b_i,a_i)\)与\((b_j,a_j)\)之间的斜率。发现性质(省略),只需要计算相邻两个点之间的答案即可,用set就行了。T2先找性质,发现即为\(a,b,c\)各有某一位是“独特”(即其他两个数这一位与之不一样)的。直接\(O(8^2n)\)记录各个状态,预处理转移优化一下即可。T......
  • 武汉理工大学第四届ACM校赛 部分题解
    比赛地址A.ST和TS回文问题题意:给出一个字符串s,进行q次操作,操作如下:1x:给字符串的末尾加上一个字符x2k:查询是否存在长度为k的字符串t,满足s+t==t+sSolution字符串哈希当k<n时,需检查s长度为k的前后缀是否相同,并且检查s长度为n-k的前后缀是否都是回文当k==n时,一定有解当k<......
  • 洛谷CF29B题解
    CF29B交通信号灯传送门题目很好理解,这里就不多说了,思路都在代码里#include<bits/stdc++.h>usingnamespacestd;doublel,d,v,g,r;intmain(){ cout<<fixed<<setprecision(8);//重置输出方式(保留8位小数) cin>>l>>d>>v>>g>>r; if(l<=d)cout<<......
  • P9431 [NAPC-#1] Stage3 - JRefreshers 题解
    传送门这个人赛时看错了几次题目导致样例调了1h。\(Sol1:n\leqslant10,T\leqslant10\)乱搞分。枚举跳跃的顺序,判断可不可行,最后取最大值,复杂度\(O((n-1)!)\)。\(Sol2:B\)感觉跟正解没什么关系,先说这个。特殊性质\(\mathbfB\):保证对于任意跳跃球\(u,v\),如......
  • [LOJ 6029]「雅礼集训 2017 Day1」市场 题解
    这道题恶心之处在于区间向下取整。这里给出两种思路:区间覆盖做法如果最大值和最小值向下取整后相等,则对此区间进行区间覆盖。我考场写的是这个,但是码错了,加上习惯不好,\(100\to64\),再加上烦了弱智错误,\(64\to9\),不给出代码。差值相等做法注意到相邻两数的向下取整的差值不......
  • [LOJ 6030]「雅礼集训 2017 Day1」矩阵 题解
    首先不难想到一个贪心,就是先填出一个全黑的行,然后再用其填黑列。而且在其中“填出一个全黑的行步数”我们应该最小化。这个贪心的正确性证明如下:必要性:填黑列的必要条件为有一个全黑的行。充分性:“填黑列的步数”就是“非全黑列的数量”。显然,如果填出一个全黑的行的过程中......
  • Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required 问题解决
    以下是报错日志解决方案确认以下配置是否都存在:1、配置文件有写mybatis配置2、启动类里加上Mapper扫描的注解(指向自己mapper存放的位置)3、删除SpringBootApplication注解的exclude属性:@SpringBootApplication(exclude={DataSourceAutoConfiguration.class,DataSourc......
  • P2202 题解
    前言题目传送门!更好的阅读体验?提供一个平衡树做法,虽然和std::set一个道理就是了。(那你为啥不写set!!!!)前置知识如何判断两个点对应的正方形相交?正方形的边长是\(k\),中心距离四条边就是\(\dfrack2\)了。中心要相隔严格小于两段\(\dfrack2\),显然只需满足:\[|X_p-X_q|,|Y_......