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*];
struct Node{int l,r,mn,mx;}tr[maxn*];
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]=;
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<<].mn,tr[(k<<)|].mn);
tr[k].mx=max(tr[k<<].mx,tr[(k<<)|].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)>>;
build(l,mid,k<<);build(mid+,r,(k<<)|);
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)>>;
if(r<=mid)return findmax(l,r,k<<);
else if(l>mid)return findmax(l,r,(k<<)|);
else return max(findmax(l,mid,k<<),findmax(mid+,r,(k<<)|));
}
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)>>;
if(r<=mid)return findmin(l,r,k<<);
else if(l>mid)return findmin(l,r,(k<<)|);
else return min(findmin(l,mid,k<<),findmin(mid+,r,(k<<)|));
}
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)>>;
if(pos<=mid)update(pos,v,k<<);
if(pos>mid)update(pos,v,(k<<)|);
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=;i<=n;i++)scanf("%d",&Ev[i]);
int x,y;
for(int i=;i<n;i++){
scanf("%d%d",&x,&y);
Insert(x,y,i);Insert(y,x,i);
}
dfs(,);
build(,n,);
char ch[];
for(int i=;i<=q;i++){
scanf("%s",&ch);
int a,b;
if(ch[]=='C'){
scanf("%d%d",&a,&b);
update(dfn[a],b,);
}
if(ch[]=='Q'){
scanf("%d",&a);
int s=dfn[point[a]],t=s+sz[point[a]]-;
int max1,max2;int min1,min2;min1=min2=0x7fffffff;
max1=findmax(s,t,);min1=findmin(s,t,);
if(s!=)max2=findmax(,s-,),min2=findmin(,s-,);
if(t!=n) max2=max(max2,findmax(t+,n,)),min2=min(min2,findmin(t+,n,));
//int ans=min1*max1+min2*max2;
printf("%lld\n",(long long)min1*(long long)max1+(long long)min2*(long long)max2);
}
}
return ;
}
cogs1612. 大话西游的更多相关文章
- 【CJOJ2440】大话西游(树链剖分)
题面 Description "大话西游" 是一个在中国非常流行的在线游戏, 由 NIE 公司开发和维护. 这个游戏来源于著名的小说<西游记> 和周星弛的电影, 游戏的 ...
- 链剖-What you are?-大话西游-校内oj2440
This article is made by Jason-Cow.Welcome to reprint.But please post the writer's address. http://ww ...
- 列王的纷争,COK,675区,有去的没有?加群:159108918,盟的名字准备叫:大话西游
首先我承认我玩物丧志了 679区,有去的没有?加群: 474574809,盟的名字叫:Moon Box 如何练最强5级号,为新区做准备?! 粮食是可以为0的,士兵不会死,这是关键之一. 关键之二是新手 ...
- 消息队列——RabbitMQ学习笔记
消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...
- [ 技术人员创业Tips ] 1:抓住优质客户(上)
写一篇技术以外的内容,可能会得罪一些人,轻拍,此外本文写的比较随意,写到哪里算哪里,轻拍. IT业不知道从什么时候起特别流行谈创业,似乎不谈创业就落伍,我不评价这种风气的好坏,只提一些自己的一些经验和 ...
- Cesium原理篇:GroundPrimitive
今天来看看GroundPrimitive,选择GroundPrimitive有三个目的:1 了解GroundPrimitive和Primitive的区别和关系 2 createGeometry的特殊处 ...
- 从游戏脚本语言说起,剖析Mono所搭建的脚本基础
0x00 前言 在日常的工作中,我偶尔能遇到这样的问题:“为何游戏脚本在现在的游戏开发中变得不可或缺?”.那么这周我就写篇文章从游戏脚本聊起,分析一下游戏脚本因何出现,而mono又能提供怎样的脚本基础 ...
- 2016第三届C++大会参会感悟(上)
继05年第一届C++大会,09年第二届,2016年10月28日-29日,在上海举行第三届C++大会.讲师主要有C++之父 / Bjarne Stroustrup,前Facebook研究科学家 / An ...
- 可变数组NSMutableArray
//创建一个空的可变数组 NSMutableArray *array = [NSMutableArray array]; //向数组里面添加对象 [array addObject:@"< ...
随机推荐
- 项目log4j日志管理详解
项目log4j日志管理详解 log4j日志系统在项目中重要性在这里就不再累述,我们在平时使用时如果没有特定要求,只需在log4j.properties文件中顶入输出级别就行了.如果要自定义输出文件,对 ...
- luoguP3769 [CH弱省胡策R2]TATT
luoguP3769 [CH弱省胡策R2]TATT PS:做这题前先切掉 P4148简单题,对于本人这样的juruo更助于理解,当然dalao就当练练手吧 题目大意: 现在有n个四维空间中的点,请求出 ...
- HTTP的referer机制
Quesion: 在项目中遇到了访问某些网络上的图片但是打开是forbidden的情况,原来这是一些网站为了避免图片被盗取所以采取的保护机制,如果不是从原网站上访问的图片,就禁止访问.那么这种情况应该 ...
- 《avascript 高级程序设计(第三版)》 ---第二章 在HTML中使用Javascript
本章主要讲解了,怎么在HTML中使用: 1.<script src=""></script> 属性:defer="defer" 表示脚本 ...
- Contiki Etimer 模块
一.Etimer概述 Etimer提供产生时间事件(timed event)的机制,当设定好的timer到期时,将会给设定etimer的process发送一个PROCESS_EVENT_TIMER 事 ...
- 计算机中丢失OPENGL.dll
开发OpenGL项目时,在VS开发环境下可能会出现如图所示的错误. 在c:\windows\system32和SysWow64文件夹下存在opengl32.dll,此时,所写程序能够正常编译,但是,程 ...
- CSS3文字阴影实现乳白文字效果
CSS3文字阴影实现乳白文字效果是一款有效利用css3的text-shadow属性,可以实现很多漂亮的效果,CSS3 文字阴影 文字特效,字体效果. 源码下载:http://www.huiyi8.co ...
- BZOJ 3709 [PA2014]Bohater:贪心【反过来考虑】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3709 题意: 在一款电脑游戏中,你需要打败n只怪物(从1到n编号). 为了打败第i只怪物, ...
- PHP的引用详解【转】
摘自:http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/09/10/2173092.html 官方文档: 1.引用是什么:http://ww ...
- 分享知识-快乐自己:初识 Hibernate 概念片(一)
1):什么是 Hibernate? Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibe ...