树链剖分,对每个叶子用multiset记录前K大士兵,其余节点通过从儿子归并维护前K大士兵。过于模板。

 #include<set>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define ls (x<<1)
#define rs (ls|1)
#define lson ls,L,mid
#define rson rs,mid+1,R
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
#define For(i,x) for (int i=h[x],k; i; i=nxt[i])
using namespace std; const int N=;
int n,m,u,v,op,x,y,Q,K,cnt,tim,dfn[N],son[N],sz[N],dep[N],fa[N],top[N],h[N],to[N<<],nxt[N<<];
struct P{ int x,k; }p[N];
struct Se{
int tot,a[];
Se(){ tot=; memset(a,,sizeof(a)); }
Se(const Se &b){ tot=b.tot; memcpy(a,b.a,sizeof(a)); }
}T[N<<];
multiset<int>S[N<<];
void add(int u,int v){ to[++cnt]=v; nxt[cnt]=h[u]; h[u]=cnt; } void dfs(int x){
sz[x]=; dep[x]=dep[fa[x]]+;
For(i,x) if ((k=to[i])!=fa[x]){
fa[k]=x; dfs(k); sz[x]+=sz[k];
if (sz[k]>sz[son[x]]) son[x]=k;
}
} void dfs2(int x,int tp){
dfn[x]=++tim; top[x]=tp;
if (son[x]) dfs2(son[x],tp);
For(i,x) if ((k=to[i])!=fa[x] && k!=son[x]) dfs2(k,k);
} Se merge(Se a,Se b){
Se res;
for (int i=,j=; i<=a.tot || j<=b.tot; ){
if ((i<=a.tot) && (j>b.tot || b.a[j]<a.a[i])) res.a[++res.tot]=a.a[i++]; else res.a[++res.tot]=b.a[j++];
if (res.tot==K) break;
}
return res;
} void mdf(int x,int L,int R,int pos,int k,int op){
if (L==R){
if (!op) S[x].erase(S[x].find(k)); else S[x].insert(k);
T[x].tot=; multiset<int>::iterator it=S[x].end();
while (){
if (it==S[x].begin()) break; it--;
T[x].a[++T[x].tot]=*it;
if (T[x].tot==K) break;
}
return;
}
int mid=(L+R)>>;
if (pos<=mid) mdf(lson,pos,k,op); else mdf(rson,pos,k,op);
T[x]=merge(T[ls],T[rs]);
} Se que(int x,int L,int R,int l,int r){
if (L==l && r==R) return T[x];
int mid=(L+R)>>;
if (r<=mid) return que(lson,l,r);
else if (l>mid) return que(rson,l,r);
else return merge(que(lson,l,mid),que(rson,mid+,r));
} void solve(int x,int y){
Se res;
for (; top[x]!=top[y]; x=fa[top[x]]){
if (dep[top[x]]<dep[top[y]]) swap(x,y);
res=merge(res,que(,,n,dfn[top[x]],dfn[x]));
}
if (dep[x]<dep[y]) swap(x,y);
res=merge(res,que(,,n,dfn[y],dfn[x]));
if (!res.tot) puts("-1");
else{ rep(i,,res.tot) printf("%d ",res.a[i]); puts(""); }
} int main(){
freopen("bzoj4336.in","r",stdin);
freopen("bzoj4336.out","w",stdout);
scanf("%d",&n);
rep(i,,n) scanf("%d%d",&u,&v),add(u,v),add(v,u);
dfs(); dfs2(,);
scanf("%d",&m);
rep(i,,m) scanf("%d%d",&p[i].k,&p[i].x);
scanf("%d%d",&Q,&K);
rep(i,,m) mdf(,,n,dfn[p[i].x],p[i].k,);
while (Q--){
scanf("%d%d%d",&op,&x,&y);
if (op==) solve(x,y);
if (op==) mdf(,,n,dfn[p[x].x],p[x].k,),p[x].x=y,mdf(,,n,dfn[p[x].x],p[x].k,);
if (op==) mdf(,,n,dfn[p[x].x],p[x].k,),p[x].k=y,mdf(,,n,dfn[p[x].x],p[x].k,);
}
return ;
}

[BZOj4336][BJOI2015]骑士的旅行(树链剖分+线段树)的更多相关文章

  1. B20J_3231_[SDOI2014]旅行_树链剖分+线段树

    B20J_3231_[SDOI2014]旅行_树链剖分+线段树 题意: S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,城市信仰不同的宗教,为了方便,我们用不同的正整数代表各种宗教. S国 ...

  2. 洛谷P3313 [SDOI2014]旅行 题解 树链剖分+线段树动态开点

    题目链接:https://www.luogu.org/problem/P3313 这道题目就是树链剖分+线段树动态开点. 然后做这道题目之前我们先来看一道不考虑树链剖分之后完全相同的线段树动态开点的题 ...

  3. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1153  Solved: 421[Submit][Statu ...

  4. 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树

    [BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...

  5. BZOJ2243 (树链剖分+线段树)

    Problem 染色(BZOJ2243) 题目大意 给定一颗树,每个节点上有一种颜色. 要求支持两种操作: 操作1:将a->b上所有点染成一种颜色. 操作2:询问a->b上的颜色段数量. ...

  6. POJ3237 (树链剖分+线段树)

    Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...

  7. bzoj4034 (树链剖分+线段树)

    Problem T2 (bzoj4034 HAOI2015) 题目大意 给定一颗树,1为根节点,要求支持三种操作. 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子 ...

  8. HDU4897 (树链剖分+线段树)

    Problem Little Devil I (HDU4897) 题目大意 给定一棵树,每条边的颜色为黑或白,起始时均为白. 支持3种操作: 操作1:将a->b的路径中的所有边的颜色翻转. 操作 ...

  9. Aizu 2450 Do use segment tree 树链剖分+线段树

    Do use segment tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.bnuoj.com/v3/problem_show ...

  10. 【POJ3237】Tree(树链剖分+线段树)

    Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...

随机推荐

  1. 铺地砖|状压DP练习

    有一个N*M(N<=5,M<=1000)的棋盘,现在有1*2及2*1的小木块无数个,要盖满整个棋盘,有多少种方式?答案只需要mod1,000,000,007即可. //我也不知道这道题的来 ...

  2. 【CodeForces】679 A. Bear and Prime 100

    [题目]A. Bear and Prime 100 [题意]有一数字x,每次可询问一个数字y是否x的因子,最后输出数字x是否素数,要求询问次数<=20. [题解]容易发现[2,100]范围内的非 ...

  3. HDU 1172 猜数字 (模拟)

    题目链接 Problem Description 猜数字游戏是gameboy最喜欢的游戏之一.游戏的规则是这样的:计算机随机产生一个四位数,然后玩家猜这个四位数是什么.每猜一个数,计算机都会告诉玩家猜 ...

  4. L - Looking for Taste Gym - 101991L 二进制枚举/思维

    方法一:因为最多是10的六次方,所以可以直接枚举二进制上的每一位来得到最优结果. AC代码: #include<iostream> #include<stack> #inclu ...

  5. 关于linux系统如何实现fork的研究(一)【转】

    转自:http://www.aichengxu.com/linux/4157180.htm 引言 fork函数是用于在linux系统中创建进程所使用,而最近看了看一个fork()调用是怎么从应用到gl ...

  6. Freemaker 自定义指令和函数

    自定义函数和指令都可以在前台或者后台进行指定. 个人理解:指令的作用,主要是进行页面调整之后进行输出:函数的作用,主要是为了进行运算,返回运算结果供前台展示. (一) 自定义指令 使用以下格式调用自定 ...

  7. mac 卸载 node并重新安装

    系统升级到 Sierra 之后,npm 经常出问题,最终把 node 卸载了,安装了新版本.mac 卸载 node 比较麻烦,stackoverflow 上面找到一个方法还不错,特地记录下来,代码如下 ...

  8. PHP缓存加速插件 XCache 、 ZendOpcache 安装

    PHP缓存原理 当客户端请求一个PHP程序时,服务器的PHP引擎会解析该PHP程序,并将其编译为特定的操作码(OperateCode,简称opcode)文件,该文件是PHP代码的一种二进制表示方式.默 ...

  9. 创建一个简单的Maven工程

    Maven的工程结构如下图所示: 大致来看,Maven的工程结构如下: 在创建maven工程时,可以通过骨架创建,也可以不通过骨架创建. 我们先用idea通过骨架创建一个Maven工程. 配置pom. ...

  10. leetcode 之Permutation(七)

    首先是next permutation的算法的描述和分析如下: 这题一是要知道思路,编程中注意STL的用法 void nextPermutaion(vector<int> &num ...