zoukankan      html  css  js  c++  java
  • [hdu4010]: Query on The Trees

      大概是有史以来调LCT调得最惨的一次了。。因为删边那里判断是否合法时少了个条件。。调了整个晚上>_<。。。。

      被模版题教做人了QAQ。。

      1 #include<cstdio>
      2 #include<iostream>
      3 #include<cstring>
      4 using namespace std;
      5 const int maxn=300233;
      6 struct zs{
      7     int too,pre;
      8 }e[maxn<<1];int tot,last[maxn],dl[maxn];
      9 int ch[maxn][2],fa[maxn],mxv[maxn],v[maxn],add[maxn],st[maxn],top;
     10 bool rev[maxn];
     11 int i,j,k,n,m,x,y,w;
     12 
     13 int ra;char rx;
     14 inline int read(){
     15     rx=getchar(),ra=0;
     16     while(rx<'0'||rx>'9')rx=getchar();
     17     while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra;
     18 }
     19 
     20 inline void insert(int a,int b){
     21     e[++tot].too=b,e[tot].pre=last[a],last[a]=tot;
     22     e[++tot].too=a,e[tot].pre=last[b],last[b]=tot;
     23 }
     24 
     25 inline int max(int a,int b){return a>b?a:b;}
     26 inline bool isrt(int x){
     27     return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;
     28 }
     29 inline void pushdown(int x){
     30     int l=ch[x][0],r=ch[x][1];
     31     if(rev[x]){
     32         swap(ch[x][0],ch[x][1]),
     33         rev[l]^=1,rev[r]^=1,rev[x]=0;
     34     }
     35     if(add[x]){
     36         if(l)add[l]+=add[x],mxv[l]+=add[x],v[l]+=add[x];
     37         if(r)add[r]+=add[x],mxv[r]+=add[x],v[r]+=add[x];
     38         add[x]=0;
     39     }
     40 }
     41 inline void upd(int x){
     42     mxv[x]=max(mxv[ch[x][0]],mxv[ch[x][1]]);
     43     if(mxv[x]<v[x])mxv[x]=v[x];
     44 }
     45 inline void rotate(int x){
     46     int f=fa[x],gfa=fa[f],l=ch[f][1]==x,r=l^1;
     47     if(!isrt(f))ch[gfa][ch[gfa][1]==f]=x;
     48     fa[ch[f][l]=ch[x][r]]=f,fa[fa[ch[x][r]=f]=x]=gfa,
     49     upd(f);
     50 }
     51 inline void splay(int x){
     52     int f=x,gfa;
     53     for(st[top=1]=f;!isrt(f);)st[++top]=(f=fa[f]);
     54     while(top)pushdown(st[top--]);
     55     while(!isrt(x)){
     56         f=fa[x],gfa=fa[f];
     57         if(!isrt(f))
     58             rotate(((ch[f][1]==x)^(ch[gfa][1]==f))?x:f);
     59         rotate(x);
     60     }
     61     upd(x);
     62 }
     63 inline void access(int x){
     64     for(int rc=0;x;rc=x,x=fa[x])
     65         splay(x),ch[x][1]=rc,upd(x);
     66 }
     67 inline void makert(int x){
     68     access(x),splay(x),rev[x]^=1;
     69 }
     70 inline void link(int x,int y){
     71     makert(x),fa[x]=y;
     72 }
     73 inline void cut(int x,int y){
     74     makert(x),access(y),splay(y),fa[ch[y][0]]=0,ch[y][0]=0,upd(y);
     75 }
     76 inline int getfa(int x){
     77     for(access(x),splay(x);ch[x][0];x=ch[x][0]);
     78     return x;
     79 }
     80 
     81 int main(){
     82     mxv[0]=-200023333;bool first=1;
     83     while(scanf("%d",&n)==1){
     84         if(!first)
     85             for(i=0;i<=n;i++)rev[i]=add[i]=ch[i][0]=ch[i][1]=last[i]=0;
     86         else first=0;
     87         tot=0;
     88         
     89         for(i=1;i<n;i++)
     90             x=read(),y=read(),insert(x,y);
     91         for(i=1;i<=n;i++)v[i]=mxv[i]=read();
     92         int l=0,r=1,now;dl[1]=1;fa[1]=0;
     93         
     94         while(l<r){
     95             now=dl[++l];
     96             for(i=last[now];i;i=e[i].pre)if(e[i].too!=fa[now])
     97                 fa[dl[++r]=e[i].too]=now;
     98         }
     99         
    100         m=read();char id;
    101         while(m--){
    102             for(id=getchar();id<'0'||id>'9';id=getchar());
    103             if(id=='3')w=read();
    104             x=read(),y=read();bool sm=(getfa(x)==getfa(y));
    105             if(id=='1')
    106                 if(sm)puts("-1");
    107                 else link(x,y);
    108             if(id=='2')
    109                 if(!sm||x==y)puts("-1");
    110                 else cut(x,y);
    111             if(id=='3')
    112                 if(!sm)puts("-1");
    113                 else makert(x),access(y),splay(y),add[y]+=w,mxv[y]+=w,v[y]+=w;
    114             if(id=='4')
    115                 if(!sm)puts("-1");
    116                 else makert(x),access(y),splay(y),printf("%d
    ",mxv[y]);
    117         }
    118         puts("");
    119     }
    120     return 0;
    121 }
    View Code
  • 相关阅读:
    ssh2中的添,删,查,改。
    struts2中数据的传输
    SSH2中的笔记
    struts2中的拦截器
    struts.xml中的配置内容
    【spring源码分析】二、Aware
    【spring源码分析】一、BeanPostProcessor
    java常用名词缩写
    解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
    springboot使用redis缓存
  • 原文地址:https://www.cnblogs.com/czllgzmzl/p/5243103.html
Copyright © 2011-2022 走看看