zoukankan      html  css  js  c++  java
  • 链剖What you are?大话西游校内oj2440

    This article is made by Jason-Cow.
    Welcome to reprint.
    But please post the writer's address.

    http://www.cnblogs.com/JasonCow/

    链剖+线段树

    所以为什么 2017.4.8 C题爆零了!!!

    我的暴力分呢?

    大话西游AC code 假装考试30分拿到了T△T

      1 #include <algorithm>
      2 #include <iostream>
      3 #include <cstdlib>
      4 #include <cstring>
      5 #include <cstdio>
      6 #include <vector>
      7 #include <queue>
      8 #include <map>
      9 #include <set>
     10 using namespace std;
     11 #define file(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
     12 const int maxn=(int)1e5+10,maxm=(int)2e5+10;
     13 struct edge{int v,next;}e[maxm];
     14 struct cuttochain{int fa,dep,size,son,top;}T[maxn];
     15 int head[maxn],cnt,idx,n,Q,dfn[maxn],Rank[maxn],U[maxn],V[maxn];
     16 long long W[maxn];
     17 void add(int u,int v){e[++cnt]=(edge){v,head[u]},head[u]=cnt;}
     18 void Add(int i){scanf("%d%d",&U[i],&V[i]);add(U[i],V[i]),add(V[i],U[i]);}
     19 void dfs1(int u,int fa){
     20   T[u].fa=fa,T[u].dep=T[fa].dep+1,T[u].size=1;
     21   for(int i=head[u];i;i=e[i].next){
     22     if(e[i].v!=fa){
     23       dfs1(e[i].v,u);T[u].size+=T[e[i].v].size;
     24       if(T[u].son==0||T[e[i].v].size>T[T[u].son].size)T[u].son=e[i].v;
     25     }
     26   }
     27 }
     28 void dfs2(int u,int top){
     29   T[u].top=top,dfn[u]=++idx,Rank[dfn[u]]=u;
     30   if(T[u].son)dfs2(T[u].son,top);
     31   for(int i=head[u];i;i=e[i].next){
     32     if(e[i].v!=T[u].fa && e[i].v!=T[u].son)dfs2(e[i].v,e[i].v);
     33   }
     34 }
     35 #define ls (x<<1)
     36 #define rs (x<<1|1)
     37 #define mid ((l+r)>>1)
     38 struct segmenttree{long long max,min,sum;}E[maxn<<2];
     39 void up(int x){
     40   E[x].max = max(E[ls].max,E[rs].max);
     41   E[x].min = min(E[ls].min,E[rs].min);
     42   E[x].sum =     E[ls].sum+E[rs].sum;
     43 }
     44 void build(int x,int l,int r){
     45   if(l==r){E[x].max=E[x].sum=E[x].min=W[Rank[l]];}
     46   else{build(ls,l,mid),build(rs,mid+1,r);up(x);}
     47 }
     48 long long Max(int x,int l,int r,int L,int R){
     49   long long ans=0;
     50   if(L<=l&&r<=R)return E[x].max;
     51   else{
     52     if(R<=mid)ans=Max(ls,l,mid,L,R);
     53     else if(L>mid)ans=Max(rs,mid+1,r,L,R);
     54     else ans=max( Max(ls,l,mid,L,R) , Max(rs,mid+1,r,L,R) );
     55   }
     56   return ans;
     57 }
     58 long long Min(int x,int l,int r,int L,int R){
     59   long long ans=(int)1e8+10;
     60   if(L<=l&&r<=R)return E[x].min;
     61   else{
     62     if(R<=mid)ans=Min(ls,l,mid,L,R);
     63     else if(L>mid)ans=Min(rs,mid+1,r,L,R);
     64     else ans=min( Min(ls,l,mid,L,R) , Min(rs,mid+1,r,L,R) );
     65   }
     66   return ans;
     67 }
     68 long long Sum(int x,int l,int r,int L,int R){
     69   long long ans=0;
     70   if(L<=l&&r<=R)return E[x].sum;
     71   else{
     72     if(R<=mid)ans=Sum(ls,l,mid,L,R);
     73     else if(L>mid)ans=Sum(rs,mid+1,r,L,R);
     74     else ans=Sum(ls,l,mid,L,R) + Sum(rs,mid+1,r,L,R);
     75   }
     76   return ans;
     77 }
     78 void updata(int x,int l,int r,int P,int val){
     79   if(l==r){E[x].max=E[x].sum=E[x].min=val;}
     80   else{
     81     if(P<=mid)updata(ls,l,mid,P,val);
     82     else updata(rs,mid+1,r,P,val);
     83     up(x);
     84   }
     85 }
     86 void update(int x,int val){int id=dfn[x];updata(1,1,n,id,val);}
     87 long long query(int x){
     88   long long MAX1=0,MIN1=(int)1e8+10;
     89   long long MAX2=0,MIN2=(int)1e8+10;
     90   if(T[U[x]].dep>T[V[x]].dep){
     91     MAX1=Max(1,1,n,dfn[U[x]],dfn[U[x]]+T[U[x]].size-1);
     92     MIN1=Min(1,1,n,dfn[U[x]],dfn[U[x]]+T[U[x]].size-1);
     93     int LL=1,LR=dfn[U[x]]-1,RL=dfn[U[x]]+T[U[x]].size,RR=n;
     94     if(LL<=LR){
     95       MAX2=max(MAX2,Max(1,1,n,LL,LR));
     96       MIN2=min(MIN2,Min(1,1,n,LL,LR));
     97     }
     98     if(RL<=RR){
     99       MAX2=max(MAX2,Max(1,1,n,RL,RR));
    100       MIN2=min(MIN2,Min(1,1,n,RL,RR));
    101     }
    102   }
    103   else{
    104     MAX1=Max(1,1,n,dfn[V[x]],dfn[V[x]]+T[V[x]].size-1);
    105     MIN1=Min(1,1,n,dfn[V[x]],dfn[V[x]]+T[V[x]].size-1);
    106     int LL=1,LR=dfn[V[x]]-1,RL=dfn[V[x]]+T[V[x]].size,RR=n;
    107     if(LL<=LR){
    108       MAX2=max(MAX2,Max(1,1,n,LL,LR));
    109       MIN2=min(MIN2,Min(1,1,n,LL,LR));
    110     }
    111     if(RL<=RR){
    112       MAX2=max(MAX2,Max(1,1,n,RL,RR));
    113       MIN2=min(MIN2,Min(1,1,n,RL,RR));
    114     }
    115   }
    116   //cout<<"MAX1="<<MAX1<<endl;cout<<"MIN1="<<MIN1<<endl;cout<<"MAX2="<<MAX2<<endl;cout<<"MIN2="<<MIN2<<endl;
    117   cout<<MAX1*MIN1+MAX2*MIN2<<endl;
    118   return 0;
    119 }
    120 
    121 int main(){
    122   file("a");
    123   scanf("%d%d",&n,&Q);
    124   for(int i=1;i<=n;i++)scanf("%lld",&W[i]);
    125   for(int i=1;i<n;i++)Add(i);
    126   dfs1(1,0),dfs2(1,1),build(1,1,n);
    127   for(int i=1;i<=Q;i++){
    128     char o[15];scanf("%s",o+1);
    129     if(o[1]=='Q'){int x;scanf("%d",&x);query(x);}
    130     else{int id;long long val;scanf("%d%lld",&id,&val);update(id,val);}
    131   }
    132   return 0;
    133 }
    ~~Jason_liu O(∩_∩)O
  • 相关阅读:
    Open source cryptocurrency exchange
    Salted Password Hashing
    95. Unique Binary Search Trees II
    714. Best Time to Buy and Sell Stock with Transaction Fee
    680. Valid Palindrome II
    Java compiler level does not match the version of the installed Java project facet.
    eclipse自动编译
    Exception in thread "main" java.lang.StackOverflowError(栈溢出)
    博客背景美化——动态雪花飘落
    java九九乘法表
  • 原文地址:https://www.cnblogs.com/JasonCow/p/6681852.html
Copyright © 2011-2022 走看看