H题复杂度 O(2500n+q) 为什么过不了 T^T

#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
using ll=long long;
int read(){
    char ch=getchar();
    int s=0;
    while(!isdigit(ch)) ch=getchar();
    while(isdigit(ch)) s=(s<<1)+(s<<3)+ch-48,ch=getchar();
    return s;
}
const int N=1e6+10;
char a[N],t[N];
int main(){
    ios::sync_with_stdio(0);cin.tie(0);
    int n=read(),q=read();
    for(int i=1;i<=n;i++){
        a[i]=getchar();
        t[i]=a[i]^a[i-1];
    }
    while(q--){
        int op=read();
        if(op==1){
            int l=read(),r=read();
            t[l]^=1,t[r+1]^=1;
        }
        else{
            int l=read(),aa=read(),b=read();
            int nn=max(aa,b)+l-1,L=-1,R=-1,mid=max(aa,b);
            ll ans=0;
            for(int i=1;i<=nn;i++){
                a[i]=a[i-1]^t[i];
                if(i>=mid){
                	if(a[aa+i-mid]==a[b+i-mid]){
	                	if(L==-1&&R==-1) L=R=i;
	                	else R++;
	                	ans+=R-L+1;
                	}
                	else L=R=-1;
                }
            }
            printf("%lld\n",ans);
        }
    }
    return 0;
}

rt

全部评论
铸币卡常题,全是 nq 过的。一个只有 01 两种值的变量,if(res) TLE,if(res&1) AC。卡了我两个小时
1 回复 分享
发布于 07-15 17:08 浙江
或者说,用两个数组,一个初始数组,一个差分数组,一起维护就 T,只维护一个就过。
点赞 回复 分享
发布于 07-15 17:09 浙江

相关推荐

头顶尖尖的程序员:我也是面了三四次才放平心态的。准备好自我介绍,不一定要背熟,可以记事本写下来读。全程控制语速,所有问题都先思考几秒,不要急着答,不要打断面试官说话。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务