【POJ】【P3237】【Tree】【题解】【树链剖分+线段树】
来源:互联网 发布:ubuntu使用搜狗输入法 编辑:程序博客网 时间:2024/04/30 08:53
传送门:poj.org/problem?id=3237
最近刷数据结构刷上瘾了??天天刷链剖= = 、 (该学学LCT了……)
Code:
#include<cstdio>#include<cstring>#include<vector>#include<iostream>#include<algorithm>#include<climits>#define lson i<<1,l,mid#define rson i<<1|1,mid+1,r#define L i<<1#define R i<<1|1#define Clear(x) memset(x,0,sizeof(x))using namespace std;int n;const int maxn=10200;int rw[maxn],vis2[maxn],w[maxn],dep[maxn],vis[maxn],fa[maxn],son[maxn],siz[maxn],top[maxn],z,sor[maxn];typedef pair<int,int> pii;pii edges[maxn];vector<pii>G[maxn];void add(int u,int v,int w){G[u].push_back(pii(v,w));G[v].push_back(pii(u,w));}int getint(){int res=0,ok=0,f=1;char ch;while(1){ch=getchar();if(ch=='-'){f*=-1;continue;}if(ch<='9'&&ch>='0'){res*=10;res+=ch-'0';ok=1;}else if(ok)break;}return res*f;}struct node{int maxx,minn,lazy;void init(){maxx=INT_MIN,minn=INT_MAX,lazy=0;}};node t[maxn<<2];struct seg_tree{void pushdown(int i){if(!t[i].lazy)return;int maxx=t[L].maxx,minn=t[L].minn;t[L].maxx=-minn;t[L].minn=-maxx;t[L].lazy^=1;maxx=t[R].maxx;minn=t[R].minn;t[R].maxx=-minn;t[R].minn=-maxx;t[R].lazy^=1;t[i].lazy^=1;}void maintain(int i){//if(!vis2[L]){//vis2[L]=1;t[L].init();//}//if(!vis2[R]){//vis2[R]=1;t[R].init();//}t[i].maxx=max(t[L].maxx,t[R].maxx);t[i].minn=min(t[L].minn,t[R].minn);}void Change(int i,int l,int r,int pos,int val){if(l==r){//if(!vis2[i]){//vis2[i]=1;t[i].init();//}t[i].maxx=t[i].minn=val;t[i].lazy=0;return;}//if(!vis2[i]){//vis2[i]=1;t[i].init();//vis2[L]=vis2[R]=1;//t[L].init();t[R].init();//}pushdown(i);int mid=(l+r)>>1;if(pos<=mid)Change(lson,pos,val);else Change(rson,pos,val);maintain(i);}void Negate(int i,int l,int r,int l0,int r0){if(l0<=l&&r0>=r){int maxx=t[i].maxx,minn=t[i].minn;t[i].maxx=-minn;t[i].minn=-maxx;t[i].lazy^=1;return;}pushdown(i);int mid=(l+r)>>1;if(l0<=mid)Negate(lson,l0,r0);if(r0>mid )Negate(rson,l0,r0);maintain(i);}int qmax(int i,int l,int r,int l0,int r0){if(l0<=l&&r0>=r){return t[i].maxx;}pushdown(i);int mid=(l+r)>>1,ans=INT_MIN;if(l0<=mid)ans=max(ans,qmax(lson,l0,r0));if(r0>mid) ans=max(ans,qmax(rson,l0,r0));return ans;}void debb(){for(int i=1;i<=15;i++)cout<<i<<" "<<t[i].maxx<<" "<<t[i].minn<<" "<<t[i].lazy<<endl;}}T;void dfs(int u){son[u]=0;siz[u]=1;for(int i=0;i<G[u].size();i++){int v=G[u][i].first;if(fa[u]!=v){dep[v]=dep[u]+1;fa[v]=u;dfs(v);if(siz[son[u]]<siz[v])son[u]=v;siz[u]+=siz[v];}}}void Change(int u,int val){if(w[u]!=1)T.Change(1,1,n,w[u],val);}void build(int u,int W,int tp){w[u]=++z;Change(u,W);top[u]=tp;if(son[u])for(int i=0;i<G[u].size();i++)if(G[u][i].first==son[u])build(G[u][i].first,G[u][i].second,tp);for(int i=0;i<G[u].size();i++){int v=G[u][i].first;if(v!=fa[u]&&v!=son[u]){build(v,G[u][i].second,v);}}}void Negate(int u,int v){while(top[u]!=top[v]){if(dep[top[u]]>dep[top[v]]){int a=w[u],b=w[top[u]];if(a>b)swap(a,b);T.Negate(1,1,n,a,b);u=fa[top[u]];}else{int a=w[v],b=w[top[v]];if(a>b)swap(a,b);T.Negate(1,1,n,a,b);v=fa[top[v]];}}int a=w[u],b=w[v];if(a>b)swap(a,b);if(a!=b)T.Negate(1,1,n,a+1,b);}int qmax(int u,int v){int ans=INT_MIN;while(top[u]!=top[v]){if(dep[top[u]]>dep[top[v]]){int a=w[u],b=w[top[u]];if(a>b)swap(a,b);ans=max(ans,T.qmax(1,1,n,a,b));u=fa[top[u]];}else{int a=w[v],b=w[top[v]];if(a>b)swap(a,b);ans=max(ans,T.qmax(1,1,n,a,b));v=fa[top[v]];}}int a=w[u],b=w[v];if(a>b)swap(a,b);if(a!=b)ans=max(ans,T.qmax(1,1,n,a+1,b));return ans;}int main(){int TT=getint();while(TT--){Clear(edges);Clear(vis2);Clear(vis);Clear(w);Clear(dep);Clear(fa);Clear(son);Clear(siz);Clear(top);Clear(sor);Clear(t);n=getint();z=0;//sor[0]=INT_MIN;for(int i=1;i<=n;i++)G[i].clear();for(int i=1;i<=(n<<2);i++)t[i].init();for(int i=1;i<n;i++){int u=getint(),v=getint(),w=getint();add(u,v,w);edges[i].first=u;edges[i].second=v;}dfs(1);build(1,INT_MIN,1);//T.debb();char opt[22];int fuck=0;//n--;while(scanf("%s",opt)==1){switch(opt[0]){case 'D':{fuck=1;break;}case 'Q':{int u=getint(),v=getint();printf("%d\n",qmax(u,v));break;}case 'C':{int u=getint(),val=getint();if(dep[edges[u].first]>dep[edges[u].second])u=edges[u].first;elseu=edges[u].second;//T.Change(1,1,n,w[u])Change(u,val);break;}case 'N':{int u=getint(),v=getint();Negate(u,v);break;}}//T.debb();//cout<<endl;if(fuck)break;}}return 0;}
0 0
- 【POJ】【P3237】【Tree】【题解】【树链剖分+线段树】
- POJ 3237 Tree(树链剖分+线段树)
- POJ 3237 Tree (树链剖分+线段树)
- POJ 3237 Tree(树链剖分+线段树)
- POJ 3237 Tree (树链剖分+线段树)
- POJ 3237 Tree (树链剖分+线段树)
- |poj 3237|树链剖分|线段树|Tree
- poj 3237 Tree 树链剖分 线段树
- POJ 3237 Tree(树链剖分 线段树区间标记)
- poj 3237 Tree(树链剖分,点权,线段树)
- 线段树 POJ 3321 Apple Tree
- poj 3321 Apple Tree 线段树
- POJ 3321 Apple Tree 线段树
- POJ 3321 Apple Tree 线段树+DFS
- poj 3321 Apple Tree(线段树)
- poj 3321 Apple Tree 线段树
- POJ 3321 Apple Tree 线段树
- poj 3468(线段树,splay tree)
- openCV-傅里叶变换
- Oracle EBS R12 - Steps and Issues/Resolutions during R12.1.1 to R12.1.3 Upgration
- android中如何在SD卡上进行文件读写操作
- http文件下载
- SQLPlus命令详细说明
- 【POJ】【P3237】【Tree】【题解】【树链剖分+线段树】
- jquery 键盘enter事件的小例子
- 如何养成读书的好习惯
- u-boot-2009.08在飞凌OK2440/FL2440上的移植(四)——让u-boot支持nand flash识别与操作
- 36 双端堆
- 【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑
- 软考——公钥和私钥
- 基于hadoop2.2的map端表关联(map side join)mapreduce实现
- SQLLDR详解与例子