求助卡常 /kel
查看原帖
求助卡常 /kel
104324
abruce楼主2021/4/25 16:00

2过不去,1,3压线。

#include<bits/stdc++.h>
#define add0 nxt[x]=1,o[++oc]=oper(0,x,0)
#define adtag o[++oc]=oper(2,b,0),tag[b]=1
#define repsum o[++oc]=oper(1,b,sum[b])
#define link(x,y) o[++oc]=oper(0,x,nxt[x]),o[++oc]=oper(0,y,nxt[y]),nxt[y]=nxt[x]=y-x+1
using namespace std;
const int maxn=3e5+5,maxm=666,blk=483,blk2=1766;
typedef long long ll;
char __buf[1<<19],*__p1,*__p2;
#define getchar() (__p1==__p2?(__p2=__buf+fread(__p1=__buf,1,1<<19,stdin),__p1==__p2?EOF:*__p1++):*__p1++)
inline int read() {
	int __x=0;
	char __c=getchar();
	while(__c<'0'||__c>'9') __c=getchar();
	while(__c>='0'&&__c<='9') {
		__x=__x*10+__c-'0';
		__c=getchar();
	}
	return __x;
}
inline char pc(const char ch,const bool bj) {
	static char buf[1<<16],*p1=buf,*p2=buf+(1<<16);
	return ((bj)||(*p1++=ch)&&p1==p2)&&fwrite(p1=buf,1,p1-buf,stdout),0;
}
void print(const ll x) {
	if(x>9)print(x/10);
	pc(x%10^48,0);
}
inline void printnum(const ll x,const char ch) {
	print(x),pc(ch,0);
}
struct quest {
	int l,r,x,id;
	quest(const int L,const int R,const int X,const int i) {
		l=L,r=R,x=X,id=i;
	}
};
struct node {
	int x,y,t;
	node(const int X,const int Y,const int T) {
		x=X,y=Y,t=T;
	}
};
struct oper {
	char op;
	int x,y;
	oper() {}
	oper(const char o,const int X,const int Y) {
		op=o,x=X,y=Y;
	}
} o[maxn*3];
typedef vector<node>::iterator iter;
typedef vector<quest>::iterator ite;
vector<node> p[maxm];
vector<quest> q[maxm];
int a[maxn],rk[maxn],cnt[maxn],n,m,oc,l[maxm],r[maxm],sum[maxm];
short bel[maxn],nxt[maxn],sn,sm;
bool tag[maxm],pd[maxn];
char op[maxn];
ll ans[maxn],c2[maxn];
bool cmp(const quest a,const quest b) {
	return a.x<b.x;
}
inline void merge(const int x) {
//	cout<<x<<' '<<a[x]<<endl;
	const int b=bel[x],lb=l[b],rb=r[b],lsx=x+nxt[x+1],prx=x-nxt[x-1];
	const bool lspd=lsx==x,prpd=prx==x;
	if(x==lb) {
		if(lspd)add0;
		else if(lsx==rb)adtag;
		else repsum,sum[b]-=c2[lsx-x],link(x,lsx);
	} else if(x==rb) {
		if(prpd)add0;
		else if(prx==lb)adtag;
		else repsum,sum[b]-=c2[x-prx],link(prx,x);
	} else {
		if(prpd&&lspd)add0,repsum,sum[b]++;
		else if(lspd) {
			if(prx!=lb)repsum,sum[b]+=x-prx+1;
			link(prx,x);
		} else if(prpd) {
			if(lsx!=rb)repsum,sum[b]+=lsx-x+1;
			link(x,lsx);
		} else {
			if(prx==lb&&lsx==rb)adtag;
			else {
				repsum;
				if(prx==lb)sum[b]-=c2[lsx-x];
				else if(lsx==rb)sum[b]-=c2[x-prx];
				else sum[b]-=c2[x-prx]+c2[lsx-x],sum[b]+=c2[lsx-prx+1];
				link(prx,lsx),add0;
			}
		}
	}
}
inline void replace(const int cas) {
	while(oc>cas) {
		const char op=o[oc].op;
		if(!op)nxt[o[oc].x]=o[oc].y;
		else if(op==1)sum[o[oc].x]=o[oc].y;
		else tag[o[oc].x]=0;
		oc--;
	}
}
ll getans(const int lx,const int ry) {
	ll w=0;
	int cc=0;
	const int x=bel[lx],y=bel[ry];
//	for(register int i=1;i<=n;i++)cout<<bool(nxt[i]);
//	puts("");
	if(x==y) {
		if(tag[x])cc=ry-lx+1;
		else for(register int i=lx; i<=ry; i++)nxt[i]?cc++:(w+=c2[cc],cc=0);
		return w+c2[cc];
	}
	if(tag[x])cc+=r[x]-lx+1;
	else for(register int i=lx; i<=r[x]; i++)nxt[i]?cc++:(w+=c2[cc],cc=0);
	for(register short i=x+1; i<=y-1; i++) {
//		cout<<(int)tag[i]<<' '<<nxt[l[i]]<<' '<<sum[i]<<' '<<nxt[r[i]]<<endl;
		if(tag[i])cc+=r[i]-l[i]+1;
		else w+=c2[cc+nxt[l[i]]]+sum[i],cc=nxt[r[i]];
	}
	if(tag[y])cc+=ry-l[y]+1;
	else for(register int i=l[y]; i<=ry; i++)nxt[i]?cc++:(w+=c2[cc],cc=0);
	return w+c2[cc];
}
int main() {
//	freopen("data.in","r",stdin);
//	freopen("my.out","w",stdout);
	int x,y;
	n=read(),m=read(),sn=n/blk+(n%blk!=0),sm=m/blk2+(m%blk2!=0);
	for(register short i=1; i<=sn; i++)l[i]=(i-1)*blk+1,r[i]=min(i*blk,n);
	for(register int i=1; i<=n; i++)a[i]=read(),bel[i]=(i-1)/blk+1,c2[i]=(ll)i*(i+1)/2;
	for(register int i=1; i<=m; i++) {
		op[i]=read(),x=read(),y=read();
		const int bk=(i-1)/blk2+1;
		if(op[i]==1)p[bk].insert(p[bk].end(),node(x,y,i));
		else q[bk].insert(q[bk].end(),quest(x,y,read(),i));
	}
	for(register short i=1; i<=sm; i++) {
//		cerr<<i<<endl;
		sort(q[i].begin(),q[i].end(),cmp),reverse(p[i].begin(),p[i].end());
		memset(cnt,0,sizeof(cnt));
		for(register int j=1; j<=n; j++)cnt[a[j]]++;
		for(register int j=1; j<=n; j++)cnt[j]+=cnt[j-1];
		for(register int j=1; j<=n; j++)rk[cnt[a[j]]--]=j;
		register int lst=1;
		const iter fs=p[i].begin(),ls=p[i].end();
		for(register iter it=fs; it!=ls; it++)pd[it->x]=1;
//		puts("###");
//		for(register int j=1;j<=sn;j++)cout<<(int)tag[j]<<' '<<pre[j]<<' '<<sum[j]<<' '<<suf[j]<<endl;
		for(register ite it=q[i].begin(); it!=q[i].end(); it++) {
//			puts("------");
//			cout<<it->l<<' '<<it->r<<' '<<it->x<<' '<<it->id<<endl;
			const int x=it->x,id=it->id;
			while(a[rk[lst]]<=x&&lst<=n) {
				if(!pd[rk[lst]])merge(rk[lst]);
				lst++;
			}
			const int cas=oc;
			if(fs!=ls) {
//				puts("*");
				for(register iter tmp=fs; tmp!=ls; tmp++) {
					if(tmp->t>id)continue;
					if(!pd[tmp->x])continue;
					if(tmp->y<=x)merge(tmp->x);
					pd[tmp->x]=0;
				}
//				puts("*");
				for(register iter tmp=fs; tmp!=ls; tmp++) {
					if(tmp->t<id)break;
					if(!pd[tmp->x])continue;
					if(a[tmp->x]<=x)merge(tmp->x);
					pd[tmp->x]=0;
				}
				for(register iter tmp=fs; tmp!=ls; tmp++)pd[tmp->x]=1;
			}
//			puts("***");
			ans[id]=getans(it->l,it->r);
			replace(cas);
		}
		replace(0);
		for(register iter it=fs; it!=ls; it++) {
			if(!pd[it->x])continue;
			a[it->x]=it->y,pd[it->x]=0;
		}
	}
	for(register int i=1; i<=m; i++)if(op[i]==2)printnum(ans[i],'\n');
	pc(0,1);
}
2021/4/25 16:00
加载中...