社区讨论

玄关求条 40pts

P8360[SNOI2022] 军队参与者 1已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mhj41tie
此快照首次捕获于
2025/11/03 20:22
4 个月前
此快照最后确认于
2025/11/03 20:22
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
#define maxn 250005
#define tmxn 505
#define int long long
using namespace std;
namespace FastIO {
	char buf[1 << 21], *p1 = buf, *p2 = buf;
#define getchar() (p1 == p2 && (p1 = buf, p2 = (p1 + fread(buf, 1, 1 << 21, stdin))) == p1 ? EOF : *p1++)
	template <typename T> inline T read() { T x = 0, w = 0; char ch = getchar(); while (ch < '0' || ch > '9') w |= (ch == '-'), ch = getchar(); while ('0' <= ch && ch <= '9') x = x * 10 + (ch ^ '0'), ch = getchar(); return w ? -x : x; }
	template <typename T> inline void write(T x) { if (!x) return; write<T>(x / 10), putchar((x % 10) ^ '0'); }
	template <typename T> inline void print(T x) { if (x > 0) write<T>(x); else if (x < 0) putchar('-'), write<T>(-x); else putchar('0'); }
	template <typename T> inline void print(T x, char en) { print<T>(x), putchar(en); }
}; using namespace FastIO;
#undef getchar()
struct node{
	int op,l,r,x,y;
}q[maxn];
struct dot{
	int to,w;
};
int n,m,c,idx,cnt,len,sum,a[maxn],b[maxn],ls[tmxn],rs[tmxn],fa[maxn<<1],val[maxn<<1],siz[maxn<<1],tag[maxn<<1],ans[maxn],mygo[maxn<<1];
dot find(int x){
	if(x==fa[x]) return {x,0};
	dot tmp=find(fa[x]);tmp.w+=tag[x];
	fa[x]=tmp.to;tag[x]=tmp.w;
	return tmp;
}
void add(int x){
	mygo[x]=++idx,fa[idx]=idx,val[idx]=x,siz[idx]=tag[idx]=0;
}
void merge(int x,int y){
	if(!mygo[y]){
		val[mygo[x]]=y;
		mygo[y]=mygo[x];
		mygo[x]=0;
	}
	else{
		fa[mygo[x]]=mygo[y];
		tag[mygo[x]]-=tag[mygo[y]];
		siz[mygo[y]]+=siz[mygo[x]];
		mygo[x]=0;
	}
}
void build(int n){
	len=sqrt(n);cnt=(n-1)/len+1;
	for(int i=1;i<=cnt;i++){
		ls[i]=rs[i-1]+1;
		rs[i]=min(rs[i-1]+len,n);
	}
}
void init(int p){
	sum=0;
    for(int i=1;i<=idx;i++) fa[i]=val[i]=siz[i]=tag[i]=mygo[i]=0;
	idx=maxn-5;
	for(int i=ls[p];i<=rs[p];i++){
		if(!mygo[a[i]]) add(a[i]);
		fa[i]=mygo[a[i]];
		siz[mygo[a[i]]]++;
        sum+=b[i];
	}
}
void upd1(int x,int y){
	merge(x,y);
}
void upd2(int l,int r,int x,int y){
	dot tmp=find(mygo[x]);
	for(int i=l;i<=r;i++){
		if(val[find(i).to]==x){
			if(!mygo[y]) add(y);
			fa[i]=mygo[y];
			b[i]+=tmp.w;
			siz[mygo[x]]--;
			siz[mygo[y]]++;
		}
	}
	if(!siz[mygo[x]]) mygo[x]=0;
}
void chg1(int x,int y){
	sum+=siz[mygo[x]]*y;
	tag[mygo[x]]+=y;
}
void chg2(int l,int r,int x,int y){
	for(int i=l;i<=r;i++){
		if(val[find(i).to]==x) b[i]+=y,sum+=y;
	}
}
int get1(){
	return sum;
}
int get2(int l,int r){
	int ans=0;
	for(int i=l;i<=r;i++){
		dot tmp=find(i);
		ans+=b[i]+tmp.w+tag[tmp.to];
	}
	return ans;
}
void solve(int p){
    init(p);
	int l=ls[p],r=rs[p];
	for(int i=1;i<=m;i++){
		if(q[i].l>r||q[i].r<l) continue;
		if(q[i].op==1){
			if(q[i].x==q[i].y) continue;
			if(q[i].l<=l&&r<=q[i].r) upd1(q[i].x,q[i].y);
			else upd2(max(q[i].l,l),min(q[i].r,r),q[i].x,q[i].y);
		}
		else if(q[i].op==2){
			if(!mygo[q[i].x]) continue;
            if(q[i].l<=l&&r<=q[i].r) chg1(q[i].x,q[i].y);
			else chg2(max(q[i].l,l),min(q[i].r,r),q[i].x,q[i].y);
		}
		else{
			if(q[i].l<=l&&r<=q[i].r) ans[i]+=get1();
			else ans[i]+=get2(max(q[i].l,l),min(q[i].r,r));
		}
	}
}
signed main(){
    int op,l,r,x,y;
    n=read<int>(),m=read<int>(),c=read<int>();
    for(int i=1;i<=n;i++) b[i]=read<int>();
    for(int i=1;i<=n;i++) a[i]=read<int>();
	build(n);
	for(int i=1;i<=m;i++){
		op=read<int>();
        l=read<int>();
        r=read<int>();
        if(op!=3) x=read<int>(),y=read<int>();
		q[i]={op,l,r,x,y};
	}
	for(int i=1;i<=cnt;i++) solve(i);
	for(int i=1;i<=m;i++){
		if(q[i].op==3) print(ans[i]),puts("");
	}
}

回复

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

正在加载回复...