cogs1612. 大话西游

1612. 大话西游

http://www.cogs.pro/cogs/problem/problem.php?pid=1612

★★   输入文件:westward.in   输出文件:westward.out   简单对比
时间限制:1 s   内存限制:256 MB

【题目描述】

“大话西游”是一个在中国非常流行的在线游戏,由NIE公司开发和维护。这个游戏来源于著名的小说《西游记》和周星弛的电影,游戏的背景故事充满奇幻色彩,引人入胜。

游戏里面有很多片区域,不同的区域由不同的统治者管辖,其中有一个地方名叫“树国”,由一个妖怪控制着。这里有N个城堡,每个城堡都有其重要程度值(一个正整数,不超过10^8),这些城堡被N-1条双向道路所连接,任意两个城堡均可互达,城堡的重要程度值是可变的。现在,妖怪想知道如果破坏其中的一条道路会发生什么。本题中,你总共需要处理Q条指令,每一个都具有下面所述的格式:

(1)CHANGE

i w

本指令的含义为:将第i个城堡的重要程度值变为w(1<=w<=10^8)

(2)QUERY

j

本指令的含义为:输出min1*max1+min2*max2的值,详细如下:

第j条道路可以把“树国”分成两个连通块,分别称为part1和part2,其中

min1为part1中的最小重要程度值;

max1为part1中的最大重要程度值;

min2为part2中的最小重要程度值;

max2为part2中的最大重要程度值。

【输入格式】

第一行有两个整数N(2<=N<=100000)和Q(1<=Q<=100000),分别表示城堡的个数及指令的数目。

接下来的一行有N个整数(正整数,不超过10^8),表示起初每一个城堡的重要程度值(城堡的编号为1~N)。

接下来有N-1行,每行有两个整数u,v,表示在城堡u和城堡v之间有一条无向边相连,(边的编号依次为1~N-1)。

接下来有Q行,每行有一个指令,格式如下所述。

【输出格式】

对于每个"QUERY"指令,在单独一行输出结果。

【样例输入】

5 3
1 2 3 4 5
1 2
2 3
3 4
4 5
QUERY 1
CHANGE 1 10
QUERY 1

【样例输出】

11
110

维护每个点的dfs序,以此为建线段树的根据。

由于一棵子树上所有点的dfs序都是连续的,所以在查询时只需区间查询即可,这题不涉及边权,所以修改也是普通的单点修改。

只用到了树剖的第一个dfs,为的是求dfs序和子数大小

#include<cstdio>
#include<iostream>
using namespace std;
#define maxn 100010
int num,n,q,g,Ev[maxn],fa[maxn],dfn[maxn],id[maxn],head[maxn],point[maxn],sz[maxn];
struct node{int to,pre,d;}e[maxn*4];
struct Node{int l,r,mn,mx;}tr[maxn*4];
void Insert(int from,int to,int d){e[++num].to=to,e[num].d=d;e[num].pre=head[from];head[from]=num;}
void dfs(int father,int now){
    sz[now]=1;
    dfn[now]=++g;
    fa[now]=father;
    id[g]=now;
    for(int i=head[now];i;i=e[i].pre){
        int to=e[i].to;
        if(to==father)continue;
        point[e[i].d]=to;
        dfs(now,to);
        sz[now]+=sz[to];
    }
}
void up(int k){
    tr[k].mn=min(tr[k<<1].mn,tr[(k<<1)|1].mn);
    tr[k].mx=max(tr[k<<1].mx,tr[(k<<1)|1].mx);
}
void build(int l,int r,int k){
    tr[k].l=l;tr[k].r=r;
    if(tr[k].l==tr[k].r){tr[k].mn=tr[k].mx=Ev[id[l]];return;}
    int mid=(l+r)>>1;
    build(l,mid,k<<1);build(mid+1,r,(k<<1)|1);
    up(k);
}
int findmax(int l,int r,int k){
    if(tr[k].l==l&&tr[k].r==r)return tr[k].mx;
    int mid=(tr[k].l+tr[k].r)>>1;
    if(r<=mid)return findmax(l,r,k<<1);
    else if(l>mid)return findmax(l,r,(k<<1)|1);
    else return max(findmax(l,mid,k<<1),findmax(mid+1,r,(k<<1)|1));
}
int findmin(int l,int r,int k){
    if(tr[k].l==l&&tr[k].r==r)return tr[k].mn;
    int mid=(tr[k].l+tr[k].r)>>1;
    if(r<=mid)return findmin(l,r,k<<1);
    else if(l>mid)return findmin(l,r,(k<<1)|1);
    else return min(findmin(l,mid,k<<1),findmin(mid+1,r,(k<<1)|1));
}
void update(int pos,int v,int k){
    if(tr[k].l==tr[k].r){tr[k].mn=tr[k].mx=v;return;}
    int mid=(tr[k].l+tr[k].r)>>1;
    if(pos<=mid)update(pos,v,k<<1);
    if(pos>mid)update(pos,v,(k<<1)|1);
    up(k);
}
int main(){
    freopen("westward.in","r",stdin);
    freopen("westward.out","w",stdout);
    //freopen("Cola.txt","r",stdin);
    scanf("%d%d",&n,&q);
    for(int i=1;i<=n;i++)scanf("%d",&Ev[i]);
    int x,y;
    for(int i=1;i<n;i++){
        scanf("%d%d",&x,&y);
        Insert(x,y,i);Insert(y,x,i);
    }
    dfs(0,1);
    build(1,n,1);
    char ch[10];
    for(int i=1;i<=q;i++){
        scanf("%s",&ch);
        int a,b;
        if(ch[0]==‘C‘){
            scanf("%d%d",&a,&b);
            update(dfn[a],b,1);
        }
        if(ch[0]==‘Q‘){
            scanf("%d",&a);
            int s=dfn[point[a]],t=s+sz[point[a]]-1;
            int max1,max2;int min1,min2;min1=min2=0x7fffffff;
            max1=findmax(s,t,1);min1=findmin(s,t,1);
            if(s!=1)max2=findmax(1,s-1,1),min2=findmin(1,s-1,1);
            if(t!=n) max2=max(max2,findmax(t+1,n,1)),min2=min(min2,findmin(t+1,n,1));
            //int ans=min1*max1+min2*max2;
            printf("%lld\n",(long long)min1*(long long)max1+(long long)min2*(long long)max2);
        }
    }
    return 0;
}
时间: 2024-10-11 11:21:38

cogs1612. 大话西游的相关文章

《大话西游》20年后重映(附影评:《大话西游》你真的看懂了吗?)

2014-10-25 02:43:24 来源: 北京日报(北京) 本报讯 (记者 周南焱)"电影里的台词差点儿都能背,但在影院里再看还是会笑.看到最后紫霞仙子死的时候.还是忍不住落泪! "昨天下午,经典老片<大话西游>在海航活力天宝影城又一次上映,一位重温影片的观众如是说.还有观众反映,用如今的电影技术水准来看,<大话西游>确实有点老土,但从内容来看还是那么亲切. 周星驰主演的<大话西游>20年前公映,当时票房大败. 但谁也没想到,该片通过盗版光碟和

大话西游感悟

你在看大话西游的时候,如果笑得腹背抽筋,龇牙咧嘴,那么你很有幽默感.如果你看完了大话西游,你还笑得满地打滚,那么你其实什么都没看懂.如果你看完了大话,你忽然发现脸上不知什么时候已经有泪水,你总算看懂了大话的第一层了.如果你看完大话,笑也笑过了,泪也流过了,忽然怔在那里,忽然觉得不知是该哭还是该笑,那么你看懂第二层了.如果你看完了大话,默默的坐在那里,你感到无处可去,你感到一种深入骨髓的悲哀和无奈,你看懂第三层了. 大话西游是个寓言,躲在古老神话的背壳里似乎很搞笑很爱情很世俗很感伤地讲述一个因为时

大话西游情节梳理

大话西游看过很多次,从哈哈一笑到眼泪打转,每次看都感觉比以前更懂了点,但都没有弄清故事的来龙去脉.今日偶得空闲,决定再次一探大话,彻底弄清故事情节,并整理成文. 这里将500年前记作历史A,500年后记作历史B. 一. 人物 至尊宝:只是历史B一个凡人,跟孙悟空并没有关系.后来在救白晶晶用月光宝盒时光倒流时,不小心倒流到历史A,遇见紫霞才被打上三颗痣,成为孙悟空转世. 孙悟空:历史A.与唐僧取经途中,离经判道,沾花惹草,被观音收服.因唐僧求情,一命换一命,给孙悟空一次转世投胎的机会.这时,历史B

这个世界上还有一个故事,叫做《大话西游》

这个世界上还有一个故事,叫做<大话西游>. 世界是巨大的枷锁,你不得不重复自己或是别人的生活. 记得长辈说过:年轻是一种罪过.他们说我们不成熟. 真切地为自己的不俗喝彩,在深切的郁闷中,突然就看懂了<大话西游>的开头: 一位才华横溢又无法无天的青年(孙悟空),根本不喜欢世人摊派给他的大事业(西天取经).尤其受不了师父(唐僧)的唠唠叨叨,可世俗条规(观音)又不放过他.为让他悔悟,心甘情愿地去取经,唐僧和观音达成妥协:让他五百年后重新做人. 这真是一个宿命的开始. 九七一师兄曰:&qu

学习Samba加域之大话西游02

当前,几乎所有的公司,组织都会采用 Active Directory为它们的 Windows 桌面和服务器提供身份验证服务.在<Linux 身份验证策略>中,我们讲过让Linux 计算机也采用 Active Directory,这样做得好处显而易见,那就是集中管身份验证. 1.     一些基础概念如Samba和Winbind,PAM, NSS可以参考<Linux 身份验证策略>. 2.     怎么配置 Samba,参考 学习Samba基础命令详解之大话西游01. 3.    

《大话西游》经典对白

<大话西游>经典对白 经典对白之一:至尊宝趁乱向后院追去,在后院找到绝望地坐在井边的紫霞."你怎么躲在这里啊?"至尊宝问.突然,紫霞仙子拔出宝剑抵在至尊宝的咽喉上. 画外音:当时那把剑离我的喉咙只有0.01公分,但是四分之一炷香之后,那把剑的女主人将会彻底地爱上我,因为我决定说一个谎话,虽然本人生平说了无数的谎话,但是这一个我认为是最完美的-- 紫霞仙子:"你再往前半步我就把你给杀了!" 至尊宝:"你应该这么做,我也应该死.曾经有一份真诚的爱情

链剖-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 #includ

扒一扒:《大话西游》中的声纹识别!

近期,星爷经典作品大话西游重新上映,引发怀旧热潮.小编也买了票,想重温一下传说中那份感动. 万万没想到,看了一会,小编就没控制住大开的脑洞,陷入了离题万里的思考中:电影中,紫霞说一声"芝麻开门",盘丝洞的门就自动打开了,而至尊宝说"芝麻开门"时,门不仅没开,而且还把他砸了个半死. 十年前看的时候不明白为什么,现在再看时忽然领悟了: 盘丝洞的门肯定使用了声纹识别技术! 那么现在问题来了:何为声纹识别技术?现实世界里面有应用吗? 下面就一一为大家道来. 声纹识别技术,又

大话西游2人物属性预测工具1.0发布

大话西游2人物属性预测工具1.0发布 大话西游2人物属性预测工具 http://pan.baidu.com/s/1eQuuaHW 本软件适用于大话西游2,可根据前世修炼法术修正.当前等级及装备情况来预测某个等级的HP.MP.AP.SP.说明如下:1.2010年1月28日之前,玩家转生后系统一次性给予一定数量的属性点进行奖励.即40点,未转玩家没转生前在98级的基础上每升1级,转生后就会增加5点属性点奖励.一转的玩家没转生前在118级的基础上每升1级,转生后也会增加5点属性点奖励.二转的玩家没转生