给出的模型很难搞,所以转换一下,记p[i]为i这个数的位置,然后相邻两个p值差>k的能交换,发现使原问题字典序最小也需要使这里的字典序最小

注意到p值差<=k的前后顺序一定不変,那么可以n^2建图用堆跑最小字典序拓扑序

考虑优化,每个点需要向[p[i]-k+1,p[i]+k-1]这段区间的数连边,但是有一些边是多余的,也就是区间[p[i]-k+1,p[i]],[p[i],p[i]+k-1]这两个区间内的数一定两两有边所以连向当前点后面最近的一个即可,这个用线段树来找

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int N=3000005;
int n,k,a[N],p[N],h[N],cnt,d[N],tot;
struct xds
{
int l,r,p;
}t[N];
struct qwe
{
int ne,to;
}e[N];
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
void build(int ro,int l,int r)
{
t[ro].l=l,t[ro].r=r,t[ro].p=n+1;
if(l==r)
return;
int mid=(l+r)>>1;
build(ro<<1,l,mid);
build(ro<<1|1,mid+1,r);
}
void update(int ro,int p,int v)
{
if(t[ro].l==t[ro].r)
{
t[ro].p=v;
return;
}
int mid=(t[ro].l+t[ro].r)>>1;
if(p<=mid)
update(ro<<1,p,v);
else
update(ro<<1|1,p,v);
t[ro].p=min(t[ro<<1].p,t[ro<<1|1].p);
}
int ques(int ro,int l,int r)
{
if(t[ro].l==l&&t[ro].r==r)
return t[ro].p;
int mid=(t[ro].l+t[ro].r)>>1;
if(r<=mid)
return ques(ro<<1,l,r);
else if(l>mid)
return ques(ro<<1|1,l,r);
else
return min(ques(ro<<1,l,mid),ques(ro<<1|1,mid+1,r));
}
void add(int u,int v)
{//cerr<<u<<" "<<v<<endl;
cnt++;
e[cnt].ne=h[u];
e[cnt].to=v;
d[v]++;
h[u]=cnt;
}
int main()
{
n=read(),k=read();
for(int i=1;i<=n;i++)
a[i]=read(),p[a[i]]=i;
build(1,1,n);
for(int i=n;i>=1;i--)
{
int x=ques(1,p[i],min(n,p[i]+k-1)),y=ques(1,max(1,p[i]-k+1),p[i]);
if(x<=n)
add(p[i],p[x]);
if(y<=n)
add(p[i],p[y]);
update(1,p[i],i);
}
priority_queue<int,vector<int>,greater<int> >q;
for(int i=1;i<=n;i++)
if(!d[i])
q.push(i);
while(!q.empty())
{
int u=q.top();
p[++tot]=u;
q.pop();
for(int i=h[u];i;i=e[i].ne)
if(!(--d[e[i].to]))
q.push(e[i].to);
}
for(int i=1;i<=n;i++)
a[p[i]]=i;
for(int i=1;i<=n;i++)
printf("%d\n",a[i]);
return 0;
}

AGC001 F - Wide Swap【线段树+堆+拓扑排序】的更多相关文章

  1. AtCoder AGC001F Wide Swap (线段树、拓扑排序)

    题目链接: https://atcoder.jp/contests/agc001/tasks/agc001_f 题解: 先变成排列的逆,要求\(1\)的位置最小,其次\(2\)的位置最小,依次排下去( ...

  2. 【AtCoder Grand Contest 001F】Wide Swap [线段树][拓扑]

    Wide Swap Time Limit: 50 Sec  Memory Limit: 512 MB Description Input Output Sample Input 8 3 4 5 7 8 ...

  3. Atcoder Grand Contest 001 F - Wide Swap(拓扑排序)

    Atcoder 题面传送门 & 洛谷题面传送门 咦?鸽子 tzc 来补题解了?奇迹奇迹( 首先考虑什么样的排列可以得到.我们考虑 \(p\) 的逆排列 \(q\),那么每次操作的过程从逆排列的 ...

  4. BZOJ4699 树上的最短路(最短路径+dfs序+线段树+堆+并查集)

    首先一般化的将下水道和塌陷看成一个东西.注意到在从源点出发的所有需要使用某条下水道的最短路径中,该下水道只会被使用一次,该下水道第一个被访问的点相同,且只会在第一个访问的点使用该下水道.这个第一个访问 ...

  5. BZOJ4538 HNOI2016网络(树链剖分+线段树+堆/整体二分+树上差分)

    某两个点间的请求只对不在这条路径上的询问有影响.那么容易想到每次修改除该路径上的所有点的答案.对每个点建个两个堆,其中一个用来删除,线段树维护即可.由于一条路径在树剖后的dfs序中是log个区间,所以 ...

  6. BZOJ4946[Noi2017]蔬菜——线段树+堆+模拟费用流

    题目链接: [Noi2017]蔬菜 题目大意:有$n$种蔬菜,每种蔬菜有$c_{i}$个,每种蔬菜每天有$x_{i}$个单位会坏掉(准确来说每天每种蔬菜坏掉的量是$x_{i}-$当天这种蔬菜卖出量), ...

  7. BZOJ5462 APIO2018新家(线段树+堆)

    一个显然的做法是二分答案后转化为查询区间颜色数,可持久化线段树记录每个位置上一个同色位置,离线后set+树状数组套线段树维护.这样是三个log的. 注意到我们要知道的其实只是是否所有颜色都在该区间出现 ...

  8. 【BZOJ4504】K个串 可持久化线段树+堆

    [BZOJ4504]K个串 Description 兔子们在玩k个串的游戏.首先,它们拿出了一个长度为n的数字序列,选出其中的一个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只被统计 ...

  9. 【BZOJ4631】踩气球 链表+线段树+堆

    [BZOJ4631]踩气球 Description 六一儿童节到了, SHUXK 被迫陪着M个熊孩子玩一个无聊的游戏:有N个盒子从左到右排成一排,第i个盒子里装着Ai个气球. SHUXK 要进行Q次操 ...

随机推荐

  1. js添加方法和邦定事件

    function(obj,objArr){ if(($(obj).attr("type") == "checkbox" && $j(obj).p ...

  2. JAVA 水果机游戏及编码

    [转自 http://tech.it168.com/j/2007-11-07/200711070910328_1.shtml] 3.      游戏的开发与编码 在我们开发这个游戏之前,我们先讲一个这 ...

  3. 【linux】记录一次系统被攻击的处理过程

    今天登录zabbix监控网页的时候发现非常卡,登录到系统里面以后,通过top看,CPU已经100%了,有一个叫做httpds的进程占用,第一反映就是系统被入侵了,下面记录了处理过程,仅供各位参考 通过 ...

  4. Java for LeetCode 087 Scramble String

    Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...

  5. Vue-router进阶、单页面应用(SPA)带来的问题

    一 . vue-router 进阶 回顾学过的vue-router,并参考官方文档学习嵌套路由等路由相关知识. 二 . 单页面应用(SPA)带来的问题 1 . 虽然单页面应用有优点 , 但是,如果后端 ...

  6. ios点击链接直接跳转到 App Store 指定应用下载页面

    //跳转到应用页面 NSString  *str = [NSString stringWithFormat:@"http://itunes.apple.com/us/app/id%d&quo ...

  7. BZOJ 2142 礼物 数论

    这道题是求组合数终极版. C(n,m) mod P n>=1e9 m>=1e9 P>=1e9且为合数且piqi<=1e5 拓展lucas定理. 实际上就是一点数论小知识的应用. ...

  8. 白话 P-value

    准备再尝试一下,用大白话叙述一遍统计推断中最基础的东西(假设检验.P值.……),算是把这段时间的阅读和思考做个梳理(东西不难,思考侧重在如何表述和展示).这次打算用一种“迂回的”表达方式,比如,本文从 ...

  9. 简单的可兼容所有浏览器的操作html元素的javascript框架

    1.根据id名称取元素  $id(idName) 2.根据class定义取元素  $class(className)返回所有class被定义成className的元素数组,或者$Eclass(clas ...

  10. Ajax不能接受php return值的原因

    PHP在处理ajax返回值的时候,如果使用return如 return $result会失败,echo $result却没问题.解释原因如下: 1.ajax请求从服务器端读取返回值,而且这些返回值必须 ...