• 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
    ",_t.s);
    150             else if(opt[1]=='A')printf("%lld
    ",_t.max);
    151             else printf("%lld
    ",_t.min);
    152         }
    153     }
    154     return 0;
    155 }
    View Code
  • 相关阅读:
    汉语-谚语:条条大路通罗马
    汉语-词语:缱绻
    几何-对称图形:中心对称图形
    java解析获取Excel中的数据--同时兼容2003及2007
    如何使gcc输出搜索到的头文件路径?
    如何使tmux可以像vi一样操作(如快速跳转到某一行)?
    如何使tmux能够使用鼠标上下滚动?
    ID3v2: 为aac格式的音频文件添加ID3v2 Header
    FFmpeg: 利用FFmpeg提取音频文件中的metadata
    C语言:变长结构体
  • 原文地址:https://www.cnblogs.com/onlyRP/p/5049573.html
Copyright © 2020-2023  润新知