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个城堡.每个城堡恰好属于一个领主.不同的城堡属于不同的领主.在所有领主中有一个是国王,其他的每个领主都直接隶属于另一位领主,并且 ...
随机推荐
- bzoj4945
题解: 一眼看过去还以为是3-sat 其实d只有8 那么我们可以枚举每一个x选择哪一个 然后再用2-sat处理 代码: #include<bits/stdc++.h> using name ...
- HDU 5875 Function (线段树+gcd / 单调栈)
题意:给你一串数a再给你一些区间(lef,rig),求出a[lef]%a[lef+1]...%a[rig] 题解:我们可以发现数字a对数字b取模时:如果a<b,则等于原数,否则a会变小至少一半. ...
- MySQL Block Nested-Loop Join(BNL)
5.5 版本之前,MySQL本身只支持一种表间关联方式,就是嵌套循环(Nested Loop).如果关联表的数据量很大,则join关联的执行时间会非常长.在5.5以后的版本中,MySQL通过引入BNL ...
- 说说C++多重继承
尽管大多数应用程序都使用单个基类的公用继承,但有些时候单继承是不够用的,因为可能无法为问题域建模或对模型带来不必要的复杂性.在这种情况下,多重继承可以更直接地为应用程序建模. 一.基本概念 多重继承是 ...
- iOS 阶段学习第三天笔记(运算符)
iOS学习(C语言)知识点整理笔记 1.运算符 一.算术运算符 1)表达式由变量.常量.运算符构成,有确定的类型和值 2)算术运算符包括: +(加),-(减),*(乘),/(除),%(模) 3)算术运 ...
- Xen,VMware ESXi,Hyper-V和KVM等虚拟化技术的原理解析
Xen,VMware ESXi,Hyper-V和KVM等虚拟化技术的原理解析 2018年04月03日 13:51:55 阅读数:936 XEN 与 VMware ESXi,Hyper-V 以及 K ...
- Selenium实现右键保存图片(Java)
1.代码 public class SaveImage extends TestCase { private WebDriver driver; private Actions action; pri ...
- 那些年提交AppStore审核踩过的坑
此文刚刚上了CocoaChina的首页:那些年提交AppStore审核踩过的坑 欢迎围观,谢谢大家支持. //add by 云峰小罗,2016.08.04 做iOS开发近5年了,每次提交版本时不可谓 ...
- Java [Leetcode 167]Two Sum II - Input array is sorted
题目描述: Given an array of integers that is already sorted in ascending order, find two numbers such th ...
- 使用jenkins持续集成自动化测试
本文采用Springboot开发一个简易的添加个人资料和查询个人资料接口,并采用testng进行测试,使用jenkis进行持续继承,allure输出测试报告. 个人资料查询接口开发(集成H2数据库) ...