2016"百度之星" - 初赛(Astar Round2A)1003(hdu5692)dfs序+线段树
来源:互联网 发布:windows平板电脑论坛 编辑:程序博客网 时间:2024/06/04 19:34
题目链接:点这里!!!!
题意:中文题。
题解:
我们记录dis[x]表示0~x的路径长度。
如果我们修改x的权值,x的子树全部都要修改,我们利用dfs序的话,我们相当于给一个区间的值加上某个值;然后询问的x的子树谁的权值最大,相当于区间询问最大值,我们用线段树维护下就可以了。
代码:
#include<cstdio>#include<cstring>#include<iostream>#include<sstream>#include<algorithm>#include<vector>#include<bitset>#include<set>#include<queue>#include<stack>#include<map>#include<cstdlib>#include<cmath>#define LL long long#define pb push_back#define pa pair<int,int>#define clr(a,b) memset(a,b,sizeof(a))#define lson lr<<1,l,mid#define rson lr<<1|1,mid+1,r#define bug(x) printf("%d++++++++++++++++++++%d\n",x,x)#define key_value ch[ch[root][1]][0]#pragma comment(linker, "/STACK:102400000000,102400000000")const LL MOD = 1000000007;const int N = 1e5+15;const int maxn = 8e3+15;const int letter = 130;const LL INF = 1e18;const double pi=acos(-1.0);const double eps=1e-10;using namespace std;inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}int n,q;int tot,head[N],num_node;int l[N],r[N],dfn[N],a[N];LL ans[N<<2],mark[N<<2];LL dis[N];struct edges{ int to,next;}e[N<<1];void init(){ num_node=tot=0,clr(head,-1);}void addedges(int u,int v){ e[tot].to=v,e[tot].next=head[u],head[u]=tot++;}void dfs(int x,int fa){ l[x]=++num_node; dfn[num_node]=x; for(int i=head[x];i!=-1;i=e[i].next){ int to=e[i].to; if(to==fa) continue; dis[to]+=dis[x]; dfs(to,x); } r[x]=num_node;}void pushup(int lr){ ans[lr]=max(ans[lr<<1],ans[lr<<1|1]);}void pushdown(int lr){ if(mark[lr]){ ans[lr<<1]+=mark[lr],ans[lr<<1|1]+=mark[lr]; mark[lr<<1]+=mark[lr],mark[lr<<1|1]+=mark[lr]; mark[lr]=0; }}void build(int lr,int l,int r){ mark[lr]=0; if(l==r) { ans[lr]=dis[dfn[l]]; return; } int mid=(l+r)>>1; build(lson); build(rson); pushup(lr);}void update(int ll,int rr,int v,int lr,int l,int r){ if(ll<=l&&r<=rr){ ans[lr]+=(LL)v; mark[lr]+=(LL)v; return; } pushdown(lr); int mid=(l+r)>>1; if(ll<=mid) update(ll,rr,v,lson); if(rr>mid) update(ll,rr,v,rson); pushup(lr);}LL query(int ll,int rr,int lr,int l,int r){ if(ll<=l&&r<=rr){ return ans[lr]; } pushdown(lr); int mid=(l+r)>>1; LL max1=-INF; if(ll<=mid) max1=max(max1,query(ll,rr,lson)); if(rr>mid) max1=max(max1,query(ll,rr,rson)); return max1;}int main(){ int T,cas=0,id,x,y; scanf("%d",&T); while(T--){ printf("Case #%d:\n",++cas); init(); scanf("%d%d",&n,&q); for(int i=0;i<n-1;i++){ scanf("%d%d",&x,&y); addedges(x,y); addedges(y,x); } for(int i=0;i<n;i++) scanf("%I64d",dis+i),a[i]=(int)dis[i]; dfs(0,-1); build(1,1,n); while(q--){ scanf("%d%d",&id,&x); if(id==1){ printf("%I64d\n",query(l[x],r[x],1,1,n)); } else { scanf("%d",&y); update(l[x],r[x],y-a[x],1,1,n); a[x]=y; } } } return 0;}
0 0
- 2016"百度之星" - 初赛(Astar Round2A)1003(hdu5692)dfs序+线段树
- 2016"百度之星" - 初赛(Astar Round2A) 1003 【dfs序+线段树】
- 2016"百度之星" - 初赛(Astar Round2A)解题报告
- [Contest] 2016"百度之星" - 初赛(Astar Round2A)
- 2016"百度之星" - 初赛(Astar Round2A)
- 2016"百度之星" - 初赛(Astar Round2A)题解
- 2016"百度之星" - 初赛(Astar Round2A)题解
- 2016"百度之星" - 初赛(Astar Round2A)
- 2016百度之星 - 初赛(Astar Round2A)题解
- 2016"百度之星" - 初赛(Astar Round2A)解题报告
- 2016"百度之星" - 初赛(Astar Round2A)
- 2016"百度之星" - 初赛(Astar Round2A) 1002
- 2016"百度之星" - 初赛(Astar Round2A)
- 2016"百度之星" - 初赛(Astar Round2A)1001~1006
- 【图论+线段树】[2016"百度之星" - 初赛(Astar Round2A)]Snacks
- 2016"百度之星" - 初赛(Astar Round2A) 1001 All X(数论知识)
- 2016"百度之星" - 初赛(Astar Round2A)1001 All X (模)
- 2016"百度之星" - 初赛(Astar Round2A)1006 Gym Class(优先队列+拓扑排序)
- 2016/5/21 1005. 设置输出的flag
- 关于qsort的使用
- Linux 文本编辑工具vim
- POJ 2955Brackets(区间DP)
- Unity摄像机 向指定位置移动旋转 C#脚本
- 2016"百度之星" - 初赛(Astar Round2A)1003(hdu5692)dfs序+线段树
- Activity生命周期中我们可以做些什么?
- sdut 3256 BIGZHUGOD and His Friends II
- 2016.5.2模拟赛总结
- HDU 5336 XYZ and Drops
- ElasticSearch备份快照到HDFS-2.6(CDH5.6.0)
- (二)洞悉linux下的Netfilter&iptables:内核中的ip_tables小觑
- cocos2dx如何简单判断一个点在旋转的矩形上
- 学会自己测天气之八卦基础---04