bzoj4336: BJOI2015 骑士的旅行
Description
Input
Output
#include<bits/stdc++.h>
const int N=;
char buf[N*],*ptr=buf-;
int _(){
int x=,c=*++ptr;
while(c<)c=*++ptr;
while(c>)x=x*+c-,c=*++ptr;
return x;
}
int n,m,q,k;
int es[N*],enx[N*],e0[N],ep=;
std::multiset<int,std::greater<int> >vs[N];
int as[N],bs[N];
int fa[N],sz[N],son[N],dep[N],top[N],id[N],idr[N],idp=;
int _l,_r,*Q[N],qp;
bool cmp(int*a,int*b){
return *a<*b;
}
void push(int*a){
Q[qp++]=a;
std::push_heap(Q,Q+qp,cmp);
}
struct node{
node*lc,*rc,*f;
int L,R;
int v[];
void init(int x){
int p=;
for(std::multiset<int>::iterator it=vs[x].begin();p<k&&it!=vs[x].end();v[p++]=*(it++));
for(;p<k;v[p++]=-);
}
void up(){
int p=,p1=,p2=,*v1=lc->v,*v2=rc->v;
while(p<k&&p1<k&&p2<k)v[p++]=v1[p1]>v2[p2]?v1[p1++]:v2[p2++];
while(p<k&&p1<k)v[p++]=v1[p1++];
while(p<k&&p2<k)v[p++]=v2[p2++];
}
void upds(){
for(node*w=f;w;w->up(),w=w->f);
}
void get(){
if(_l<=L&&R<=_r){
if(~v[])push(v);
return;
}
int M=L+R>>;
if(_l<=M)lc->get();
if(_r>M)rc->get();
}
}ns[N*],*np=ns,*rt[N],*pos[N];
node*build(int L,int R){
node*w=np++;
w->L=L;w->R=R;
memset(w->v,-,sizeof(w->v));
if(L!=R){
int M=L+R>>;
(w->lc=build(L,M))->f=
(w->rc=build(M+,R))->f=w;
w->up();
}else{
pos[idr[L]]=w;
w->init(idr[L]);
}
return w;
}
void f1(int w,int pa){
dep[w]=dep[fa[w]=pa]+;
sz[w]=;
for(int i=e0[w];i;i=enx[i]){
int u=es[i];
if(u!=pa){
f1(u,w);
sz[w]+=sz[u];
if(sz[u]>sz[son[w]])son[w]=u;
}
}
}
void f2(int w,int tp){
top[w]=tp;
idr[id[w]=++idp]=w;
if(son[w])f2(son[w],tp);
else rt[tp]=build(id[tp],id[w]);
for(int i=e0[w];i;i=enx[i]){
int u=es[i];
if(u!=fa[w]&&u!=son[w])f2(u,u);
}
}
int main(){
buf[fread(buf,,sizeof(buf),stdin)]=;
n=_();
for(int i=,a,b;i<n;++i){
a=_();b=_();
es[ep]=b;enx[ep]=e0[a];e0[a]=ep++;
es[ep]=a;enx[ep]=e0[b];e0[b]=ep++;
}
m=_();
for(int i=;i<=m;++i){
as[i]=_();bs[i]=_();
vs[bs[i]].insert(as[i]);
}
q=_();k=_();
f1(,);f2(,);
for(int i=,o,x,y;i<q;++i){
o=_();x=_();y=_();
if(o==){
qp=;
int a=top[x],b=top[y];
while(a!=b){
if(dep[a]<dep[b])std::swap(x,y),std::swap(a,b);
_l=id[a],_r=id[x],rt[a]->get();
x=fa[a];a=top[x];
}
if(dep[x]>dep[y])std::swap(x,y);
_l=id[x],_r=id[y],rt[top[x]]->get();
if(!qp)printf("-1");
for(int j=;j<k&&qp;++j){
int*p=Q[];
std::pop_heap(Q,Q+qp--,cmp);
printf("%d ",*p);
if(~*++p)push(p);
}
putchar();
}else if(o==){
vs[bs[x]].erase(vs[bs[x]].find(as[x]));
pos[bs[x]]->init(bs[x]);
pos[bs[x]]->upds();
vs[bs[x]=y].insert(as[x]);
pos[bs[x]]->init(bs[x]);
pos[bs[x]]->upds();
}else{
vs[bs[x]].erase(vs[bs[x]].find(as[x]));
vs[bs[x]].insert(as[x]=y);
pos[bs[x]]->init(bs[x]);
pos[bs[x]]->upds();
}
}
return ;
}
bzoj4336: BJOI2015 骑士的旅行的更多相关文章
- [BZOj4336][BJOI2015]骑士的旅行(树链剖分+线段树)
树链剖分,对每个叶子用multiset记录前K大士兵,其余节点通过从儿子归并维护前K大士兵.过于模板. #include<set> #include<cstdio> #incl ...
- 【vijos】1791 骑士的旅行(特殊的技巧)
https://vijos.org/p/1791 暴力的话只想到bfs,然后估计是状态超了才得20分. 噗,为啥暴力就不能想得简单点QAQ.....这种思想很好啊. 这一题我看了题解后不得不说我竟然没 ...
- 刷题总结——骑士的旅行(bzoj4336 树链剖分套权值线段树)
题目: Description 在一片古老的土地上,有一个繁荣的文明. 这片大地几乎被森林覆盖,有N座城坐落其中.巧合的是,这N座城由恰好N-1条双 向道路连接起来,使得任意两座城都是连通的.也就是说 ...
- bzoj4336 骑士的旅行 (树链剖分+multiset)
首先大概有一个树剖+树套树的做法,但我哪会写啊 然后发现k很小,如果用线段树记每个区间前k大的的话,可以O(k)地合并 而且一个点还有可能有好多个骑士,所以要用multiset维护一下 然后树剖就好啦 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- poj2488 A Knight's Journey
http://poj.org/problem?id=2488 题目大意:骑士厌倦了一遍又一遍地看到同样的黑白方块,于是决定去旅行. 世界各地.当一个骑士移动时,他走的是“日”字.骑士的世界是他赖以生存 ...
- 小结:bfs
概要: 我们在初始状态要到达终止状态可以沿着同深度的向下搜索,这样范围覆盖更广,在解的深度较小的时候十分适用. 技巧及注意: 所有状态在转移后如果要打标记一定要在进队列前打!不要在出队列才打!否则就是 ...
- [BFS]骑士旅行
骑士旅行 Description 在一个n m 格子的棋盘上,有一只国际象棋的骑士在棋盘的左下角 (1;1)(如图1),骑士只能根据象棋的规则进行移动,要么横向跳动一格纵向跳动两格,要么纵向跳动一格横 ...
- 【BZOJ4704】旅行 树链剖分+可持久化线段树
[BZOJ4704]旅行 Description 在Berland,有n个城堡.每个城堡恰好属于一个领主.不同的城堡属于不同的领主.在所有领主中有一个是国王,其他的每个领主都直接隶属于另一位领主,并且 ...
随机推荐
- Winform 导航菜单的方法
http://blog.163.com/kunkun0921@126/blog/static/169204332201171610619611/ 第一种:使用OutlookBar第三方控件 第二种:使 ...
- SSM整合AOP,日志框架和拦截器
前言 日志是所有系统必不可少的部分,而AOP在MVC通常用于监控方法调用,可以生成一个traceid,记录从用户调用到底层数据库的数据链路,帮助监控和排查问题. AOP 现在做一个简单的前置切面,用来 ...
- C# Http方式下载文件到本地类
直接上代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using S ...
- d3.js(v5.7)力导向图(关系图谱)
先上图,后面再一一解释: ok,为了方便理解,这里我就没有用之前封装的automatch函数来将数据和节点匹配了,如果你对enter(),exit()函数还不是很理解的话,请移步至我之前写的<n ...
- Python 使用 os.fork() 创建子进程
Linux 操作系统提供了一个 fork() 函数用来创建子进程,这个函数很特殊,调用一次,返回两次,因为操作系统是将当前的进程(父进程)复制了一份(子进程),然后分别在父进程和子进程内返回.子进程永 ...
- golang slice 与list 的性能分析。
一 · 比较slice 与 list 遍历创建和添加元素速度. package main import ( "time" "fmt" "contain ...
- NSStringFromSelector(_cmd)和self
1._cmd是隐藏的参数,代表当前方法的selector,他和self一样都是每个方法调用时都会传入的参数,动态运行时会提及如何传的这两个参数, 你在方法里加入CCLOG(@\"%@, %@ ...
- Chrome调试javacript禁止缓存
/********************************************************************* * Chrome调试javacript禁止缓存 * 说明: ...
- 【排序】快速排序,C++实现
原创博文,转载请注明出处! 本文代码的github地址 # 基本思想 ”快速排序“是对”冒泡排序“的改进. 基本原理:基于分治法,在待排线性表中取一个元素pivot作为枢轴值,通过一趟排序将待排线性表 ...
- 【剑指offer】n个骰子的点数,C++实现
# 题目 # 思路 # 代码