bzoj 2157

链剖。。。这次的信息存在边上。。。

调了好久啊QAQ,没有看出连锁错误,对代码的敏感程度还是太差了,老是依赖debug(论NOIP为何会死得那么惨)

  1 #include<bits/stdc++.h>
  2 #define inc(i,l,r) for(int i=l;i<=r;i++)
  3 #define dec(i,l,r) for(int i=l;i>=r;i--)
  4 #define link(x) for(edge *j=h[x];j;j=j->next)
  5 #define mem(a) memset(a,0,sizeof(a))
  6 #define inf 1e10
  7 #define ll long long
  8 #define succ(x) (1<<x)
  9 #define NM 20000+5
 10 using namespace std;
 11 int read(){
 12     int x=0,f=1;char ch=getchar();
 13     while(!isdigit(ch)){if(ch==‘-‘)f=-1;ch=getchar();}
 14     while(isdigit(ch))x=x*10+ch-‘0‘,ch=getchar();
 15     return x*f;
 16 }
 17 struct edge{
 18     int t,v;
 19     edge *next;
 20 }e[2*NM],*h[NM],*p=e;
 21 void add(int x,int y,int v){
 22     p->t=y;p->v=v;p->next=h[x];h[x]=p;p++;
 23 }
 24 struct info{
 25     ll s,min,max,z;
 26 }T[8*NM],null,_t;
 27 info operator+(const info&x,const info&y){
 28     info f;
 29     f.s=x.s+y.s;
 30     f.max=max(x.max,y.max);
 31     f.min=min(x.min,y.min);
 32     f.z=0;
 33     return f;
 34 }
 35 int d[NM],f[NM],son[NM],id[NM],_id[NM],size[NM],top[NM],TOP,tot;
 36 int n,m,l,r,_x,_y,a[NM];
 37 char opt[5];
 38 void dfs1(int x){
 39     link(x)
 40     if(!f[j->t]){
 41         f[j->t]=x;
 42         d[j->t]=d[x]+1;
 43         a[j->t]=j->v;
 44         dfs1(j->t);
 45         size[x]+=size[j->t];
 46         if(size[j->t]>size[son[x]])son[x]=j->t;
 47     }
 48     size[x]++;
 49 }
 50 void dfs2(int x){
 51     top[x]=TOP;id[x]=++tot;_id[tot]=x;
 52     if(son[x])dfs2(son[x]);
 53     link(x)
 54     if(!top[j->t])dfs2(TOP=j->t);
 55 }
 56 void build(int i,int x,int y){
 57     int t=x+y>>1;
 58     if(x==y){
 59         T[i].s=T[i].min=T[i].max=a[_id[x]];
 60         return;
 61     }
 62     build(i<<1,x,t);build(i<<1|1,t+1,y);
 63     T[i]=T[i<<1]+T[i<<1|1];
 64 }
 65 void pushdown(int i){
 66     if(T[i].z){
 67         ll t=T[i<<1].max;
 68         T[i<<1].max=-T[i<<1].min;
 69         T[i<<1].min=-t;
 70         T[i<<1].s=-T[i<<1].s;
 71         t=T[i<<1|1].max;
 72         T[i<<1|1].max=-T[i<<1|1].min;
 73         T[i<<1|1].min=-t;
 74         T[i<<1|1].s=-T[i<<1|1].s;
 75         T[i<<1].z^=1;T[i<<1|1].z^=1;
 76         T[i].z=0;
 77     }
 78 }
 79 void ch(int i,int x,int y){
 80     int t=x+y>>1;
 81     if(x==y){
 82         T[i].s=T[i].max=T[i].min=_y;
 83         return;
 84     }
 85     pushdown(i);
 86     if(l<=t)ch(i<<1,x,t);else ch(i<<1|1,t+1,y);
 87     T[i]=T[i<<1]+T[i<<1|1];
 88 }
 89 void mod(int i,int x,int y){
 90     int t=x+y>>1;
 91     if(l<=x&&y<=r){
 92         T[i].s=-T[i].s;
 93         ll t=T[i].max;
 94         T[i].max=-T[i].min;
 95         T[i].min=-t;
 96         T[i].z^=1;
 97         return;
 98     }
 99     if(y<l||r<x)return;
100     pushdown(i);
101     mod(i<<1,x,t);mod(i<<1|1,t+1,y);
102     T[i]=T[i<<1]+T[i<<1|1];
103 }
104 info query(int i,int x,int y){
105     int t=x+y>>1;
106     if(l<=x&&y<=r)return T[i];
107     if(y<l||r<x)return null;
108     pushdown(i);
109     return query(i<<1,x,t)+query(i<<1|1,t+1,y);
110 }
111 int main(){
112     n=read();
113     inc(i,1,n-1){
114         _x=read()+1;_y=read()+1;int _t=read();
115         add(_x,_y,_t);add(_y,_x,_t);
116     }
117     f[1]=1;null.s=0;null.max=-inf;null.min=inf;
118     dfs1(1);
119     dfs2(TOP=1);
120     build(1,1,n);
121     m=read();
122     while(m--){
123         scanf("%s",opt);_x=read()+1;_y=read()+1;
124         if(opt[0]==‘C‘){
125             _y--;_x--;
126             if(d[e[2*_x-1].t]>d[e[2*_x-2].t])l=id[e[2*_x-1].t];
127             else l=id[e[2*_x-2].t];
128             ch(1,1,n);
129         }
130         else if(opt[0]==‘N‘){
131             for(;top[_x]!=top[_y];_x=f[top[_x]]){
132                 if(d[top[_x]]<d[top[_y]])swap(_x,_y);
133                 l=id[top[_x]];r=id[_x];
134                 mod(1,1,n);
135             }
136             if(d[_x]>d[_y])swap(_x,_y);
137             l=id[_x]+1;r=id[_y];
138             if(l<=r)mod(1,1,n);
139         }else{
140             _t=null;
141             for(;top[_x]!=top[_y];_x=f[top[_x]]){
142                 if(d[top[_x]]<d[top[_y]])swap(_x,_y);
143                 l=id[top[_x]];r=id[_x];
144                 _t=_t+query(1,1,n);
145             }
146             if(d[_x]>d[_y])swap(_x,_y);
147             l=id[_x]+1;r=id[_y];
148             _t=_t+query(1,1,n);
149             if(opt[0]==‘S‘)printf("%lld\n",_t.s);
150             else if(opt[1]==‘A‘)printf("%lld\n",_t.max);
151             else printf("%lld\n",_t.min);
152         }
153     }
154     return 0;
155 }

时间: 2024-10-22 14:29:43

bzoj 2157的相关文章

BZOJ 2157 旅游(动态树)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2157 [题目大意] 支持修改边,链上查询最大值最小值总和,以及链上求相反数 [题解] 我们将边转化成点,直接用LCT可以处理以上操作 [代码] #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int N=200010; int n; co

BZOJ 2157 旅游(树链剖分+线段树)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2157 [题目大意] 支持修改边,链上查询最大值最小值总和,以及链上求相反数 [题解] 树链剖分,然后线段树维护线段操作即可. [代码] #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int INF=~0U>>1; const

AC日记——旅游 bzoj 2157

2157 思路: LCT: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 400005 #define INF 0x3f3f3f3f int n,val[maxn],sum[maxn],Max[maxn],Min[maxn],ch[maxn][2]; int rev[maxn],flag[maxn],f[maxn],top,st[maxn],m,cur[maxn],id; inline void in(int &a

bzoj 2157 旅游

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2157 明明是裸LCT板子-- 注意pshp的那个地方!原以为把0~n的mx.mn都赋好初值就能随便弄了,仔细想想要用的是val! 而且还是既用在max里又用在min里,故不能赋初值来怎样,应当分类讨论! 关于变成相反数的操作,原来也是打标记!而且标记的含义和线段树的一样,表示自己已经操作过.要给孩子操作.这样才能保证query的正确. 可是自己那种dfs来当即弄成相反数的做法为什么不行??

BZOJ 2157 旅行(树链剖分码农题)

写了5KB,1发AC... 题意:给出一颗树,支持5种操作. 1.修改某条边的权值.2.将u到v的经过的边的权值取负.3.求u到v的经过的边的权值总和.4.求u到v的经过的边的权值最大值.5.求u到v经过的边的权值最小值. 基于边权的树链剖分,放在线段树上变成了区间维护问题了,线段树维护4个量min,max,sum,tag就可以了. # include <cstdio> # include <cstring> # include <cstdlib> # include

BZOJ 2157 旅游 树链剖分

题目大意:给出一棵树,支持以下操作:1.改变一条边的边权.2.将x到y路径的权值取反.3.查询x到y路径上最大值,最小值和权值和. 思路:好裸的链剖水题啊,唯一麻烦一点地是权值放在了边上,注意一下处理就没问题了.. CODE: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 40010 #define INF 0x3f3f3f3

【BZOJ 2157】旅游

再水一道模板题,明天就要出发去参加二轮省选了赶紧复习复习模板. 链剖模板题,可是写链剖太麻烦了,还是写lct吧. 但这个lct比较麻烦了,因为边权有正有负,要统计最大值和最小值,这样点权赋为什么值都会妨碍统计. 想了半天,后来发现自己脑抽了,统计的时候特判一下当前点是点还是边不就可以了吗? 裸的模板题调了好久啊,因为后来往原先错误的程序加上上述特判时总是漏这漏那,以后一定要认真思考每个细节确保无误后再开始写代码,这样脑子里有一个清晰的框架,写起来更快,而且不容易出错,大大节省了调试的时间.切忌边

bzoj 2157: 旅游【树链剖分+线段树】

裸的树链剖分+线段树 但是要注意一个地方--我WA了好几次才发现取完相反数之后max值和min值是要交换的-- #include<iostream> #include<cstdio> using namespace std; const int N=200005; int n,m,h[N],cnt,de[N],va[N],fa[N],si[N],hs[N],fr[N],id[N],tot,rl[N]; char c[10]; struct qwe { int ne,no,to,va

【BZOJ】【2157】旅游

LCT 直到动手写拆边为点的时候才发现根本不会写……去orz了一下Hzwer(话说这题应该也用不着LCT吧……下次再换种姿势写一遍好了) 1 /************************************************************** 2 Problem: 2157 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6 Time:668 ms 7 Memory:2600 kb 8 *****************