C++ 代码

贡献者:游客14647561 类别:代码 时间:2016-12-31 21:28:49 收藏数:28 评分:0.5
返回上页 举报此文章
请选择举报理由:




收藏到我的文章 改错字
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=100000*2;
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
struct Node{
int max,min,date,lazy;
}a[maxn<<2];
struct Edge{
int from,to,next,dis;
}e[maxn*2];
int len,head[maxn],n,m,cnt,id[maxn],pos[maxn];
int root[maxn],deep[maxn],size[maxn],v[maxn];
int son[maxn],top[maxn];
void Insert(int x,int y,int z){
len++;e[len].to=y;e[len].from=x;
e[len].dis=z;e[len].next=head[x];head[x]=len;
}
void Dfs1(int x){
size[x]=1;son[x]=0;
for(int i=head[x];i;i=e[i].next){
int j=e[i].to;
if(root[x]!=j){root[j]=x;
v[j]=e[i].dis;
deep[j]=deep[x]+1;
Dfs1(j);
size[x]+=size[j];
if(size[son[x]]<size[j])son[x]=j;
}
}
}
void Dfs2(int x,int tp){
top[x]=tp;id[x]=++cnt;pos[cnt]=x;
if(son[x])Dfs2(son[x],tp);
for(int i=head[x];i;i=e[i].next){
int j=e[i].to;
if(son[x]!=j && root[x]!=j)Dfs2(j,j);
}
}
void pushup(int rt){
a[rt].date=a[rt<<1].date+a[rt<<1|1].date;
a[rt].max=max(a[rt<<1].max,a[rt<<1|1].max);
a[rt].min=min(a[rt<<1].min,a[rt<<1|1].min);
}
void Update(int rt){
a[rt].lazy=0;
a[rt<<1].lazy=!a[rt<<1].lazy;a[rt<<1|1].lazy=!a[rt<<1|1].lazy;
a[rt<<1].date=-a[rt<<1].date;a[rt<<1|1].date=-a[rt<<1|1].date;
a[rt<<1].max=-a[rt<<1].max;a[rt<<1|1].max=-a[rt<<1|1].max;
a[rt<<1].min=-a[rt<<1].min;a[rt<<1|1].min=-a[rt<<1|1].min;
swap(a[rt<<1].max,a[rt<<1].min);
swap(a[rt<<1|1].max,a[rt<<1|1].min);
}
void Build(int rt,int l,int r){
if(l==r){
a[rt].min=a[rt].max=a[rt].date=v[pos[l]];
return;
}
int mid=(l+r)>>1;
Build(lson);Build(rson);
pushup(rt);
}
void Change(int x,int z,int rt,int l,int r){
if(l==r){
a[rt].date=a[rt].max=a[rt].min=z;
a[rt].lazy=0;
return;
}
if(a[rt].lazy)Update(rt);
int mid=(l+r)>>1;
if(x<=mid)Change(x,z,lson);
else Change(x,z,rson);
pushup(rt);
}
int Get_sum(int s,int t,int rt,int l,int r){
if(s<=l && t>=r)return a[rt].date;
if(a[rt].lazy)Update(rt);
int mid=(l+r)>>1;
if(t<=mid)return Get_sum(s,t,lson);
if(s>mid)return Get_sum(s,t,rson);
return Get_sum(s,t,lson)+Get_sum(s,t,rson);
}
int Tree_sum(int x,int y){
int ans=0,fx=top[x],fy=top[y];
while(fx!=fy){
if(deep[fx]<deep[fy]){swap(fx,fy);swap(x,y);}
ans+=Get_sum(id[fx],id[x],1,1,n);
x=root[fx];fx=top[x];
}
if(deep[x]>deep[y])swap(x,y);
if(id[x]+1<=id[y])ans+=Get_sum(id[x]+1,id[y],1,1,n);
return ans;
}
int Get_max(int s,int t,int rt,int l,int r){
if(s<=l && t>=r)return a[rt].max;
if(a[rt].lazy)Update(rt);
int mid=(l+r)>>1;
if(t<=mid)return Get_max(s,t,lson);
if(s>mid)return Get_max(s,t,rson);
return max(Get_max(s,t,lson),Get_max(s,t,rson));
}
int Tree_max(int x,int y){
int fx=top[x],fy=top[y],ans=-2e9;
while(fx!=fy){
if(deep[fx]<deep[fy]){swap(fx,fy);swap(x,y);}
ans=max(ans,Get_max(id[fx],id[x],1,1,n));
x=root[fx];fx=top[x];
}
if(deep[x]>deep[y])swap(x,y);
if(id[x]+1<=id[y])ans=max(ans,Get_max(id[x]+1,id[y],1,1,n));
return ans;
}
int Get_min(int s,int t,int rt,int l,int r){
if(s<=l && t>=r)return a[rt].min;
if(a[rt].lazy)Update(rt);
int mid=(l+r)>>1;
if(t<=mid)return Get_min(s,t,lson);
if(s>mid)return Get_min(s,t,rson);
return min(Get_min(s,t,lson),Get_min(s,t,rson));
}
int Tree_min(int x,int y){
int fx=top[x],fy=top[y],ans=2e9;
while(fx!=fy){
if(deep[fx]<deep[fy]){swap(fx,fy);swap(x,y);}
ans=min(ans,Get_min(id[fx],id[x],1,1,n));
x=root[fx];fx=top[x];
}
if(deep[x]>deep[y])swap(x,y);
if(id[x]+1<=id[y])ans=min(ans,Get_min(id[x]+1,id[y],1,1,n));
return ans;
}
void Get_negate(int s,int t,int rt,int l,int r){
if(s<=l && t>=r){
a[rt].lazy=!a[rt].lazy;
a[rt].date=-a[rt].date;
a[rt].max=-a[rt].max;a[rt].min=-a[rt].min;
swap(a[rt].max,a[rt].min);
return;
}
if(a[rt].lazy)Update(rt);
int mid=(l+r)>>1;
if(s<=mid)Get_negate(s,t,lson);
if(t>mid)Get_negate(s,t,rson);
pushup(rt);
}
void Tree_negate(int x,int y){
int fx=top[x],fy=top[y];
while(fx!=fy){
if(deep[fx]<deep[fy]){swap(fx,fy);swap(x,y);}
Get_negate(id[fx],id[x],1,1,n);
x=root[fx];fx=top[x];
}
if(deep[x]>deep[y])swap(x,y);
if(id[x]+1<=id[y])Get_negate(id[x]+1,id[y],1,1,n);
}
void Init();
int main(){
freopen("nt2011_travel.in","r",stdin);freopen("nt2011_travel.out","w",stdout);
Init();
return 0;
}
void Init(){
scanf("%d",&n);
for(int i=1;i<n;i++){
int x,y,z;scanf("%d%d%d",&x,&y,&z);x++;y++;
Insert(x,y,z);Insert(y,x,z);
}
deep[1]=1;
Dfs1(1);Dfs2(1,1);Build(1,1,n);
scanf("%d",&m);
for(int i=1;i<=m;i++){
char s[10];int x,y;scanf("%s%d%d",s,&x,&y);
x++;y++;
if(s[0]=='C'){
x--;y--;
int fr=e[2*x-1].from,to=e[2*x-1].to,temp;
temp=root[fr]==to ? fr : to;
Change(id[temp],y,1,1,n);
}
else if(s[0]=='N')Tree_negate(x,y);
else if(s[0]=='M' && s[1]=='A')printf("%d\n",Tree_max(x,y));
else if(s[0]=='M' && s[1]=='I')printf("%d\n",Tree_min(x,y));
else printf("%d\n",Tree_sum(x,y));
//printf("Sum=%d Max=%d Min=%d\n",a[1].date,a[1].max,a[1].min);
}
}
声明:以上文章均为用户自行添加,仅供打字交流使用,不代表本站观点,本站不承担任何法律责任,特此声明!如果有侵犯到您的权利,请及时联系我们删除。
文章热度:
文章难度:
文章质量:
说明:系统根据文章的热度、难度、质量自动认证,已认证的文章将参与打字排名!

本文打字排名TOP20

登录后可见

用户更多文章推荐