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. 树莓派4B遇到的坑

    由于大创需要用到机器学习这些东西,入手了一个树莓派4B(新手没弄过,直接上手最新版果然是有坑的),大佬勿喷

  2. markdwon编辑公式入门

    上标与下标   上标和下标分别使用^ 与_ ,例如\(x_i^2\)表示的是:.   默认情况下,上.下标符号仅仅对下一个组起作用.一个组即单个字符或者使用{..} 包裹起来的内容.如果使用\(10^ ...

  3. ansible-七种武器

    1. ansible命令 2. ansible-doc是ansible模块说明文档,针对每个模块都有详细用法说明以及应用案例介绍 3. ansible-console是ansible为用户提供的一款交 ...

  4. 题解【AcWing883】高斯消元解线性方程组

    题面 高斯消元模板题. 这里直接讲述一下高斯消元的算法流程: 枚举每一列 \(c\): 找到第 \(c\) 列绝对值最大的一行: 将这一行换到最上面: 将该行的第一个数变成 \(1\): 将下面所有行 ...

  5. Appium appium 通过 adb 无线连接 Android 真机

    一.准备工作 1.准备一台或多台Android设备(如小米,华为),开启USB调试2.Android设备与电脑(Mac或者Windows)在同一个局域网内3.电脑安装好ADB工具 二.具体步骤 1.使 ...

  6. 巨杉TechDay回顾 | 技术人的夏天 · 就是这么燃!

    在All in Cloud的云计算时代,业务和应用正在不断“云化”,在此过程中云原生(Cloud Native)理念应运而生.作为云化改造的重要部分,云数据库因其天生的弹性扩展能力以及灵活.易用等特点 ...

  7. Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3) C Messy

    //因为可以反转n次 所以可以得到任何可以构成的序列 #include<iostream> #include<string> #include<vector> us ...

  8. RMQ(区间最值问题)

    问题: RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大) ...

  9. django 完成登录功能

    啃了几天文档,感觉能理解了这个框架,但是真的下手的时候真的不知道从何开始. orm即Object-Relationl Mapping,看这名字就是操作数据库的,用过ssm,不过django操作数据库是 ...

  10. pyodbc 向excel中读写数据

    import pyodbc conn_info=( 'DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};''DBQ=[Sh ...