社区讨论
玄关求条 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 条回复,欢迎继续交流。
正在加载回复...