社区讨论
WA 0pts 求条
CF607D Power Tree参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mhjoh3uq
- 此快照首次捕获于
- 2025/11/04 05:54 4 个月前
- 此快照最后确认于
- 2025/11/04 05:54 4 个月前
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=200005,mod=1000000007;
int v1,q,cnt=1;
int op[N],id[N],qst[N],val[N];
vector<int> vec[N];
int fdfn[N];
// 线段树部分
struct Node {
int l,r,tag=1;
int sum=0,is_add=1;
}tre[4*N];
#define mid (tre[now].l+tre[now].r>>1)
#define lson (now*2)
#define rson (now*2+1)
void pushdown(int now) {
tre[now].sum=(tre[now].sum*tre[now].tag)%mod;
if(tre[now].l!=tre[now].r) {
tre[lson].tag=(tre[lson].tag*tre[now].tag)%mod;
tre[rson].tag=(tre[rson].tag*tre[now].tag)%mod;
}
tre[now].tag=1;
}
void pushup(int now) {
tre[now].sum=(tre[lson].sum*tre[lson].is_add+tre[rson].sum*tre[rson].is_add)%mod;
}
void build(int now,int l,int r) {
tre[now].l=l,tre[now].r=r;
if(l==r) {tre[now].sum=val[fdfn[l]],tre[now].is_add=0;return;}
build(lson,l,mid);build(rson,mid+1,r);
pushup(now);
}
void change(int now,int l,int r,int k) {
pushdown(now);
if(tre[now].l>r || tre[now].r<l) return;
if(tre[now].l>=l && tre[now].r<=r) {
tre[now].tag=k;
pushdown(now);
return;
}
change(lson,l,mid,k);change(rson,mid+1,r,k);
pushup(now);
}
int query(int now,int l,int r) {
if(tre[now].l>r || tre[now].r<l) return 0;
pushdown(now);
if(tre[now].l>=l && tre[now].r<=r) return tre[now].sum*tre[now].is_add;
return (query(lson,l,r)+query(rson,l,r))%mod;
}
void add(int now,int p) {
pushdown(now);
if(tre[now].l>p || tre[now].r<p) return;
if(tre[now].l==tre[now].r) {
tre[now].is_add=1;
return;
}
add(lson,p);add(rson,p);
pushup(now);
}
int fa[N],dfn[N],siz[N],son[N],tot;
void dfs(int u,int father) {
fa[u]=father,dfn[u]=++tot,fdfn[tot]=u,siz[u]=1;
for(auto& v:vec[u]) {
dfs(v,u);
siz[u]+=siz[v];
}
}
int qmod(int n,int k) {
if(k==1) return n;
if(k&1) return n*qmod(n*n%mod,k>>1)%mod;
else return qmod(n*n%mod,k>>1);
}
signed main() {
cin >> v1 >> q;
val[1]=v1;
int p,v;
for(int i=1;i<=q;++i) {
cin >> op[i];
if(op[i]==1) {
cin >> p >> v;
id[i]=++cnt,val[cnt]=v;
vec[p].push_back(cnt);
}else {
cin >> qst[i];
}
}
for(int i=1;i<=cnt;++i) son[i]=1;
dfs(1,0);
build(1,1,cnt);
add(1,dfn[1]);
int u;
for(int i=1;i<=q;++i) {
if(op[i]==1) {
son[fa[id[i]]]++;
add(1,dfn[id[i]]);
change(1,dfn[fa[id[i]]],dfn[fa[id[i]]]+siz[fa[id[i]]]-1,son[fa[id[i]]]*qmod(son[fa[id[i]]]-1,mod-2)%mod);
}else {
u=qst[i];
if(fa[u])
cout << query(1,dfn[u],dfn[u]+siz[u]-1)*qmod(query(1,dfn[fa[u]],dfn[fa[u]])*qmod(val[fa[u]],mod-2)%mod,mod-2)%mod << '\n';
else cout << query(1,dfn[u],dfn[u]+siz[u]-1) << '\n';
}
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...