[ZJOI2008]樹(shù)的統(tǒng)計(jì)Count

[ZJOI2008]樹(shù)的統(tǒng)計(jì)Count

#include<iostream>
#include<cstring>
#include<cmath>
#include<stdlib.h>
#include<cstdio>
# define PI 3.14159265358979323846
#define qc std::ios::sync_with_stdio(false)
using namespace std;
const int maxl=300100;
const int minl=-2147483648;
const int mod=1000000;
int n,m,q;
struct edge{
    int to,next;
    edge(){
        to=next=0;
    }
};
struct node
{
    bool z;
    int v,depth,son,zson;
    int pre;//對(duì)應(yīng)重鏈序的下表
    int top;//頭結(jié)點(diǎn)位置
    int fa;//父節(jié)點(diǎn)
    node(){
        z=false;
        v=0,depth=0,son=0;
        pre=0;
    }
};
struct zro{
    static int cnt;
    static int ni;
    static bool debug_is_off;
    zro(){
        cnt=0;
        ni=0;
        debug_is_off=false;
    }
};
struct seg_t
{
    int r,l,mid;
    int max;
    int sum;
};
int zro::cnt=0;
int zro::ni=0;
bool zro::debug_is_off=false;
edge e[maxl<<1]; zro zr;
node n_[maxl<<1];
seg_t tree[maxl<<2];
int v[maxl<<1], head[maxl<<1],ys[maxl<<1];
void addedge(int u,int v){
    e[++zr.cnt].next=head[u];
    e[zr.cnt].to=v;
    head[u]=zr.cnt;
}
void dfs1(int node,int depth,int f){
    int son=0,ma=0,mi=0;
    n_[node].depth=depth;
    for(int i=head[node];i!=0;i=e[i].next){
        if(e[i].to==f)continue;
        dfs1(e[i].to,depth+1,node);
        son+=n_[e[i].to].son+1;
        if(n_[e[i].to].son>=ma){
            ma=n_[e[i].to].son,mi=e[i].to;
        }
    }
    n_[mi].z=true;
    n_[node].zson=mi;
    n_[node].son=son;
    n_[node].fa=f;
}
void dfs2(int node,int top){
    ys[++zr.ni]=node;
    n_[node].pre=zr.ni;
    int z=n_[node].zson;
    if(node==1)n_[node].top=node;
    else if(n_[node].z)n_[node].top=n_[n_[node].fa].top;
    else n_[node].top=node;
    if(z)dfs2(z,node);
    for(int i=head[node];i!=0;i=e[i].next){
        if(e[i].to==n_[node].fa||n_[e[i].to].z)continue;
        dfs2(e[i].to,node);
    }
}
void pushup(int k){
    tree[k].max=max(tree[k<<1].max,tree[k<<1|1].max);
    tree[k].sum=tree[k<<1].sum+tree[k<<1|1].sum;
}
void build(int k,int l,int r){
    tree[k].l=l;tree[k].r=r;
    if(l==r)
    {   
        tree[k].max=n_[ys[l]].v;
        tree[k].sum=n_[ys[l]].v;
        return;
    }
    int mid=(l+r)>>1;
    build(k<<1,l,mid);build(k<<1|1,mid+1,r);
    pushup(k);
}

void tree_update(int k,int index,int value){
    if(tree[k].r==tree[k].l){
        tree[k].max=value;
        tree[k].sum=value;
        n_[ys[index]].v=value;
        return;
    }
    int mid=(tree[k].l+tree[k].r)>>1;
    if(index<=mid)tree_update(k<<1,index,value);
    if(index>mid)tree_update(k<<1|1,index,value);
    pushup(k);
}
int tree_max(int k,int l,int r){
    if(tree[k].l>=l&&tree[k].r<=r){
        return tree[k].max;
    }
    int mid=(tree[k].l+tree[k].r)>>1;
    int maxnum=minl;
    if(l<=mid)maxnum=max(maxnum,tree_max(k<<1,l,r));
    if(r>mid)maxnum=max(maxnum,tree_max(k<<1|1,l,r));
    return maxnum;
}
int tree_sum(int k,int l,int r){
    if(tree[k].l>=l&&tree[k].r<=r){
        return tree[k].sum;
    }
    int mid=(tree[k].l+tree[k].r)>>1;
    int sumnum=0;
    if(l<=mid)sumnum+=tree_sum(k<<1,l,r);
    if(r>mid)sumnum+=tree_sum(k<<1|1,l,r);
    return sumnum;
}
int find_max(int l,int r){
    int maxnum=minl;
    if(n_[l].top==n_[r].top)maxnum= tree_max(1,min(n_[l].pre,n_[r].pre),max(n_[l].pre,n_[r].pre));
    else if(n_[n_[l].top].depth>=n_[n_[r].top].depth){
        maxnum= max(find_max(l,n_[l].top),find_max(n_[n_[l].top].fa,r));
    }
    else{
        maxnum= max(find_max(r,n_[r].top),find_max(l,n_[n_[r].top].fa));
    }
    return maxnum;
}
int find_sum(int l,int r){
    int sumnum=0;
    if(n_[l].top==n_[r].top)sumnum=tree_sum(1,min(n_[l].pre,n_[r].pre),max(n_[l].pre,n_[r].pre));
    else if(n_[n_[l].top].depth>=n_[n_[r].top].depth){
        sumnum= find_sum(l,n_[l].top)+find_sum(n_[n_[l].top].fa,r);
    }
    else{
        sumnum= find_sum(r,n_[r].top)+find_sum(l,n_[n_[r].top].fa);
    }
    return sumnum;
}
void update(int index,int v){
    int in=n_[index].pre;
    tree_update(1,in,v);
}
void init(){
    memset(e,0,sizeof(e));
    memset(n_,0,sizeof(n));
    memset(tree,0,sizeof(tree));
    memset(v,0,sizeof(v));
    memset(head,0,sizeof(head));
    memset(ys,0,sizeof(ys));
    zr.cnt=0;
    zr.ni=0;
}
int main(){
    //qc;
        while(cin>>n){
            init();
        for(int i=1;i<n;i++){
            int a,b;
            scanf("%d%d",&a,&b);
            addedge(a,b);
            addedge(b,a);
        }
        for(int i=1;i<=n;i++){
            scanf("%d",&n_[i].v);
        }
        dfs1(1,1,0);
        dfs2(1,0);
        build(1,1,zr.ni);
        cin>>q;
        for(int i=1;i<=q;i++){
            char s[6];
            int a,b;
            scanf("%s",s);
            scanf("%d%d",&a,&b);
            if(s[0]=='C')update(a,b);
            else if(s[1]=='S')printf("%d\n",find_sum(a,b));
            else if(s[1]=='M')printf("%d\n",find_max(a,b));
        }
        }
    /*
8
1 2 1 3
2 4 2 5
3 6 3 7
4 8
1 2 3 4 5 6 7 8
     */
    
    
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末衡奥,一起剝皮案震驚了整個(gè)濱河市呐能,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌证芭,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件技潘,死亡現(xiàn)場(chǎng)離奇詭異逾一,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)寞冯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)晚伙,“玉大人吮龄,你說(shuō)我怎么就攤上這事∨亓疲” “怎么了漓帚?”我有些...
    開(kāi)封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)民傻。 經(jīng)常有香客問(wèn)我胰默,道長(zhǎng)场斑,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任牵署,我火速辦了婚禮漏隐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘奴迅。我一直安慰自己青责,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布取具。 她就那樣靜靜地躺著脖隶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪暇检。 梳的紋絲不亂的頭發(fā)上产阱,一...
    開(kāi)封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音块仆,去河邊找鬼构蹬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛悔据,可吹牛的內(nèi)容都是我干的庄敛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼科汗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼藻烤!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起头滔,我...
    開(kāi)封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤怖亭,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后拙毫,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體依许,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年缀蹄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膘婶。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缺前,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出悬襟,到底是詐尸還是另有隱情衅码,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布脊岳,位于F島的核電站逝段,受9級(jí)特大地震影響垛玻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜奶躯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一帚桩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嘹黔,春花似錦账嚎、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至喂江,卻和暖如春召锈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背获询。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工涨岁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人筐付。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓卵惦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親瓦戚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子沮尿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容