链剖-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
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <map>
#include <set>
using namespace std;
#define file(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
const int maxn=(int)1e5+,maxm=(int)2e5+;
struct edge{int v,next;}e[maxm];
struct cuttochain{int fa,dep,size,son,top;}T[maxn];
int head[maxn],cnt,idx,n,Q,dfn[maxn],Rank[maxn],U[maxn],V[maxn];
long long W[maxn];
void add(int u,int v){e[++cnt]=(edge){v,head[u]},head[u]=cnt;}
void Add(int i){scanf("%d%d",&U[i],&V[i]);add(U[i],V[i]),add(V[i],U[i]);}
void dfs1(int u,int fa){
T[u].fa=fa,T[u].dep=T[fa].dep+,T[u].size=;
for(int i=head[u];i;i=e[i].next){
if(e[i].v!=fa){
dfs1(e[i].v,u);T[u].size+=T[e[i].v].size;
if(T[u].son==||T[e[i].v].size>T[T[u].son].size)T[u].son=e[i].v;
}
}
}
void dfs2(int u,int top){
T[u].top=top,dfn[u]=++idx,Rank[dfn[u]]=u;
if(T[u].son)dfs2(T[u].son,top);
for(int i=head[u];i;i=e[i].next){
if(e[i].v!=T[u].fa && e[i].v!=T[u].son)dfs2(e[i].v,e[i].v);
}
}
#define ls (x<<1)
#define rs (x<<1|1)
#define mid ((l+r)>>1)
struct segmenttree{long long max,min,sum;}E[maxn<<];
void up(int x){
E[x].max = max(E[ls].max,E[rs].max);
E[x].min = min(E[ls].min,E[rs].min);
E[x].sum = E[ls].sum+E[rs].sum;
}
void build(int x,int l,int r){
if(l==r){E[x].max=E[x].sum=E[x].min=W[Rank[l]];}
else{build(ls,l,mid),build(rs,mid+,r);up(x);}
}
long long Max(int x,int l,int r,int L,int R){
long long ans=;
if(L<=l&&r<=R)return E[x].max;
else{
if(R<=mid)ans=Max(ls,l,mid,L,R);
else if(L>mid)ans=Max(rs,mid+,r,L,R);
else ans=max( Max(ls,l,mid,L,R) , Max(rs,mid+,r,L,R) );
}
return ans;
}
long long Min(int x,int l,int r,int L,int R){
long long ans=(int)1e8+;
if(L<=l&&r<=R)return E[x].min;
else{
if(R<=mid)ans=Min(ls,l,mid,L,R);
else if(L>mid)ans=Min(rs,mid+,r,L,R);
else ans=min( Min(ls,l,mid,L,R) , Min(rs,mid+,r,L,R) );
}
return ans;
}
long long Sum(int x,int l,int r,int L,int R){
long long ans=;
if(L<=l&&r<=R)return E[x].sum;
else{
if(R<=mid)ans=Sum(ls,l,mid,L,R);
else if(L>mid)ans=Sum(rs,mid+,r,L,R);
else ans=Sum(ls,l,mid,L,R) + Sum(rs,mid+,r,L,R);
}
return ans;
}
void updata(int x,int l,int r,int P,int val){
if(l==r){E[x].max=E[x].sum=E[x].min=val;}
else{
if(P<=mid)updata(ls,l,mid,P,val);
else updata(rs,mid+,r,P,val);
up(x);
}
}
void update(int x,int val){int id=dfn[x];updata(,,n,id,val);}
long long query(int x){
long long MAX1=,MIN1=(int)1e8+;
long long MAX2=,MIN2=(int)1e8+;
if(T[U[x]].dep>T[V[x]].dep){
MAX1=Max(,,n,dfn[U[x]],dfn[U[x]]+T[U[x]].size-);
MIN1=Min(,,n,dfn[U[x]],dfn[U[x]]+T[U[x]].size-);
int LL=,LR=dfn[U[x]]-,RL=dfn[U[x]]+T[U[x]].size,RR=n;
if(LL<=LR){
MAX2=max(MAX2,Max(,,n,LL,LR));
MIN2=min(MIN2,Min(,,n,LL,LR));
}
if(RL<=RR){
MAX2=max(MAX2,Max(,,n,RL,RR));
MIN2=min(MIN2,Min(,,n,RL,RR));
}
}
else{
MAX1=Max(,,n,dfn[V[x]],dfn[V[x]]+T[V[x]].size-);
MIN1=Min(,,n,dfn[V[x]],dfn[V[x]]+T[V[x]].size-);
int LL=,LR=dfn[V[x]]-,RL=dfn[V[x]]+T[V[x]].size,RR=n;
if(LL<=LR){
MAX2=max(MAX2,Max(,,n,LL,LR));
MIN2=min(MIN2,Min(,,n,LL,LR));
}
if(RL<=RR){
MAX2=max(MAX2,Max(,,n,RL,RR));
MIN2=min(MIN2,Min(,,n,RL,RR));
}
}
//cout<<"MAX1="<<MAX1<<endl;cout<<"MIN1="<<MIN1<<endl;cout<<"MAX2="<<MAX2<<endl;cout<<"MIN2="<<MIN2<<endl;
cout<<MAX1*MIN1+MAX2*MIN2<<endl;
return ;
} int main(){
file("a");
scanf("%d%d",&n,&Q);
for(int i=;i<=n;i++)scanf("%lld",&W[i]);
for(int i=;i<n;i++)Add(i);
dfs1(,),dfs2(,),build(,,n);
for(int i=;i<=Q;i++){
char o[];scanf("%s",o+);
if(o[]=='Q'){int x;scanf("%d",&x);query(x);}
else{int id;long long val;scanf("%d%lld",&id,&val);update(id,val);}
}
return ;
}
链剖-What you are?-大话西游-校内oj2440的更多相关文章
- 链剖&LCT总结
在搞LCT之前,我们不妨再看看喜闻乐见的树链剖分. 树链剖分有一道喜闻乐见的例题:NOI2015 软件包管理器 如果你看懂题目了,你就会明白它是叫你维护一个树,这棵树是不会动的,要兹磁子树求和,子树修 ...
- BZOJ-1036 树的统计Count 链剖线段树(模板)=(树链剖分+线段树)
潇爷昨天刚刚讲完...感觉得还可以...对着模板打了个模板...还是不喜欢用指针.... 1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Lim ...
- CF733F Drivers Dissatisfaction【链剖】【最小生成树应用】
F. Drivers Dissatisfaction time limit per test 4 seconds memory limit per test 256 megabytes input s ...
- 【洛谷】4180:【模板】严格次小生成树[BJWC2010]【链剖】【线段树维护最大、严格次大值】
P4180 [模板]严格次小生成树[BJWC2010] 题目描述 小C最近学了很多最小生成树的算法,Prim算法.Kurskal算法.消圈算法等等.正当小C洋洋得意之时,小P又来泼小C冷水了.小P说, ...
- CF487E Tourists(圆方树+堆+链剖)
本题解并不提供圆方树讲解. 所以不会圆方树的出门右转问yyb 没有修改的话圆方树+链剖. 方点的权值为点双连通分量里的最小值. 然后修改的话圆点照修,每一个方点维护一个小根堆. 考虑到可能被菊花卡死. ...
- BZOJ 1146 二分+链剖+线段树+treap
思路: 恶心的数据结构题-- 首先 我们 链剖 把树 变成序列 再 套一个 区间 第K大就好了-- 复杂度(n*log^4n) //By SiriusRen #include <cstdio&g ...
- 链剖-进阶ing-填坑-NOIP2013-货车运输
This article is made by Jason-Cow.Welcome to reprint.But please post the writer's address. http://ww ...
- 树链剖分-Hello!链剖-[NOIP2015]运输计划-[填坑]
This article is made by Jason-Cow.Welcome to reprint.But please post the writer's address. http://ww ...
- BZOJ 3631 链剖+差分
思路: 1.树链剖分+用带标记的线段树维护操作(复杂度O(nlog2n)) 2.树链剖分LCA(TarjanLCA等各种LCA)+差分 复杂度(O(n)->O(nlogn)之间) 下面就说说怎么 ...
随机推荐
- 封装 axios
大家是否有印象,在开发项目中,我们往往会把axios给封装起来,写在一个js文件夹里,最后引入的也是js文件夹,而不是直接对axios进行操作,那为什么? 1. 如果一个组件需要请求数据,就要用到ax ...
- java8的ConcurrentHashMap为何放弃分段锁,为什么要使用CAS+Synchronized取代Segment+ReentrantLock
原文地址:https://cloud.tencent.com/developer/article/1509556 推荐一篇 ConcurrentHashMap 和 HashMap 写的比较的的文章 j ...
- shell变量内字符替换和变量字符修改
vi test.sh a= #将${a}里的第一个123替换为321 b=${a//}; echo "echo variable a" echo $a echo "ech ...
- nvm —— Node版本管理工具
nvm下载 下载地址 下载nvm-setup.zip文件 nvm安装 1.以管理员身份运行install.cmd文件,设置文件路径 root: C:\Users\Administrator\AppDa ...
- window.resizeTo
概述 动态调整窗口的大小. 语法 window.resizeTo(aWidth, aHeight) 参数 aWidth 是一个整数,表示新的 outerWidth(单位:像素)(包括滚动条.窗口边框等 ...
- const真有点烦
在C++中const代替#define的操作,当定义一个const时必须附一个值给它:const int size = 100;通常C++编译器不为const创建存储空间,相反它把这个定义保存在符号表 ...
- JavaWeb学习(三) : 如何在 Eclipse 中创建一个Web 项目并成功运行?
前置条件 : 1.确保已安装 Eclipse.Tomcat 服务器安装包 2.jdk.环境变量都已配置成功. 3.注意在安装 Eclipse 时一定要选择第二个有 Web 项目的进行安装, 不然安装成 ...
- 谷歌浏览器安装jsonview
1.下载JsonView扩展程序压缩包 下载链接:https://pan.baidu.com/s/1B0IkrHHyTiYtwJEGE_halA 提取码:myi6 2.解压这个压缩包 3.打开谷歌浏览 ...
- 题解【洛谷P1314】[NOIP2011]聪明的质监员
题面 题解 不难发现,\(W\)增大时,\(Y\)值会随之减小. 于是考虑二分\(W\). 如何\(\mathcal{O}(N)check?\) 每一次前缀和记录一下\(1-i\)之间\(w_i \g ...
- 题解 CF712C 【Memory and De-Evolution】
看到题我第一反应就是while循环 但是我竟然想正着推,失败,卡了十几分钟 后来我回来看到第三组测试数据 想到倒推 但是没坚持 于是我又卡了很久 过会我又回来想 AC了... 这个故事告诉我们,要努力 ...