博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 3966 Aragorn's Story 树链剖分 按点
阅读量:5788 次
发布时间:2019-06-18

本文共 5526 字,大约阅读时间需要 18 分钟。

Aragorn's Story

Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 3494    Accepted Submission(s): 973

Problem Description
Our protagonist is the handsome human prince Aragorn comes from The Lord of the Rings. One day Aragorn finds a lot of enemies who want to invade his kingdom. As Aragorn knows, the enemy has N camps out of his kingdom and M edges connect them. It is guaranteed that for any two camps, there is one and only one path connect them. At first Aragorn know the number of enemies in every camp. But the enemy is cunning , they will increase or decrease the number of soldiers in camps. Every time the enemy change the number of soldiers, they will set two camps C1 and C2. Then, for C1, C2 and all camps on the path from C1 to C2, they will increase or decrease K soldiers to these camps. Now Aragorn wants to know the number of soldiers in some particular camps real-time.
 

 

Input
Multiple test cases, process to the end of input.
For each case, The first line contains three integers N, M, P which means there will be N(1 ≤ N ≤ 50000) camps, M(M = N-1) edges and P(1 ≤ P ≤ 100000) operations. The number of camps starts from 1.
The next line contains N integers A1, A2, ...AN(0 ≤ Ai ≤ 1000), means at first in camp-i has Ai enemies.
The next M lines contains two integers u and v for each, denotes that there is an edge connects camp-u and camp-v.
The next P lines will start with a capital letter 'I', 'D' or 'Q' for each line.
'I', followed by three integers C1, C2 and K( 0≤K≤1000), which means for camp C1, C2 and all camps on the path from C1 to C2, increase K soldiers to these camps.
'D', followed by three integers C1, C2 and K( 0≤K≤1000), which means for camp C1, C2 and all camps on the path from C1 to C2, decrease K soldiers to these camps.
'Q', followed by one integer C, which is a query and means Aragorn wants to know the number of enemies in camp C at that time.
 

 

Output
For each query, you need to output the actually number of enemies in the specified camp.
 

 

Sample Input
3 2 5
1 2 3
2 1
2 3
I 1 3 5
Q 2
D 1 2 2
Q 1 Q 3
 

 

Sample Output
7
4
8
Hint
1.The number of enemies may be negative. 2.Huge input, be careful.
 

 

Source
 

 

Recommend
We have carefully selected several similar problems for you:            
 
 
1 #pragma comment(linker,"/STACK:100000000,100000000")  2 #include
3 #include
4 #include
5 #include
6 using namespace std; 7 typedef __int64 LL; 8 const int maxn = 5e4+3; 9 10 int pos,cont; 11 int a[maxn]; 12 int son[maxn]; 13 int head[maxn]; 14 int vis[maxn]; 15 int w[maxn]; 16 int dep[maxn]; 17 int father[maxn]; 18 int hxl[maxn]; 19 int top[maxn]; 20 struct Edge 21 { 22 int to; 23 int next; 24 }edge[maxn*2]; 25 26 void init() 27 { 28 pos = cont = 0; 29 memset(son,-1,sizeof(son)); 30 memset(head,-1,sizeof(head)); 31 memset(hxl,0,sizeof(hxl)); 32 } 33 void addedge(int u,int v) 34 { 35 edge[cont].to = v; 36 edge[cont].next = head[u]; 37 head[u] = cont; 38 ++cont; 39 } 40 void dfs1(int u,int fre,int deep) 41 { 42 father[u] = fre; 43 dep[u] = deep; 44 vis[u] = 1; 45 for(int i=head[u];i!=-1;i=edge[i].next) 46 { 47 int v = edge[i].to; 48 if(v!=fre) 49 { 50 dfs1(v,u,deep+1); 51 vis[u]=vis[u]+vis[v]; 52 if(son[u] == -1 || vis[v] > vis[son[u]]) 53 son[u] = v; 54 } 55 } 56 } 57 void dfs2(int u,int t) 58 { 59 top[u] = t; 60 if(son[u]!=-1) 61 { 62 w[u]=++pos; 63 dfs2(son[u],t); 64 } 65 else 66 { 67 w[u]=++pos; 68 return; 69 } 70 for(int i=head[u];i!=-1;i=edge[i].next) 71 { 72 int v = edge[i].to; 73 if(v!=son[u] && v!=father[u]) 74 dfs2(v,v); 75 } 76 } 77 void add(int x,int n,int num1) 78 { 79 for(int i=x;i<=n;i=i+(i&(-i))) 80 hxl[i] = hxl[i] + num1; 81 } 82 LL query(int x) 83 { 84 if(x==0)return 0; 85 LL sum1 = 0; 86 while(x) 87 { 88 sum1=sum1+hxl[x]; 89 x=x-(x&(-x)); 90 } 91 return sum1; 92 } 93 void insert(int u,int v,int num1,int size1) 94 { 95 int topu=top[u],topv=top[v]; 96 while(topu!=topv) 97 { 98 if(dep[topu]
dep[v]) swap(u,v);109 add(w[u],pos,num1*size1);110 add(w[v]+1,pos,-1*num1*size1);111 }112 int main()113 {114 int n,m,q,u,v,l,r;115 while(scanf("%d%d%d",&n,&m,&q)>0)116 {117 init();118 for(int i=1;i<=n;i++)119 scanf("%d",&a[i]);120 for(int i=1;i<=m;i++)121 {122 scanf("%d%d",&u,&v);123 addedge(u,v);124 addedge(v,u);125 }126 addedge(0,1);127 addedge(1,0);128 dfs1(1,0,0);129 dfs2(1,1);130 char str1[6];131 while(q--)132 {133 scanf("%s",str1);134 if(str1[0]=='I')135 {136 scanf("%d%d%d",&l,&r,&v);137 insert(l,r,v,1);138 }139 else if(str1[0]=='D')140 {141 scanf("%d%d%d",&l,&r,&v);142 insert(l,r,v,-1);143 }144 else if(str1[0]=='Q')145 {146 scanf("%d",&r);147 printf("%I64d\n",query(w[r])+a[r]);148 }149 }150 }151 return 0;152 }

 

转载于:https://www.cnblogs.com/tom987690183/p/4072790.html

你可能感兴趣的文章
使用GitHub的十个最佳实践
查看>>
脱离“体验”和“安全”谈盈利的游戏运营 都是耍流氓
查看>>
慎用!BLEU评价NLP文本输出质量存在严重问题
查看>>
JAVA的优势就是劣势啊!
查看>>
ELK实战之logstash部署及基本语法
查看>>
帧中继环境下ospf的使用(点到点模式)
查看>>
BeanShell变量和方法的作用域
查看>>
LINUX下防恶意扫描软件PortSentry
查看>>
由数据库对sql的执行说JDBC的Statement和PreparedStatement
查看>>
springmvc+swagger2
查看>>
软件评测-信息安全-应用安全-资源控制-用户登录限制(上)
查看>>
我的友情链接
查看>>
Java Web Application 自架构 一 注解化配置
查看>>
如何 debug Proxy.pac文件
查看>>
Python 学习笔记 - 面向对象(特殊成员)
查看>>
Kubernetes 1.11 手动安装并启用ipvs
查看>>
Puppet 配置管理工具安装
查看>>
Bug多,也别乱来,别被Bug主导了开发
查看>>
sed 替换基础使用
查看>>
高性能的MySQL(5)创建高性能的索引一B-Tree索引
查看>>