社区讨论
为什么改成单向边就能AC?求dalao解答
P3459[POI 2007] MEG-Megalopolis参与者 4已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mi6t3hu2
- 此快照首次捕获于
- 2025/11/20 10:22 3 个月前
- 此快照最后确认于
- 2025/11/21 00:00 3 个月前
CPP
#include <stdio.h>
#define mid ((l+r)>>1)
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define len (r-l+1)
#define ll long long
template<typename T>
void in(T &x) {
int k=1;
x=0;
char c=getchar();
while (!('0'<=c && c<='9')) {
if (c=='-')
k=-1;
c=getchar();
}
while ('0'<=c && c<='9') {
x=(x<<3)+(x<<1)+(c^48);
c=getchar();
}
x*=k;
}
template<typename T>
void out(T x,bool pd=true) {
if (pd) {
if (x<0) {
putchar('-');
x*=-1;
}
if (x==0) {
putchar('0');
return ;
}
}
if (x==0)
return ;
out(x/10,false);
putchar(x%10+'0');
}
template<typename T>
void swap(T &x,T &y){
T o=x;
x=y;
y=o;
}
int n,m,r,mod=1000000007;
int e,beg[250005],nex[250005],to[250005];
int w[250005],wt[250005];
int a[250005<<2],laz[250005<<2];
int son[250005],id[250005],fa[250005];
int cnt;
int dep[250005],siz[250005],top[250005];
int res=0;
void add(int x,int y) {
to[++e]=y;
nex[e]=beg[x];
beg[x]=e;
}
void push_down(int rt,int lenn) {
laz[rt<<1]+=laz[rt];
laz[rt<<1|1]+=laz[rt];
a[rt<<1]+=laz[rt]*(lenn-(lenn>>1));
a[rt<<1|1]+=laz[rt]*(lenn>>1);
a[rt<<1]%=mod;
a[rt<<1|1]%=mod;
laz[rt]=0;
}
void build(int rt,int l,int r) {
if(l==r) {
a[rt]=wt[l];
if(a[rt]>mod)
a[rt]%=mod;
return;
}
build(lson);
build(rson);
a[rt]=(a[rt<<1]+a[rt<<1|1])%mod;
}
void query(int rt,int l,int r,int L,int R) {
if(L<=l && r<=R) {
res+=a[rt];
res%=mod;
return;
} else {
if(laz[rt])
push_down(rt,len);
if(L<=mid)
query(lson,L,R);
if(R>mid)
query(rson,L,R);
}
}
void update(int rt,int l,int r,int L,int R,int k) {
if(L<=l && r<=R) {
laz[rt]+=k;
a[rt]+=k*len;
} else {
if(laz[rt])
push_down(rt,len);
if(L<=mid)
update(lson,L,R,k);
if(R>mid)
update(rson,L,R,k);
a[rt]=(a[rt<<1]+a[rt<<1|1])%mod;
}
}
void update_range(int x,int y,int k) {
k%=mod;
while(top[x]!=top[y]) {
if(dep[top[x]]<dep[top[y]])
swap(x,y);
update(1,1,n,id[top[x]],id[x],k);
x=fa[top[x]];
}
if(dep[x]>dep[y])
swap(x,y);
update(1,1,n,id[x],id[y],k);
}
int ask_range(int x,int y) {
int ans=0;
while(top[x]!=top[y]) {
if(dep[top[x]]<dep[top[y]])
swap(x,y);
res=0;
query(1,1,n,id[top[x]],id[x]);
ans+=res;
ans%=mod;
x=fa[top[x]];
}
if(dep[x]>dep[y])
swap(x,y);
res=0;
query(1,1,n,id[x],id[y]);
ans+=res;
return ans%mod;
}/*
void update_son(int x,int k) {
update(1,1,n,id[x],id[x]+siz[x]-1,k);
}
int ask_son(int x) {
res=0;
query(1,1,n,id[x],id[x]+siz[x]-1);
return res;
}*/
void dfs1(int x,int f,int deep) {
dep[x]=deep;
fa[x]=f;
siz[x]=1;
int maxson=-1;
for(int i=beg[x]; i; i=nex[i]) {
int y=to[i];
if(y==f)
continue;
dfs1(y,x,deep+1);
siz[x]+=siz[y];
if(siz[y]>maxson){
son[x]=y;
maxson=siz[y];
}
}
}
void dfs2(int x,int topf) {
id[x]=++cnt;
wt[cnt]=w[x];
top[x]=topf;
if(!son[x])
return;
dfs2(son[x],topf);
for(int i=beg[x]; i; i=nex[i]) {
int y=to[i];
if(y==fa[x]||y==son[x])
continue;
dfs2(y,y);
}
}
int main() {
// freopen (".in","r",stdin);
// freopen (".out","w",stdout);
in(n);
// in(r);
r=1;
// in(mod);
for(int i=2; i<=n; ++i)
// in(w[i]);
w[i]=1;
for(int i=1; i<n; ++i) {
int a,b;
in(a);
in(b);
add(a,b);
// add(b,a); ???????????????????????????????
}
dfs1(r,0,1);
dfs2(r,r);
build(1,1,n);
in(m);
m=n+m-1;
while(m--) {
int k,x,y,z;
// in(k);
char o[3];
scanf ("%s",o);
if(o[0]=='A') {
in(x);
in(y);
// y=x;
// in(z);
z=-1;
update_range(y,y,z);
} else if(o[0]=='W') {
// in(x);
x=1;
in(y);
out(ask_range(x,y));
puts("");
} /*else if(k==3) {
in(x);
in(y);
update_son(x,y);
} else {
in(x);
out(ask_son(x));
puts("");
}*/
}
}
https://www.luogu.com.cn/record/248303302
https://www.luogu.com.cn/record/248303486
回复
共 4 条回复,欢迎继续交流。
正在加载回复...