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的更多相关文章

  1. 链剖&LCT总结

    在搞LCT之前,我们不妨再看看喜闻乐见的树链剖分. 树链剖分有一道喜闻乐见的例题:NOI2015 软件包管理器 如果你看懂题目了,你就会明白它是叫你维护一个树,这棵树是不会动的,要兹磁子树求和,子树修 ...

  2. BZOJ-1036 树的统计Count 链剖线段树(模板)=(树链剖分+线段树)

    潇爷昨天刚刚讲完...感觉得还可以...对着模板打了个模板...还是不喜欢用指针.... 1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Lim ...

  3. CF733F Drivers Dissatisfaction【链剖】【最小生成树应用】

    F. Drivers Dissatisfaction time limit per test 4 seconds memory limit per test 256 megabytes input s ...

  4. 【洛谷】4180:【模板】严格次小生成树[BJWC2010]【链剖】【线段树维护最大、严格次大值】

    P4180 [模板]严格次小生成树[BJWC2010] 题目描述 小C最近学了很多最小生成树的算法,Prim算法.Kurskal算法.消圈算法等等.正当小C洋洋得意之时,小P又来泼小C冷水了.小P说, ...

  5. CF487E Tourists(圆方树+堆+链剖)

    本题解并不提供圆方树讲解. 所以不会圆方树的出门右转问yyb 没有修改的话圆方树+链剖. 方点的权值为点双连通分量里的最小值. 然后修改的话圆点照修,每一个方点维护一个小根堆. 考虑到可能被菊花卡死. ...

  6. BZOJ 1146 二分+链剖+线段树+treap

    思路: 恶心的数据结构题-- 首先 我们 链剖 把树 变成序列 再 套一个 区间 第K大就好了-- 复杂度(n*log^4n) //By SiriusRen #include <cstdio&g ...

  7. 链剖-进阶ing-填坑-NOIP2013-货车运输

    This article is made by Jason-Cow.Welcome to reprint.But please post the writer's address. http://ww ...

  8. 树链剖分-Hello!链剖-[NOIP2015]运输计划-[填坑]

    This article is made by Jason-Cow.Welcome to reprint.But please post the writer's address. http://ww ...

  9. BZOJ 3631 链剖+差分

    思路: 1.树链剖分+用带标记的线段树维护操作(复杂度O(nlog2n)) 2.树链剖分LCA(TarjanLCA等各种LCA)+差分 复杂度(O(n)->O(nlogn)之间) 下面就说说怎么 ...

随机推荐

  1. 845. 八数码(bfs+map)

    在一个3×3的网格中,1~8这8个数字和一个“X”恰好不重不漏地分布在这3×3的网格中. 例如: 1 2 3 X 4 6 7 5 8 在游戏过程中,可以把“X”与其上.下.左.右四个方向之一的数字交换 ...

  2. TCL namespace

    命名空间可从Tcl 8.0版开始使用.引入命名空间之前,有一个全局范围.现在有了命名空间,我们可以分区全局范围. 创建命名空间: 结果:33 嵌套命名空间: 结果: test1 test2 导入命名空 ...

  3. Java世界最常用的工具类库

    Apache Commons Apache Commons有很多子项目,常用的项目如下 BeanUtils 提供了一系列对java bean的操作,读取和设置属性值等 map和bean的互相转换 我们 ...

  4. Python读取Excel,日期列读出来是数字的处理

    Python读取Excel,里面如果是日期,直接读出来是float类型,无法直接使用. 通过判断读取表格的数据类型ctype,进一步处理. 返回的单元格内容的类型有5种: ctype: 0 empty ...

  5. promise是怎么来的?

    一.promise是如何产生的 1. promise并不是一个新的功能,它是一个类,它只是对 异步编程的代码进行整合,它是解决异步(层层嵌套的这种关系),让你的代码看起来更简洁. 2. 在 es6 中 ...

  6. Eclipse项目转到MyEclipse中出错

    原因如下. JDK的编译版本和JRE的运行版本不一致导致了这个问题. 在MyEclipse中,对项目进行Build path 逐一设置即可. 还有关于类型转换的问题,由于JDK版本的不一致,下载下来的 ...

  7. bat代码中判断 bat是否是以管理员权限运行,以及自动以管理员权限运行CMD BAT

    · bat 代码中判断bat是否是以管理员权限运行,以及自动以管理员权限运行CMD BAT 一.判断bat是否是以管理员权限运行 @echo off net.exe session >NUL & ...

  8. 16day 逻辑符号系列

    && 与逻辑符号 前一个命令执行成功, 再执行后面的命令 || 或逻辑符号 前一个命令执行失败, 再执行后面的命令 &&符号实践操作: [root@oldboyedu ...

  9. 计蒜客 - A1633.蒜头君的数轴

    我感觉出的很好的一道题,首先不难想到(其实我刚开始没想到),加点的个数就是找已有点两两形成区间的gcd,那么问题就出在了复杂度上,每次循环哪个区间不要复杂度过高,所以运用正反两次前缀和(?好像不能这么 ...

  10. Codeforces Round #621 (Div. 1 + Div. 2)E(二分查找,枚举分界点,容斥原理)

    可以把每头牛看作一个位置,有几对牛可以放置相当于有几对位置可以给它睡觉,没有牛可以在其他牛的位置睡觉,所以有几对牛放置的可能答案就乘多少(相当于在原本的两个集合里分别插入一个元素,元素代表它睡觉的位置 ...