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个城堡.每个城堡恰好属于一个领主.不同的城堡属于不同的领主.在所有领主中有一个是国王,其他的每个领主都直接隶属于另一位领主,并且 ...
随机推荐
- C++多线程2.beginthread
C++ 多线程2 beginthread 启动线程知识 20131021 Reference: http://blog.csdn.net/laoyang360/article/details/7720 ...
- Prism 4 文档 ---第6章 高级MVVM场景
在上一章中描述了如何通过将UI,表现逻辑,业务逻辑分别放到三个单独的类中(View,View Model,Model),实现这些类之间的交互(通过数据绑定,命令以及数据验证接口)以及实现一个策 ...
- Personal Introduction
专业:计算机科学与技术 我是博客园的新人,虽然接触编程世界只有一年,基础知识比较差,编程能力差,但对于这个专业,我还是充满兴趣,希望有一天能独当一面,从今天起,我将分享一些在学习web前端和其他方面的 ...
- ZOJ 2971 Give Me the Number (模拟,字符数组的清空+map)
Give Me the Number Time Limit: 2 Seconds Memory Limit: 65536 KB Numbers in English are written ...
- Java发送短信
1.接口使用介绍 发送短信肯定需要使用第三方接口,Java本身是肯定不能直接发送短信的.第三方接口有很多,这里直接找个正规靠谱一点的学习一下 这里使用了中国网建(http://sms.webchine ...
- C++复制控制:赋值操作符和析构函数
一.赋值操作符 类定义了该类型对象赋值时会发生什么.与拷贝构造函数一样,如果类没有定义自己的赋值操作符,编译器会合成一个. 1.重载操作符的简单介绍 重载操作符是一些函数,其名字为operator后跟 ...
- Vim使用Vundle管理插件(转)
转自:http://os.51cto.com/art/201507/484174.htm Vim是Linux上一款用途广泛的轻量级文本编辑工具.虽然对普通的Linux用户来说开始学用起来难度相当大,但 ...
- Win10 64位系统ADO方式操作数据库失败解决方法
VC操作Access数据库一般通过ODBC.ADO.DAO等方式,但在我的Win10 64位操作系统中,通过ADO方式操作数据库会失败,无法读取数据.解决方法:1.首先确保Win10操作系统ado目录 ...
- Modules(最小树形图)
题目链接: Modules 描述 蒜头有一块主板,为了提升其性能,可在主板上安置若干增强模块.蒜头有n个不同的增强模块,增强模块可以直接安置在主板上,也可以安置在已经直接或间接连接在主板上的其他增强模 ...
- CSS 文本垂直居中对齐
文本垂直居中对齐是一个很常见的问题,这里总结一下. 一.容器高度固定,单行文本垂直居中对齐 height:20px; line-height:20px; overflow:hidden; 二.容器高度 ...