首页 > 其他分享 >[题解]CF1732C2 Sheikh (Hard Version)

[题解]CF1732C2 Sheikh (Hard Version)

时间:2024-06-24 12:31:53浏览次数:27  
标签:begin int 题解 Hard len Sheikh read xs lld

思路

首先证明一下当序列扩大时答案一定不劣。考虑 \(f(l,r)\) 到 \(f(l,r + 1)\) 的变化。

\[\begin{aligned} f(l,r) - f(l,r + 1) &= s_{l,r} - xs_{l,r} - s_{l,r + 1} + xs_{l,r + 1}\\ &= xs_{l,r + 1} - xs_{l,r} - a_{r + 1}\\ &\leq 0 \end{aligned} \]

同理可证 \(f(l,r) \geq f(l - 1,r)\)。因此上述猜想成立。

那么问题转变为找到最小的 \(r' - l'\) 使得 \(f(l',r') = f(l,r)\)。

显然,被我们去掉的数一定满足 \(\sum x = \oplus x\),根据抽屉原理这种数不超过 \(30\) 个(提前处理掉 \(0\))。

直接暴力枚举即可。

Code

#include <bits/stdc++.h>
#define re register
#define int long long

using namespace std;

const int N = 2e5 + 10;
int n,q;
int arr[N],s[N],xs[N];

inline int read(){
    int r = 0,w = 1;
    char c = getchar();
    while (c < '0' || c > '9'){
        if (c == '-') w = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9'){
        r = (r << 3) + (r << 1) + (c ^ 48);
        c = getchar();
    }
    return r * w;
}

inline void solve(){
    int len;
    vector<int> v;
    n = read(),q = read();
    for (re int i = 1;i <= n;i++){
        arr[i] = read();
        s[i] = s[i - 1] + arr[i];
        xs[i] = xs[i - 1] ^ arr[i];
        if (arr[i] > 0) v.push_back(i);
    }
    len = v.size();
    while (q--){
        int l,r,p;
        l = p = read(),r = read();
        int ansl = l,ansr = r,Min = r - l + 1;
        l = lower_bound(v.begin(),v.end(),l) - v.begin();
        r = upper_bound(v.begin(),v.end(),r) - v.begin() - 1;
        if (!len || l > r){
            printf("%lld %lld\n",p,p); continue;
        }
        for (re int i = l;i <= l + 30;i++){
            for (re int j = r - 30;j <= r;j++){
                if (i > j || i >= len || j >= len || j < 0) continue;
                int L = v[i],R = v[j];
                if ((s[R] - s[L - 1]) - (xs[R] ^ xs[L - 1]) == (s[v[r]] - s[v[l] - 1]) - (xs[v[r]] ^ xs[v[l] - 1])){
                    if (R - L + 1 < Min){
                        Min = R - L + 1;
                        ansl = L; ansr = R;
                    }
                }
            }
        }
        printf("%lld %lld\n",ansl,ansr);
    }
}

signed main(){
    int T; T = read();
    while (T--) solve();
    return 0;
}

标签:begin,int,题解,Hard,len,Sheikh,read,xs,lld
From: https://www.cnblogs.com/WaterSun/p/18264805

相关文章

  • fdisk时WARNING: Re-reading the partition table failed with error 16: 设备或资源
    WARNING:Re-readingthepartitiontablefailedwitherror16:设备或资源现象:划分磁盘有警告, WARNING:Re-readingthepartitiontablefailedwitherror16:设备或资源忙.Thekernelstillusestheoldtable.Thenewtablewillbeusedatthenextrebootoraft......
  • P3974 [TJOI2015] 组合数学 题解
    Description给一个网格图,其中某些格子有一些财宝。每次从左上角出发,只能往右或下走,每一次经过一个格子至多只能捡走一块财宝,至少要走几次才可能把财宝全捡完?\(1\leqn\leq1000\),\(1\leqm\leq1000\),每个格子中的财宝不超过\(10^6\)块。Solution考虑把每个点\((i,j)\)......
  • [题解]CF1066E Binary Numbers AND Sum
    思路考虑对于每一个\(a\)上数位进行分析。令\(a_i\)表示\(a\)在二进制表示中从左往右数的第\(i\)位上的数字,\(b_i\)同理。分类讨论一下\(a_i\)的取值对于答案的贡献:如果\(a_i=0\),对于这一位无论如何都不会拥有贡献。如果\(a_i=1\),因为\(b\)会向右移,所以能......
  • [题解]CF1061C Multiplicity
    题意给定一个长度为\(n\)的序列\(\{a_1,a_2,\dots,a_n\}\)。现在要在\(a\)选出非空子序列\(\{b_1,b_2,\dots,b_m\}\),使得所有的\(i\in[1,m]\),都有\(b_i\bmodi=0\)。求能够选取\(b\)序列的方案数模\(10^9+7\)的值。思路定义\(dp_{i,j}\)表示在\(\{a_1,a......
  • [题解]P2042 [NOI2005] 维护数列 - Splay解法
    P2042[NOI2005]维护数列一道思路不难,但实现细节很多的平衡树题,调了一天半终于做出来了w。对于初始序列,我们可以直接构建一条链(毕竟一个一个调用插入函数也可能形成一条链)。题解有递归直接构建成一棵严格平衡的二叉树的,这样也可以,常数可能会小一点。其中区间反转就是裸的文艺......
  • [MdOI R5] Many Minimizations & [ARC164F] Many Increasing Problems 题解
    讲下一个思路比较自然的基于自然数幂和的\(O(n\logn)\)且复杂度与\(m\)几乎无关的做法。不难发现让我们计数的问题是保序回归\(L_1\)中一条链的情况。这个情况有一个简单的slope-trick做法:用堆维护斜率,每次push进去两个当前的数,然后pop出一个最大值。最终所有数的和......
  • [MdOI R5] Many Minimizations & [ARC164F] Many Increasing Problems 题解
    讲下一个思路比较自然的基于自然数幂和的\(O(n\logn)\)且复杂度与\(m\)几乎无关的做法。不难发现让我们计数的问题是保序回归\(L_1\)中一条链的情况。这个情况有一个简单的slope-trick做法:用堆维护斜率,每次push进去两个当前的数,然后pop出一个最大值。最终所有数的和......
  • C++题解(1) 信息学奥赛一本通 1003:对齐输出 洛谷 B2004:对齐输出 土豆编程 T1003:对
    【题目描述】读入三个整数,按每个整数占8个字符的宽度,右对齐输出它们,按照格式要求依次输出三个整数,之间以一个空格分开。【输入】只有一行,包含三个整数,整数之间以一个空格分开。【输出】只有一行,按照格式要求依次输出三个整数,之间以一个空格分开。【输入样例】......
  • 一些东西 题解
    ATBAB设\(f_{i,0/1}\)表示\(i\)子树DFS序奇/偶位置和的最大值,首先如果\(i\)所有孩子的子树大小都是偶数,那访问这些孩子的顺序就无所谓了,否则考虑以\(i\)的至少一个大小为奇数的孩子为分界,对所有大小为偶数的孩子\(v\),把\(f_{v,0}\)更大的\(v\)、\(f_{v,1}\)......
  • [题解]CF311B Cats Transport
    思路首先,对于每一只小猫刚好玩完就被饲养员接走的出发时间必定为\(t_i-sd_i\)。那么,我们令\(a_i=t_i-sd_i\)表示第\(i\)只小猫的最早出发时间。因此,对于第\(k\)时刻出发的饲养员能接到的小猫当且仅当满足\(a_i\leqk\)。然后,我们定义\(dp_{i,j}\)表示用\(i\)......