社区讨论

98pts求助

P6578[Ynoi2019] 魔法少女网站参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mk1wuth5
此快照首次捕获于
2026/01/06 09:28
2 个月前
此快照最后确认于
2026/01/06 11:11
2 个月前
查看原帖
除去TLE的点最高3.24s,T的超过了3.7s,有无好心给个hack构造或者帮忙看看解决方案,谢谢。
代码:
CPP
#include <bits/stdc++.h>
using namespace std;
const int maxn=3e5+10;
int head[maxn],nxt[maxn],tt,shu[maxn],qi[maxn],zh[maxn],sj,h[maxn],nt[maxn],fy[maxn],rr,sum[maxn],yy[maxn];
int n,m,a[maxn],B1,B,tp,tot,pre[maxn],suf[maxn],b[maxn],ss[maxn],L,R,ll,zg,op,cc;
long long ans,anss[maxn],S;
bool now[maxn],vis[maxn];
struct IO {
	static const int Size = (1 << 21);
	char buf[Size], *p1, *p2; int st[105], Top;
	~IO() {clear();}
	inline void clear() {fwrite(buf, 1, Top, stdout); Top = 0;}
	inline char gc() {return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, Size, stdin), p1 == p2) ? EOF : *p1++;}
	inline void pc(const char c) {Top == Size && (clear(), 0); buf[Top++] = c;}
	inline IO &operator >> (char &c) {while(c = gc(), c == ' ' || c == '\n' || c == '\r'); return *this;}
	template <typename T> inline IO &operator >> (T &x) {
		x = 0; bool f = 0; char ch = gc();
		while(!isdigit(ch)) {if(ch == '-') f = 1; ch = gc();}
		while(isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48), ch = gc();
		f ? x = -x : 0; return *this;
	}
	inline IO &operator << (const char c) {pc(c); return *this;}
	template <typename T> inline IO &operator << (T x) {
		if(x < 0) pc('-'), x = -x;
		do st[++st[0]] = x % 10, x /= 10; while(x);
		while(st[0]) pc('0' + st[st[0]--]);
		return *this;
	}
	inline IO &operator << (const char *s) {for(int i = 0; s[i]; i++) pc(s[i]); return *this;}
}fin, fout;
struct edge{
	int x,y;
}xiu[maxn];
struct node{
	int l,r,x,id,t;
}wen[maxn];
inline void solve(){
	for(int i=1;i<=n;i++){
		vis[i]=1;
		now[i]=0;
		sum[i]=0;
	}
	tt=0;
	for(int i=1;i<=tp;i++){
		vis[xiu[i].x]=0;
	}
	sj=0;
	for(int i=1;i<=tot;i++){
		sj=max(sj,wen[i].x);
		nxt[i]=head[wen[i].x];
		head[wen[i].x]=i;
	}
	for(int i=1;i<=n;i++){
		pre[i]=suf[i]=i;
		if(!vis[i]){
			ss[++tt]=i;
			fy[i]=tt;
		}
		else if(a[i]<=sj){
			nt[i]=h[a[i]];
			h[a[i]]=i;
		}
	}
	for(int i=1;i<=sj;i++){
		for(int j=h[i];j;j=nt[j]){
			now[j]=1;
			if(now[j-1]&&shu[j-1]==shu[j]){
				sum[shu[j]]-=(suf[j-1]-pre[j-1]+1)*(suf[j-1]-pre[j-1]+2);
				pre[j]=pre[j-1];
				suf[pre[j-1]]=j;
			}
			if(now[j+1]&&shu[j+1]==shu[j]){
				sum[shu[j]]-=(suf[j+1]-pre[j+1]+1)*(suf[j+1]-pre[j+1]+2);
				pre[suf[j+1]]=pre[j];
				suf[pre[j]]=suf[j+1];
			}
			sum[shu[j]]+=(suf[pre[j]]-pre[suf[j]]+1)*(suf[pre[j]]-pre[suf[j]]+2);
		}
		h[i]=0;
		for(int j=head[i];j;j=nxt[j]){
			cc++;
			for(int k=1;k<=tt;k++){
				b[k]=(a[ss[k]]<=i);
			}
			for(int k=1;k<=wen[j].t;k++){
				b[fy[xiu[k].x]]=(xiu[k].y<=i);
			}
			ans=0;
			for(int k=1;k<=tt;k++){
				if(!b[k]||yy[k]==cc||ss[k]<wen[j].l||ss[k]>wen[j].r){
					continue;
				}
				L=ss[k],R=ss[k];
				S=0;
				while(L>wen[j].l&&(now[L-1]||b[fy[L-1]])){
					ll=pre[L-1],rr=L-1;
					if(!fy[rr]){
						S+=max(0,min(rr,wen[j].r)-max(ll,wen[j].l)+1);
					}
					else{
						ans-=S*(S+1);
						S=0;
					}
					L=ll;
				}
				ans-=S*(S+1);
				S=0;
				while(R<wen[j].r&&(now[R+1]||b[fy[R+1]])){
					ll=R+1,rr=suf[ll];
					if(!fy[ll]){
						S+=max(0,min(rr,wen[j].r)-max(ll,wen[j].l)+1);
					}
					else{
						yy[fy[ll]]=cc;
						ans-=S*(S+1);
						S=0;
					}
					R=rr;
				}
				ans-=S*(S+1);
				S=max(0,min(R,wen[j].r)-max(L,wen[j].l)+1);
				ans+=S*(S+1);
			}
			S=0;
			if(shu[wen[j].l]==shu[wen[j].r]){
				for(int k=wen[j].l;k<=wen[j].r;k++){
					if(now[k]){
						S++;
					}
					else{
						ans+=S*(S+1);
						S=0;
					}
				}
				ans+=S*(S+1);
			}
			else{
				for(int k=wen[j].l;k<=zh[shu[wen[j].l]];k++){
					if(now[k]){
						S++;
					}
					else{
						ans+=S*(S+1);
						S=0;
					}
				}
				for(int k=shu[wen[j].l]+1;k<shu[wen[j].r];k++){
					if(now[qi[k]]&&suf[qi[k]]==zh[k]){
						S+=zh[k]-qi[k]+1;
					}
					else{
						if(now[qi[k]]){
							S=S+suf[qi[k]]-pre[qi[k]]+1;
							ans+=S*(S+1);
							S=suf[qi[k]]-pre[qi[k]]+1;
							ans-=S*(S+1);
						}
						else{
							ans+=S*(S+1);
						}
						ans+=sum[k];
						if(now[zh[k]]){
							S=suf[zh[k]]-pre[zh[k]]+1;
							ans-=S*(S+1);
						}
						else{
							S=0;
						}
					}
				}
				for(int k=qi[shu[wen[j].r]];k<=wen[j].r;k++){
					if(now[k]){
						S++;
					}
					else{
						ans+=S*(S+1);
						S=0;
					}
				}
				ans+=S*(S+1);
			}
			anss[wen[j].id]=ans;
		}
		head[i]=0;
	}
	for(int i=1;i<=tot;i++){
		fout<<(anss[i]>>1)<<'\n';
	}
	for(int i=1;i<=tp;i++){
		a[xiu[i].x]=xiu[i].y;
		fy[xiu[i].x]=0;
		b[i]=0;
	}
	tot=0;
	tp=0;
	return;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	fin>>n>>m;
	for(int i=1;i<=n;i++){
		fin>>a[i];
	}
	B=sqrt(0.81*n);
	for(int l=1,r;l<=n;l=r+1){
		r=min(l+B-1,n);
		zg++;
		qi[zg]=l;
		zh[zg]=r;
		for(int i=l;i<=r;i++){
			shu[i]=zg;
		}
	}
	B1=sqrt(14*m);
	for(int i=1;i<=m;i++){
		fin>>op;
		if(op==1){
			tp++;
			fin>>xiu[tp].x>>xiu[tp].y;
			if(tp==B1){
				solve();
			}
		}
		else{
			tot++;
			fin>>wen[tot].l>>wen[tot].r>>wen[tot].x;
			wen[tot].t=tp;
			wen[tot].id=tot;
		}
	}
	solve();
	return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...