标签:修改 blank tar stack color case ring print init
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2165 Accepted Submission(s): 513
1 #pragma comment(linker, "/STACK:1024000000,1024000000") 2 #include<cstdio> 3 #include<iostream> 4 #include<cstring> 5 #define clr(x) memset(x,0,sizeof(x)) 6 #define clr_1(x) memset(x,-1,sizeof(x)) 7 #define LL long long 8 #define INF (1e18) 9 using namespace std; 10 struct edg 11 { 12 int next,to; 13 }edge[100010<<2]; 14 struct seg 15 { 16 int l,r; 17 LL maxn,tag; 18 }segt[100010<<2]; 19 int head[100010],dfstm[100010],pre[100010],last[100010],n,m,k,u,v,s,T,cnt; 20 LL value[100010],sum[100010],x; 21 LL max(LL a, LL b) 22 { 23 return a>b?a:b; 24 } 25 void addedge(int u,int v) 26 { 27 edge[++cnt].to=v; 28 edge[cnt].next=head[u]; 29 head[u]=cnt; 30 return ; 31 } 32 void dfs(int i,int fa) 33 { 34 sum[i]=sum[fa]+value[i]; 35 dfstm[++k]=i; 36 pre[i]=k; 37 for(int j=head[i];j!=-1;j=edge[j].next) 38 if(edge[j].to!=fa) 39 dfs(edge[j].to,i); 40 last[i]=k; 41 return ; 42 } 43 void init(int i,int l,int r) 44 { 45 segt[i]=(seg){l,r,0,0}; 46 if(l==r) 47 { 48 segt[i].maxn=sum[dfstm[l]]; 49 return; 50 } 51 int mid=(l+r)>>1; 52 init(i<<1,l,mid); 53 init(i<<1|1,mid+1,r); 54 segt[i].maxn=max(segt[i<<1].maxn,segt[i<<1|1].maxn); 55 return ; 56 } 57 void pushdown(int i) 58 { 59 if(segt[i].tag!=0) 60 { 61 if(segt[i].l!=segt[i].r) 62 { 63 segt[i<<1].maxn+=segt[i].tag; 64 segt[i<<1|1].maxn+=segt[i].tag; 65 segt[i<<1].tag+=segt[i].tag; 66 segt[i<<1|1].tag+=segt[i].tag; 67 } 68 segt[i].tag=0; 69 } 70 return ; 71 } 72 void update(int i,int l,int r,LL addval) 73 { 74 if(segt[i].l>=l && segt[i].r<=r) 75 { 76 segt[i].tag+=addval; 77 segt[i].maxn+=addval; 78 return ; 79 } 80 pushdown(i); 81 int mid=(segt[i].l+segt[i].r)>>1; 82 if(mid>=r) 83 { 84 update(i<<1,l,r,addval); 85 } 86 else if(mid<l) 87 { 88 update(i<<1|1,l,r,addval); 89 } 90 else 91 { 92 update(i<<1,l,r,addval); 93 update(i<<1|1,l,r,addval); 94 } 95 segt[i].maxn=max(segt[i<<1].maxn,segt[i<<1|1].maxn); 96 return ; 97 } 98 LL query(int i,int l,int r) 99 { 100 if(segt[i].l>=l && segt[i].r<=r) 101 { 102 return segt[i].maxn; 103 } 104 pushdown(i); 105 int mid=(segt[i].l+segt[i].r)>>1; 106 LL ans=-INF; 107 if(mid>=r) 108 { 109 ans=max(ans,query(i<<1,l,r)); 110 } 111 else if(mid<l) 112 { 113 ans=max(ans,query(i<<1|1,l,r)); 114 } 115 else 116 { 117 ans=max(ans,query(i<<1,l,r)); 118 ans=max(ans,query(i<<1|1,l,r)); 119 } 120 segt[i].maxn=max(segt[i<<1].maxn,segt[i<<1|1].maxn); 121 return ans; 122 } 123 int main() 124 { 125 scanf("%d",&T); 126 for(int kase=1;kase<=T;kase++) 127 { 128 clr_1(head); 129 clr(sum); 130 cnt=0; 131 k=0; 132 printf("Case #%d:\n",kase); 133 scanf("%d%d",&n,&m); 134 for(int i=1;i<n;i++) 135 { 136 scanf("%d%d",&u,&v); 137 addedge(u,v); 138 addedge(v,u); 139 } 140 for(int i=0;i<n;i++) 141 { 142 scanf("%lld",&value[i]); 143 } 144 dfs(0,0); 145 init(1,1,n); 146 for(int i=1;i<=m;i++) 147 { 148 scanf("%d",&k); 149 if(k) 150 { 151 scanf("%d",&u); 152 printf("%lld\n",query(1,pre[u],last[u])); 153 } 154 else 155 { 156 scanf("%d%lld",&u,&x); 157 update(1,pre[u],last[u],x-value[u]); 158 value[u]=x; 159 } 160 } 161 } 162 return 0; 163 }
标签:修改 blank tar stack color case ring print init
原文地址:http://www.cnblogs.com/wujiechao/p/6725626.html