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
  • 相关阅读:
    Java 继承
    java 封装
    单选题
    实操题
    面试题
    Linux系统常用命令
    Shell脚本编写登陆小程序.sh
    利用shell脚本实现每隔60秒磁盘内存数据监控脚本
    shell脚本一键配置本地yum源
    shell点名脚本不重复人名
  • 原文地址:https://www.cnblogs.com/JasonCow/p/6681852.html
Copyright © 2011-2022 走看看