hdu 5044 树区间操作最后输出/ lca+dfs
题意:一棵树,俩种操作:1 有路径上的全部点加vi,2全部边加vi。
先离线求出全部询问的lca,再遍历询问一次,点+vi,lca-2*vi ,最后dfs从叶子扫上来一次,最后再祖先点补上就可以。用了输入挂。
复杂度(n+m).
- #pragma comment(linker,"/STACK:10240000000000,10240000000000")
- #include<iostream>
- #include<cstdio>
- #include<cstdlib>
- using namespace std;
- const int maxv=100005,maxe=200015;
- int head[maxv];int nume=0;long long e[maxe][3];
- void inline adde(int i,int j) //边
- {
- e[nume][0]=j;e[nume][1]=head[i];head[i]=nume;
- e[nume++][2]=0;
- e[nume][0]=i;e[nume][1]=head[j];head[j]=nume;
- e[nume++][2]=0;
- }
- int headq[maxv];int numq=0;long long q[maxe][5];
- void inline addq(int x,int y,long long vals,int flag) //询问
- {
- q[numq][0]=y;q[numq][1]=headq[x];headq[x]=numq;
- q[numq][2]=-1;q[numq][3]=vals;q[numq++][4]=flag;
- q[numq][0]=x;q[numq][1]=headq[y];headq[y]=numq;
- q[numq][2]=-1;q[numq][3]=vals;q[numq++][4]=flag;
- }
- int fa[maxv];
- int find(int x)
- {
- if(x!=fa[x])
- return fa[x]=find(fa[x]);
- return fa[x];
- }
- int ve[maxv];
- int n,m;
- int vis[maxv];int vis2[maxv];
- long long val[maxv];
- int ise[maxe];
- void tarjan(int u,int father) //离线求lca
- {
- for(int j=head[u];j!=-1;j=e[j][1])
- {
- int v=e[j][0];
- if(!vis[v]&&v!=father)
- {
- ve[v]=j;
- ise[j]=1;
- tarjan(v,u);
- fa[v]=u;
- }
- }
- vis[u]=1;
- for(int j=headq[u];j!=-1;j=q[j][1])
- {
- if(vis[q[j][0]])
- {
- q[j^1][2]=q[j][2]=find(q[j][0]);
- }
- }
- }
- void dfs(int u) //求出全部点边情况
- {
- for(int j=head[u];j!=-1;j=e[j][1])
- {
- int v=e[j][0];
- if(!vis2[v])
- {
- vis2[v]=1;
- dfs(v);
- val[u]+=val[v];
- e[ve[u]][2]+=e[ve[v]][2];
- }
- }
- }
- int vis_e[maxe];
- long long anster[maxv];
- void init()
- {
- nume=numq=0;
- for(int i=0;i<maxv;i++)
- {
- head[i]=headq[i]=-1;
- fa[i]=i;
- val[i]=vis2[i]=vis[i]=0;
- ve[i]=2*n;
- anster[i]=0;
- }
- for(int i=0;i<maxe;i++)
- {
- ise[i]=0;
- vis_e[i]=0;
- }
- }
- template <class T> //输入挂
- inline bool scan(T &ret) {
- char c; int sgn;
- if(c=getchar(),c==EOF) return 0; //EOF
- while(c!='-'&&(c<'0'||c>'9')) c=getchar();
- sgn=(c=='-')?-1:1;
- ret=(c=='-')?0:(c-'0');
- while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
- ret*=sgn;
- return 1;
- }
- /*inline void prints(long long x) {
- if(x>9) prints(x/10);
- putchar(x%10+'0');
- }*/
- int main()
- {
- int T;int cnt=1;
- scan(T);
- //scanf("%d",&T);
- while(T--)
- {
- //scanf("%d%d",&n,&m);
- scan(n);scan(m);
- init();
- int aa,bb,cc;
- for(int i=0;i<n-1;i++)
- {
- // scanf("%d%d",&aa,&bb);
- scan(aa);scan(bb);
- adde(aa,bb);
- }
- int tx;
- for(int i=0;i<m;i++)
- {
- getchar();getchar();getchar();//getchar();
- //scanf("ADD");
- scan(tx);
- scan(aa);scan(bb);scan(cc);
- // scanf("%d%d%d%d",&tx,&aa,&bb,&cc);
- if(tx==1)
- addq(aa,bb,cc,1);
- else
- addq(aa,bb,cc,0);
- }
- tarjan(n/2+1,-1);
- for(int i=1;i<=n;i++)
- for(int j=headq[i];j!=-1;j=q[j][1])
- {
- if(!vis_e[j])
- {
- vis_e[j]=vis_e[j^1]=1;
- if(q[j][4])
- {
- val[i]+=q[j][3];
- val[q[j][0]]+=q[j][3];
- val[q[j][2]]-=q[j][3]*2;
- anster[q[j][2]]+=q[j][3];
- }
- else
- {
- e[ve[i]][2]+=q[j][3];
- e[ve[q[j][0]]][2]+=q[j][3];
- e[ve[q[j][2]]][2]-=2*q[j][3];
- }
- }
- }
- vis2[n/2+1]=1;
- dfs(n/2+1);
- printf("Case #%d:\n",cnt++);
- for(int i=1;i<n;i++)
- printf("%I64d ",val[i]+anster[i]);
- printf("%I64d\n",val[n]+anster[n]);
- for(int j=0;j<nume;j++)
- if(ise[j])
- {
- if(j==nume-2||j==nume-1)printf("%I64d",e[j][2]);
- else printf("%I64d ",e[j][2]);
- }
- puts("");
- }
- return 0;
- }
hdu 5044 树区间操作最后输出/ lca+dfs的更多相关文章
- HDU 4578——Transformation——————【线段树区间操作、确定操作顺序】
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others)T ...
- POJ 3225 Help with Intervals --线段树区间操作
题意:给你一些区间操作,让你输出最后得出的区间. 解法:区间操作的经典题,借鉴了网上的倍增算法,每次将区间乘以2,然后根据区间开闭情况做微调,这样可以有效处理开闭区间问题. 线段树维护两个值: cov ...
- Bzoj 1798: [Ahoi2009]Seq 维护序列seq(线段树区间操作)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小可 ...
- 吉首大学校赛 K 白山茶与红玫瑰 (线段树区间操作)
链接:https://ac.nowcoder.com/acm/contest/925/K来源:牛客网 题目描述 公元2019年6月22日,白山茶王国与红玫瑰王国展开大战,在世外仙境——天空花园处,双方 ...
- POJ 2528 ——Mayor's posters(线段树+区间操作)
Time limit 1000 ms Memory limit 65536 kB Description The citizens of Bytetown, AB, could not stand t ...
- HDU - 6315(2018 Multi-University Training Contest 2) Naive Operations (线段树区间操作)
http://acm.hdu.edu.cn/showproblem.php?pid=6315 题意 a数组初始全为0,b数组为1-n的一个排列.q次操作,一种操作add给a[l...r]加1,另一种操 ...
- hdu 4902 Nice boat(线段树区间改动,输出终于序列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 Problem Description There is an old country and ...
- L - Vases and Flowers - hdu 4614(区间操作)
题意:有两种操作,第一种从A开始插花,如果有花就跳到下一个,然后输出最后一个花瓶的编号,如果花瓶不够把多余的花丢掉.操作2把区间清空 分析:很明显的线段树操作,就是插花的时候麻烦一下,需要先找出来他剩 ...
- 线段树(区间操作) POJ 3325 Help with Intervals
题目传送门 题意:四种集合的操作,对应区间的01,问最后存在集合存在的区间. 分析:U T [l, r]填充1; I T [0, l), (r, N]填充0; D T [l, r]填充0; C T[0 ...
随机推荐
- 使用perldoc阅读perl文档
perl在安装的时候,就给我们送上一份大礼,组织精美,解释详细的perl百科全书已经安装在你的电脑里面了,遇到问题不要在去搜索那些博客了,还是练练英文,看看perldoc吧,呵呵. 1.用perldo ...
- Linux下C++连MySQL数据库
1.查看本地有没有安装mysql,命令就是mysql,如果有这个命令就表示安装了mysql数据库软件.如果没有就自行安装. MySQL-server-4.0.16-0.i386.rpm MySQL-c ...
- JSP页面最终是编译为Servlet执行的
JSP页面最终是编译为Servlet执行的,你可以在Tomcat的%CATALINA_HOME%/work/Catalina/localhost中找到一个文件夹,该文件夹跟你的web-project的 ...
- 在Eclipse中给JRE-Library添加本地Javadoc
Eclipse中的JRE-Library的Javadoc默认是一个URL,指向oracle的一个web-page,那你在离线的时候就无法使用了,为了解决这个问题,你可以从oracle下载JDK-Spe ...
- spring报错:Caused by: java.lang.IllegalStateException: Cannot convert value of type for property : no matching editors or conversion strategy found
原因分析:是因为类返回的类型跟期望的类型没有继承关系,返回的类型就SqlMapClient,它是通过实现了FactoryBean<SqlMapClient>接口的SqlMapClientF ...
- C++14尝鲜:Generic Lambdas(泛型lambda)
所谓泛型lambda.就是在形參声明中使用auto类型指示说明符的lambda. 比方 auto lambda = [](auto x, auto y) {return x + y;}; 依据C++1 ...
- 【C#/WPF】Button按钮动态设置Background背景颜色
学习笔记: 在XAML中给Button设置颜色大家都懂的,本篇只是记录用C#代码动态生成的按钮设置Background背景颜色. new一个Button,设置Background时可看到该属性类型是S ...
- 利用GDB对程序进行调试
第一章初涉调试会话 调试工具 GDB,Unix下最常用的调试工具 DDD,基于GUI的调试器,大多数工具都是GDB的GUI前端. Eclipse,IDE也是一种调试工具 atoi( )把字符串变为整数 ...
- C语言 · 寂寞的数
算法训练 寂寞的数 时间限制:1.0s 内存限制:256.0MB 问题描述 道德经曰:一生二,二生三,三生万物. 对于任意正整数n,我们定义d(n)的值为为n加上组成n的各个数字的和 ...
- C语言 · 求指数
算法训练 5-2求指数 时间限制:1.0s 内存限制:256.0MB 问题描述 已知n和m,打印n^1,n^2,...,n^m.要求用静态变量实现.n^m表示n的m次方.已知n和m, ...