全 TLE 求助
查看原帖
全 TLE 求助
723238
wukaichen888楼主2023/9/10 23:47

复杂度不知道哪里错了,全部 TLE /fad

求指出复杂度哪里挂了 QAQ

#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long
typedef long long ll;
const ll N=6e5+5,M=6e5+5;
int n,m,a[N],l1,l2;
struct U{int id,v;}c[N],b1[N],b2[N];
bool cmp1(U x,U y){return x.v<y.v;}
void msort(){
	int t1=1,t2=1,to=0;
	for(;t1<=l1||t2<=l2;)
		if(t1<=l1&&(t2>l2||b1[t1].v<b2[t2].v)){
			c[++to]=b1[t1];
			t1++;
		}
		else{
			c[++to]=b2[t2];
			t2++;
		}
}
struct ds{
	int head[N],tail[N],K,pos[N],L[N],R[N],top,pre[N],suf[N];
	bool vis[N];ll ans[N];
	struct node{int op,x;ll y;}stak[M];
	void rep(int las){
		while(top>las){
			if(stak[top].op==1) head[stak[top].x]=stak[top].y;
			if(stak[top].op==2) tail[stak[top].x]=stak[top].y;
			if(stak[top].op==3) pre[stak[top].x]=stak[top].y;
			if(stak[top].op==4) suf[stak[top].x]=stak[top].y;
			if(stak[top].op==5) vis[stak[top].x]=stak[top].y;
			if(stak[top].op==6) ans[stak[top].x]=stak[top].y;
			top--;
		}
	}
	void Pre(){
		K=sqrt(n);
		for(int i=1;i<=n;i++) pos[i]=(i-1)/K+1;
		for(int i=1;i<=n;i++) R[pos[i]]=i;
		for(int i=n;i;i--) L[pos[i]]=i;
	}
	void link(int x,int y){
		stak[++top]=(node){1,y,head[y]};
		stak[++top]=(node){2,x,tail[x]};
		head[y]=x,tail[x]=y;
	}
	ll gx(ll x){return x*(x+1)/2;}
	void change(int x){
		if(vis[x]) return ;
		int y1,y2;
		stak[++top]=(node){5,x,vis[x]};
		stak[++top]=(node){1,x,head[x]};
		stak[++top]=(node){2,x,tail[x]};
		stak[++top]=(node){3,pos[x],pre[pos[x]]};
		stak[++top]=(node){4,pos[x],suf[pos[x]]};
		stak[++top]=(node){6,pos[x],ans[pos[x]]};
		vis[x]=1,head[x]=tail[x]=x;
		y1=0;
		if(head[x-1]) ans[pos[x]]-=gx((x-1)-max(L[pos[x]],head[x-1])+1),y1+=(x-1)-max(L[pos[x]],head[x-1])+1;
		if(tail[x+1]) ans[pos[x]]-=gx(min(R[pos[x]],tail[x+1])-(x+1)+1),y1+=min(R[pos[x]],tail[x+1])-(x+1)+1;
		y1++;
		ans[pos[x]]+=gx(y1);
		if(x==L[pos[x]]||head[x-1]&&head[x-1]<=L[pos[x]]) pre[pos[x]]=max(x,min(R[pos[x]],tail[x+1]))-L[pos[x]]+1;
		if(x==R[pos[x]]||tail[x+1]&&tail[x+1]>=R[pos[x]]){
			suf[pos[x]]=R[pos[x]]-x+1;
			if(head[x-1]) suf[pos[x]]=R[pos[x]]-max(L[pos[x]],head[x-1])+1;
		}
		if(head[x-1]){
			int y1=head[x-1],y2=tail[x];
			stak[++top]=(node){1,x-1,head[x-1]};
			stak[++top]=(node){2,x-1,tail[x-1]};
			head[x-1]=tail[x-1]=0;
			head[x]=tail[x]=0;
			link(y1,y2);
		}
		if(tail[x+1]){
			int y1=head[x],y2=tail[x+1];
			stak[++top]=(node){1,x+1,head[x+1]};
			stak[++top]=(node){2,x+1,tail[x+1]};
			head[x]=tail[x]=0;
			head[x+1]=tail[x+1]=0;
			link(y1,y2);
		}
	}
	void w(){
		for(int i=1;i<=n;i++) printf("%d ",pos[i]);
		puts("");
		for(int i=1;i<=n;i++) printf("%d ",head[i]);
		puts("");
		for(int i=1;i<=n;i++) printf("%d ",tail[i]);
		puts("");
		for(int i=1;i<=n;i++) printf("%d ",vis[i]);
		puts("");
		for(int i=1;i<=pos[n];i++) printf("%d ",pre[i]);
		puts("");
		for(int i=1;i<=pos[n];i++) printf("%d ",suf[i]);
		puts("");
		for(int i=1;i<=pos[n];i++) printf("%d ",ans[i]);
		puts("");
		puts("");
	}
	ll query(int x,int y){
		ll res=0,len=0;
		if(pos[x]==pos[y]){
			for(int i=x;i<=y;i++)
				if(!vis[i]) res+=gx(len),len=0;
				else len++;
			res+=gx(len);
		}
		else{
			for(int i=x;i<=R[pos[x]];i++)
				if(!vis[i]) res+=gx(len),len=0;
				else len++;
			for(int i=pos[x]+1;i<pos[y];i++)
				if(pre[i]==R[i]-L[i]+1)
					len+=pre[i];
				else{
					res+=gx(len+pre[i]);
					res+=ans[i];
					res-=gx(pre[i]);
					res-=gx(suf[i]);
					len=suf[i];
				}
			for(int i=L[pos[y]];i<=y;i++)
				if(!vis[i]) res+=gx(len),len=0;
				else len++;
			res+=gx(len);
		}
		return res;
	}
	void test(){
		int op,x,y,z;
		while(1){
			scanf("%d",&op);
			if(op==1){
				scanf("%d",&x);
				change(x);
			}
			if(op==2){
				scanf("%d%d",&x,&y);
				printf("%lld\n",query(x,y));
			}
			if(op==3)
				rep(0);
			if(op==4)
				w();
		}
	}
}A;
struct ques{int l,r,v,id;}b[N];
bool cmp(ques x,ques y){return x.v<y.v;}
struct qwq{
	int K,pos[N],L[N],R[N],op[N],X[N],Y[N],Z[N],tot1;
	int vis[N],val[N];ll ans[N];
	void work(){
		K=sqrt(m);
		for(int i=1;i<=m;i++) pos[i]=(i-1)/K+1;
		for(int i=1;i<=m;i++) R[pos[i]]=i;
		for(int i=m;i;i--) L[pos[i]]=i;
		for(int i=1;i<=m;i++){
			scanf("%d%d%d",&op[i],&X[i],&Y[i]);
			if(op[i]==2) scanf("%d",&Z[i]);
		}
		A.Pre();
		for(int i=1,to;i<=pos[m];i++){
			tot1=0;
			for(int j=L[i];j<=R[i];j++)
				if(op[j]==1) vis[X[j]]=1;
				else b[++tot1]=(ques){X[j],Y[j],Z[j],j};
			sort(b+1,b+tot1+1,cmp);
			to=1;
			for(int j=1,las;j<=tot1;j++){
				while(to<=n&&c[to].v<=b[j].v){
					if(!vis[c[to].id]) A.change(c[to].id);
					to++;
				}
				las=A.top;
				for(int p=L[i];p<=R[i];p++) val[X[p]]=(a[X[p]]<=b[j].v);
				for(int p=L[i];p<=b[j].id;p++)
					if(op[p]==1)
						val[X[p]]=(Y[p]<=b[j].v);
				for(int p=L[i];p<=R[i];p++)
					if(op[p]==1&&val[X[p]])
						A.change(X[p]);
				ans[b[j].id]=A.query(b[j].l,b[j].r);
				A.rep(las);
			}
			A.rep(0);
			for(int j=L[i];j<=R[i];j++)
				if(op[j]==1) a[X[j]]=Y[j];
			l1=l2=0;
			for(int j=1;j<=n;j++)
				if(vis[c[j].id]) b1[++l1]=(U){c[j].id,a[c[j].id]};
				else b2[++l2]=c[j];
			sort(b1+1,b1+l1+1,cmp1);
			msort();
			for(int j=L[i];j<=R[i];j++)
				if(op[j]==1) vis[X[j]]=0;
		}
		for(int i=1;i<=m;i++)
			if(op[i]==2)
				printf("%lld\n",ans[i]);
	}
}B;
int main(){
//	freopen("data.in","r",stdin);
//	freopen("data.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]),c[i].v=a[i],c[i].id=i;
	sort(c+1,c+n+1,cmp1);
//	A.Pre();
//	A.test();
	B.work();
	return 0;
}


/*
5 2
5 2 5 2 1 
1 3 1
2 3 4 5
*/


2023/9/10 23:47
加载中...