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 ...
随机推荐
- 使用xshell远程登录ubuntu使用vi编辑不能使用删除键方向键
近期安装了xshell,远程登录上ubuntu后,在插入模式下,按删除键没有任何反应,按方向键分别打印出A.B.C.D,每个字符一行. 这是因为ubuntu初始化安装的是vi的tiny版本,解决办法安 ...
- Git教程Git多人协作开发
Git可以完成两件事情: 1. 版本控制 2.多人协作开发 如今的项目,规模越来越大,功能越来越多,需要有一个团队进行开发. 如果有多个开发人员共同开发一个项目,如何进行协作的呢. Git提供了一个非 ...
- Android开发1——查找所需要出示权限的内容
一.发现问题 用户在执行一些如拨打电话.发送短信等关系用户隐私的功能时,Android需要出示权限,权限在AndroidManifest.xml中配置 拨打电话的权限 发送短信的权限 那么这些权限信息 ...
- WCF使用net.tcp绑定时的注意事项
IIS Express没有net.tcp绑定功能,本地测试的话只能使用本机的IIS进行承载,并且需要相应的配置(参见上一篇文章). 算了,直接举一个配置例子吧,懒得写了... <system.s ...
- 修改easyui的easyloader的默认css目录路径
easyloader默认情况下会使用js文件所在目录下的themes文件夹中的css,这里改成项目自定义的css文件夹. 首先找到: var m=src.match(/easyloader\.js(\ ...
- OpenGl学习 glenable()函数理解
glEnable用于启用各种功能.功能由参数决定.与glDisable相对应.glDisable是用来关闭的.两个函数参数取值是一至的. 参数说明:void glEnable(GLenum cap)G ...
- Webpack中的sourcemap
Webpack中sourcemap的配置 sourcemap是为了解决开发代码与实际运行代码不一致时帮助我们debug到原始开发代码的技术.尤其是如今前端开发中大部分的代码都经过编译,打包等工程化转换 ...
- CCEaseElasticOut调整速度和振幅
pSprite->setAnchorPoint(CCPoint(,)); pSprite->setPosition(CCPoint(,)); CCFiniteTimeAction* pAc ...
- ny220 推桌子
推桌子 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 The famous ACM (Advanced Computer Maker) Company has rent ...
- 08、通过自定义依赖属性,用 StateTrigger 修改全局主题样式
在 Win 10 的 UWP 中,需要在 xaml 中,通过使用 StateTrigger 修改全局的文本大小.Background.画刷等依赖属性等主题样式.下面只针对字体大小进行描述,其它依赖属性 ...