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个城堡.每个城堡恰好属于一个领主.不同的城堡属于不同的领主.在所有领主中有一个是国王,其他的每个领主都直接隶属于另一位领主,并且 ...
随机推荐
- Nginx+keepalived 脚本安装主从双机热备自动切换解决方案
Nginx+keepalived 脚本安装主从双机热备自动切换解决方案 2013-07-02 19:24:13 标签:filesnginx keepalived 原创作品,允许转载,转载时请务必以超链 ...
- C++中几个值得分析的小问题(2)
下面有3个小问题,作为C++ Beginner你一定要知道错在哪里了. 1.派生类到基类的引用或指针转换一定“完美”存在? 一般情况,你很可能会认为:派生类对象的引用或指针转换为基类对象的引用或指针是 ...
- New Concept English three(10)
The great ship, Titanic, sailed for New York from Southampton on April 10th, 1912. She was carrying ...
- Jquery如何获取ASP.NET服务器控件的值
关键字: Jquery 服务器控件 获取值 由于ASP.NET网页运行后,服务器控件会随机生成客户端id,jquery获取时候不太好操作,总结有以下3种方法: 服务器控件代码:<asp:Te ...
- jQuery选项卡wdScrollTab
实例Demo 运行一下 参数说明 Config active Number Active tab index. Base on 0. autoResizable Boolean Whether ...
- Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件
Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件 前面我写了一篇博文Shell 从日志文件中选择时间段内的日志输出到另一个文件,利用循环实现了我想要实现的内容. 但是用这个脚本的同 ...
- CBUS转MQTT
CBUS转MQTT,楼宇控制协议通过迈思德网关转MQTT
- Elasticsearch安装配置和测试
官方教程:https://www.elastic.co/guide/en/elasticsearch/reference/master/_installation.html 中文教程:https:// ...
- iOS开发-UITextView文字排版
UITextView文本排版 1.配置NSMutableParagraphStyle NSMutableParagraphStyle *MParaStyle = [[NSMutableParagrap ...
- Andriod4.2 Camera 架构与实现
1.Camera架构包括客户端和服务端,他们之间的通信采用Binder机制实现. Camera的实现主要包括本地代码和Java代码两个层次: Camera本地框架: frameworks/native ...