真的不好意思说话。你写得越多,对风暴各种问题泄露,更离谱,有什么错有。。
。但是,仍然有一个。同时经过规范的编写清晰的代码。不能认为是理所当然。。。
树桩阵列版:
#include<cstdio> #include<cstring> #pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<algorithm> using namespace std; const int M = 50100; int son[M],top[M],father[M],dep[M],ti[M],siz[M]; int idx,tp,n; struct { int head; }H[M]; struct { int v,next; }E[M]; void dfs_1(int u,int fa){ son[u] = 0;siz[u] = 1;father[u] = fa;dep[u] = dep[fa] + 1; for(int i=H[u].head;i!=-1;i=E[i].next){ int v = E[i].v; if(v == fa)continue; dfs_1(v,u); siz[u] += siz[v]; if(siz[son[u]] < siz[v])son[u] = v; } } void dfs_2(int u,int fa){ top[u] = fa; ti[u] = idx++; if(son[u]) dfs_2(son[u],fa); for(int i=H[u].head;i!=-1;i=E[i].next){ int v = E[i].v; if(v == father[u]|| v == son[u])continue; dfs_2(v,v); } } int lobit(int x){ return x&(-x); } int num[M*2]; void update(int x ,int d){ while( x <= n){ num[x] += d; x += lobit(x); } } void change(int u,int v,int w){ int f1 = top[u]; int f2 = top[v]; while(f1 != f2){ if(dep[f1] <dep[f2]){ swap(f1,f2); swap(u,v); } update(ti[f1],w); update(ti[u]+1,-w); u = father[f1];f1 = top[u]; } if(dep[u] > dep[v])swap(u,v); update(ti[u],w); update(ti[v]+1,-w); } int sum(int x){ int ans = 0; while(x>0){ ans += num[x]; x -= lobit(x); } return ans; } void add(int u,int v){ E[tp].v = v; E[tp].next = H[u].head; H[u].head = tp++; } void init(){ memset(E,-1,sizeof(E)); memset(H,-1,sizeof(H)); memset(num,0,sizeof(num)); tp = 0; idx = 1; } int findp(int x){ return sum(ti[x]); } int a[M]; int main(){ // freopen("input.txt","r",stdin); int m,p,u,v,w; while(scanf("%d%d%d",&n,&m,&p)==3){ init(); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } while(m -- ){ scanf("%d%d",&u,&v); add(u,v);add(v,u); } dfs_1(1,1); dfs_2(1,1); for(int i=1;i<=n;i++){ update(ti[i],a[i]); update(ti[i]+1,-a[i]); } char op[100]; while (p--){ scanf("%s%d",op,&u); if(op[0] == 'Q'){ printf("%d\n",sum(ti[u])); }else { scanf("%d%d",&v,&w); if(op[0] == 'D')w = -w; change(u,v,w); } } } }<span style="background-color: rgb(255, 0, 0);"> </span>
线段树版:
#pragma comment(linker,"/STACK:100000000,100000000") #include<cstdio> #include<cstring> #include<iostream> using namespace std; #define lson id << 1 #define rson id << 1 | 1 const int M = 50010; int a[M],top[M],ti[M],son[M],father[M],siz[M],dep[M]; int tp,idx; struct { int head; }H[M*2]; struct { int v,next; }E[M*4]; void add(int u,int v){ E[tp].v = v; E[tp].next = H[u].head; H[u].head = tp++; } void dfs_1(int u,int fa){ son[u] = 0;siz[u] =1;dep[u] = dep[fa] + 1;father[u] = fa; for(int i=H[u].head;i!=-1;i=E[i].next){ int v = E[i].v; if(v == fa)continue; dfs_1(v,u); siz[u] += siz[v]; if(siz[v] > siz[son[u]])son[u] = v; } } void dfs_2(int u,int fa){ ti[u] = ++idx;top[u] = fa; if(son[u])dfs_2(son[u],fa); for(int i=H[u].head;i!=-1;i=E[i].next){ int v = E[i].v; if(v == father[u]||v == son[u])continue; dfs_2(v,v); } } /* 线段树*/ struct Lintree{ int l,r,w,mark; int mid(){ return (l+r) / 2; } }node[M*4]; void build_tree(int id,int l,int r){ node[id].l = l; node[id].r = r; node[id].mark = 0; if(l == r)return; int mid = node[id].mid(); build_tree(lson,l,mid); build_tree(rson,mid+1,r); } void push_down(int id){ if(node[id].mark){ node[lson].mark += node[id].mark; node[rson].mark += node[id].mark; node[id].mark = 0; } } void update(int id,int l,int r,int w){ if(node[id].l == l && node[id].r == r){ // cout <<"dfasf -->" <<l<<"dfsf" <<r<<endl; node[id].mark+=w; return; } push_down(id); int mid = node[id].mid(); if(r <=mid)update(lson,l,r,w); else if(l > mid)update(rson,l,r,w); else { update(lson,l,mid,w); update(rson,mid+1,r,w); } } int query(int id,int x){ if(node[id].l == x&&node[id].r == x ){ // cout <<"<sdf>"<< node[id].w<<endl; return node[id].mark; } push_down(id); int mid = node[id].mid(); if(x <=mid)return query(lson,x); else return query(rson,x); } void change(int u,int v,int x){ // cout <<u<<"**"<<v<<endl; int f1 = top[u],f2 = top[v]; while(f1 != f2){ if(dep[f1] < dep[f2]){ swap(f1,f2); swap(u,v); } update(1,ti[f1],ti[u],x); u = father[f1];f1 = top[u]; } //if(u == v)return if(dep[u] > dep[v])swap(u,v); update(1,ti[u],ti[v],x); } void init(){ memset(E,-1,sizeof(E)); memset(H,-1,sizeof(H)); tp = idx = 0; } int main(){ int n,m,p,u,v,w; //freopen("input.txt","r",stdin); while(~scanf("%d%d%d",&n,&m,&p)){ init(); for(int i=1;i<=n;i++) scanf("%d",&a[i]); while(m--) { scanf("%d%d",&u,&v); add(u,v); add(v,u); } dfs_1(1,1); dfs_2(1,1); build_tree(1,1,n); char op[1000]; while(p--){ scanf("%s",op); if(op[0] == 'Q'){ scanf("%d",&u); printf("%d\n",query(1,ti[u])+a[u]); }else { scanf("%d%d%d",&u,&v,&w); if(op[0] == 'D') w = -w; change(u,v,w); } } } }
版权声明:本文博主原创文章。博客,未经同意不得转载。
时间: 2024-10-12 23:18:51