博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3237 Tree
阅读量:6803 次
发布时间:2019-06-26

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

Tree
Time Limit: 5000MS   Memory Limit: 131072K
Total Submissions: 3836   Accepted: 1088

Description

You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edges are numbered 1 through N − 1. Each edge is associated with a weight. Then you are to execute a series of instructions on the tree. The instructions can be one of the following forms:

CHANGE i v Change the weight of the ith edge to v
NEGATE a b Negate the weight of every edge on the path from a to b
QUERY a b Find the maximum weight of edges on the path from a to b

Input

The input contains multiple test cases. The first line of input contains an integer t (t ≤ 20), the number of test cases. Then follow the test cases.

Each test case is preceded by an empty line. The first nonempty line of its contains N (N ≤ 10,000). The next N − 1 lines each contains three integers a, b and c, describing an edge connecting nodes a and b with weight c. The edges are numbered in the order they appear in the input. Below them are the instructions, each sticking to the specification above. A lines with the word “DONE” ends the test case.

Output

For each “QUERY” instruction, output the result on a separate line.

Sample Input

131 2 12 3 2QUERY 1 2CHANGE 1 3QUERY 1 2DONE

Sample Output

13

树链剖分~

然后注意一下 有n-1条边。。每条边要addedge 两次 然后,注意一下空间开两倍就可以了。否则RE

只要记录最小最大值。

取反的时候把最小最大交换一下  ,然后在取负就可以了

还有lazy更新那个取反

pushdown的时候要注意一下把孩子的lazy取反

 

 

 

 

#include 
#include
#include
#include
using namespace std;#define root 1,n,1#define lr rt<<1#define rr rt<<1|1#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1const int inf=1e9;const int N=20010;struct node{ int u,v,w;}e[N];int n;int top[N],rnk[N],fa[N],p[N],son[N],siz[N],dep[N],pos;int eh[N],et[N],nxt[N],tot;void init(){ memset(eh,-1,sizeof eh); memset(son,-1,sizeof son); pos=1; tot=0;}void addedge(int u,int v){ et[tot]=v;nxt[tot]=eh[u];eh[u]=tot++; et[tot]=u;nxt[tot]=eh[v];eh[v]=tot++;}void dfs1(int u,int father,int d){ fa[u]=father; dep[u]=d; siz[u]=1; for(int i=eh[u]; ~i ;i=nxt[i]){ int v=et[i]; if( v==fa[u] )continue; dfs1( v,u,d+1 );      siz[u] += siz[v] ; if( son[u]==-1 || siz[v] > siz[ son[u] ] ) son[u]=v; }}void dfs2(int u,int tp){ top[u]=tp; p[u]=pos++; rnk[ p[u] ]=u; if( son[u] == -1 ) return ; dfs2( son[u],tp ); for(int i=eh[u]; ~i ;i=nxt[i] ){ int v=et[i]; if( v==fa[u] || v==son[u] )continue; dfs2(v,v); }}//-----------------------------------int d_m[N<<2],d_M[N<<2];bool lazy[N<<2];void build(int l,int r,int rt){ d_m[rt]=d_M[rt]=lazy[rt]=0; if(l==r){
return ;} int mid=(l+r)>>1; build(lson); build(rson);}void Up(int rt){ d_m[rt]=min( d_m[lr],d_m[rr] ); d_M[rt]=max( d_M[lr],d_M[rr] );}void Down(int l,int r,int rt){ if(l==r)return ; if( lazy[rt] ) { swap(d_m[rr],d_M[rr]); d_M[rr] = -d_M[rr]; d_m[rr] = -d_m[rr]; lazy[rr] ^= 1; swap(d_m[lr],d_M[lr]); d_M[lr] = -d_M[lr]; d_m[lr] = -d_m[lr]; lazy[lr] ^= 1; lazy[rt]=0; }}void update(int l,int r,int rt,int x,int v){ if(l==r){ d_m[rt]=d_M[rt]=v;lazy[rt]=0; return ; } Down(l,r,rt); int mid=(l+r) >> 1; if(x <= mid ) update(lson,x,v); else update(rson,x,v); Up(rt);}int query(int l,int r,int rt,int L,int R){ int res = -inf; if(L <= l && r<=R ){ return d_M[rt]; } Down(l,r,rt); int mid=(l+r)>>1; if( L <= mid )res=max( res,query(lson,L,R) ); if( R > mid )res=max( res,query(rson,L,R) ); return res;}void nega(int l,int r,int rt,int L,int R){ if( L <= l && r<= R ){ swap(d_m[rt],d_M[rt]); d_M[rt] = -d_M[rt]; d_m[rt] = -d_m[rt]; lazy[rt] ^= 1; return ; } Down(l,r,rt); int mid=(l+r) >> 1; if( L <= mid ) nega(lson,L,R); if( R > mid ) nega(rson,L,R); Up(rt);}int Q(int u,int v){ int res = -inf; int f1=top[u],f2=top[v]; while(f1 != f2){ if(dep[f1] < dep[f2]){ swap(f1,f2); swap(u,v); } res=max(res,query(root,p[f1],p[u])); u = fa[ f1 ]; f1 = top[ u ]; } if( u == v )return res; if( dep[u] > dep[v] )swap(u,v); return max( res , query( root,p[ son[u] ] ,p[v] ) );}void NE(int u,int v){ int f1=top[u],f2=top[v]; while(f1 != f2){ if(dep[f1] < dep[f2]){ swap(f1,f2); swap(u,v); } nega(root,p[f1],p[u]); u = fa[ f1 ]; f1 = top[ u ]; } if( u == v )return ; if( dep[u] > dep[v] )swap(u,v); nega( root,p[ son[u] ] ,p[v]) ;}void run(){ char op[10]; int x,y,v; init(); scanf("%d",&n); for(int i=1;i
< n ;++i){ if( dep[e[i].u] > dep[ e[i].v] )swap(e[i].u,e[i].v); update(root,p[ e[i].v ],e[i].w); } while(scanf("%s",op)){ if(op[0] == 'D')break; scanf("%d%d",&x,&y); if(op[0]=='C'){ update( root, p[ e[ x ].v ] , y ); } else if(op[0]=='Q'){ printf("%d\n",Q(x,y)); } else { NE(x,y); } }}int main(){ int _; #ifdef LOCAL freopen("in.txt","r",stdin); #endif scanf("%d",&_); while(_--)run(); return 0;}

 

转载于:https://www.cnblogs.com/hlmark/p/3933962.html

你可能感兴趣的文章
教师节有“假期” 网络电话传递温情祝福
查看>>
中天携手协鑫集成共拓光伏市场
查看>>
云存储与视频监控协力合作 平安城市再提速
查看>>
Windows环境搭建Web自动化测试框架Watir
查看>>
再等两年 英特尔能否重回摩尔定律?
查看>>
智慧城市建设 这五个方面不可不考虑
查看>>
Qt之镜像旋转
查看>>
《Cinema 4D + After Effects动态图形设计案例解析》——第 1 章 动态图形设计概述 1.1 什么是动态图形...
查看>>
WordPress REST API 内容注入/权限提升漏洞
查看>>
深圳网站建设公司|网站文章不收录的四大决定性因素|卓炎科技
查看>>
《实施Cisco统一通信管理器(CIPT1)》一第2章 部署模型
查看>>
《SolidWorks 2013中文版完全自学手册》——2.4 尺寸标注
查看>>
《Adobe Photoshop CS4中文版经典教程》—第1课1.4节在Photoshop中还原操作
查看>>
《IPv6精髓(第2版)》——3.8 链路本地地址和站点本地地址
查看>>
《深入浅出iPhone/iPad开发(第2版)》——使用GUI编辑器连接UI控制到代码
查看>>
【秒懂设计模式】总述及工厂模式
查看>>
《数据科学:R语言实现》——3.10 重塑数据
查看>>
《抓住听众心理——演讲者要知道的100件事》一16.时间是相对的
查看>>
运维前线:一线运维专家的运维方法、技巧与实践1.8 运维自动化依赖的团队模型...
查看>>
《树莓派渗透测试实战》——第1章 树莓派和Kali Linux基础知识
查看>>