Description

你有一个长度为n 的排列P 与一个正整数K
你可以进行如下操作若干次使得排列的字典序尽量小
对于两个满足|i-j|>=K 且|Pi-Pj| = 1 的下标i 与j,交换Pi 与Pj

Solution

看到这种有绝对值的题,看那个绝对值不爽,想办法去掉,
设a[pi]=ia[p_i]=i,那么现在的问题就是相邻的数,如果差值大于等于k就可以交换,
那么,如果有两个位置i,j,保证i<ji,如果|ai−aj|<K|a_i-a_j|,那么,无论怎么变化,aia_i这个数都会在aja_j的前面,不会跑到后面去,

那么,就每个点往全局所有差值与它小于K的连边,跑一遍拓扑图,
因为现在我们的任务也是要这个序列尽量的小,那么我们就先求出这个序列,再转回答案序列,
每次就找到全局最小的数,保证它入度为0,即这个点已经没有什么点必须在它前面了,那么当前位置就选它,再把它连出的边全部删掉,

这样的复杂度是:O(n2)O(n^2)的,

优化

我们发现,其实只要连2条边即可,连向它右边第一个比它大的,差值小于K的,和第一个比它小的,差值小于K的,

先证明连向它右边第一个比它大的,差值小于K的即可,因为设当前位置为i,右边有两个位置j,k(a<b)j,k(a,保证aj−ai<Ka_j-a_i,ak−ai<Ka_k-a_i,那么肯定有|aj−ak|<K|a_j-a_k|,
也就是i在j前面,j在k前面,那么i在k前面这个条件显然没用,所以舍去,

那么全局只有2n条边,

复杂度:O(nlog(n))O(n\log(n))

Code

#include <cstdio>
#include <algorithm>
#include <queue>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fod(i,a,b) for(int i=a;i>=b;i--)
#define efo(i,q) for(int i=A[q];i;i=B[i][0])
using namespace std;
const int N=500500;
int read(int &n)
{char ch=' ';int q=0,w=1;for(;(ch!='-')&&((ch<'0')||(ch>'9'));ch=getchar());if(ch=='-')w=-1,ch=getchar();for(;ch>='0' && ch<='9';ch=getchar())q=q*10+ch-48;n=q*w;return n;
}
int m,n,ans;
int a[N];
int b[N*4];
int B[N*2][2],A[N],B0;
int b1[N],Ans[N];
priority_queue<int>d;
int min(int q,int w){return(q)>(w)?(w):(q);}
int max(int q,int w){return(q)<(w)?(w):(q);}
int find(int l,int r,int e,int l1,int r1)
{if(l1<=l&&r<=r1)return b[e];int t=(l+r)>>1;if(r1<=t)return find(l,t,e*2,l1,r1);else if(t<l1)return find(t+1,r,e*2+1,l1,r1);else return max(find(l,t,e*2,l1,t),find(t+1,r,e*2+1,t+1,r1));
}
void change(int l,int r,int e,int l1,int l2)
{if(l==r){b[e]=max(b[e],l2);return;}int t=(l+r)>>1;if(l1<=t)change(l,t,e*2,l1,l2);else change(t+1,r,e*2+1,l1,l2);b[e]=max(b[e*2],b[e*2+1]);
}
void link(int q,int w){B[++B0][0]=A[q],A[q]=B0,B[B0][1]=w,b1[w]++;}
int main()
{freopen("permutation.in","r",stdin);freopen("permutation.out","w",stdout);int q,w;read(n),read(m);fo(i,1,n)a[read(q)]=i;m--;fo(i,1,n){q=find(1,n,1,a[i],a[i]+m);if(q&&q<=n)link(a[q],a[i]);q=find(1,n,1,a[i]-m,a[i]);if(q&&q<=n)link(a[q],a[i]);change(1,n,1,a[i],i);}fo(i,1,n)if(!b1[i])d.push(-i);ans=0;for(;!d.empty();){q=-d.top();d.pop();efo(i,q)if(!(--b1[B[i][1]]))d.push(-B[i][1]);Ans[q]=++ans;}fo(i,1,n)printf("%d\n",Ans[i]);return 0;
}

【JZOJ 5405】【NOIP2017提高A组模拟10.10】Permutation相关推荐

  1. JZOJ 100035. 【NOIP2017提高A组模拟7.10】区间

    Description Input Output Sample Input sample1: 4 2 10 5 1 1 10 sample2: 1000 97 96998351 41 1668 505 ...

  2. JZOJ 5372. 【NOIP2017提高A组模拟9.17】猫

    Description 信息组最近猫成灾了!隔壁物理组也拿猫没办法.信息组组长只好去请神刀手来帮他们消灭猫.信息组现在共有n 只猫(n 为正整数),编号为1 到n,站成了一个环,第i 只猫的左边是第i ...

  3. JZOJ 5400. 【NOIP2017提高A组模拟10.7】Repulsed

    Description 小w 心里的火焰就要被熄灭了. 简便起见,假设小w 的内心是一棵n -1 条边,n 个节点的树. 现在你要在每个节点里放一些个灭火器,每个节点可以放任意多个. 接下来每个节点都 ...

  4. JZOJ 100026. 【NOIP2017提高A组模拟7.7】图

    Description 有一个n个点n条边的有向图,每条边为< i,f(i),w(i)>,意思是i指向f(i)的边权为w(i)的边,现在小A想知道,对于每个点的si和mi. si:由i出发 ...

  5. JZOJ 5379. 【NOIP2017提高A组模拟9.21】Victor爱数字

    Description Victor 是一名热爱数字的同学.他最近在思考这样一个问题: 一个字符串是回文的当且仅当它倒过来还和原来相同.那么如果一个数的数串没有一个长度超过1 的子串是回文串的话,它就 ...

  6. JZOJ 5405. 【NOIP2017提高A组模拟10.10】Permutation

    Description 你有一个长度为n 的排列P 与一个正整数K 你可以进行如下操作若干次使得排列的字典序尽量小 对于两个满足|i-j|>=K 且|Pi-Pj| = 1 的下标i 与j,交换P ...

  7. JZOJ 5404. 【NOIP2017提高A组模拟10.10】Graph

    Description 给定一张n个点m条边的无向图,每条边连接两个顶点,保证无重边自环,不保证连通 你想在这张图上进行若干次旅游,每次旅游可以任选一个点x作为起点,再走到一个与x 直接有边相连的点y ...

  8. JZOJ 5401. 【NOIP2017提高A组模拟10.8】Star Way To Heaven

    Description Input Output Sample Input 10 5 2 1 1 2 3 Sample Output 1.11803399 Data Constraint Soluti ...

  9. JZOJ 5398. 【NOIP2017提高A组模拟10.7】Adore

    Description 小w 偶然间见到了一个DAG. 这个DAG 有m 层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有k 个节点. 现在小w 每次可以取反第i(1 < i &l ...

最新文章

  1. vs如何将工程配置,保存到属性表
  2. 自己写的python软件可以在哪发布-如何发布一个Python命令行工具
  3. 施工企业项目管理的系统修炼_施工企业项目亏损的11个主观因素
  4. 关于JavaScript相关文章
  5. apache证书不受信任_苹果iOS手动安装和信任企业级应用
  6. mysql数据库架构_MySQL数据库之互联网常用架构方案
  7. matlab 建立ctruct,扩频通信系统及MATLAB仿真1
  8. Ubuntu12.04增加屏幕分辨率选项
  9. asp不能做到的是什么
  10. android jni javah,JAVAH找不到类(android ndk)
  11. 【过关斩将般的一步步实现】windows本机通过xftp/xshell连接Ubuntu虚拟机服务器
  12. win10修改git账号和密码
  13. Android开发-Service(服务)
  14. 研究生学习生活日记——未来三年的规划
  15. dns配置异常怎么修复_dns异常怎么修复【详细介绍】
  16. 只可顺守不可逆取书法_关于如何练字,分享给想练好书法的人
  17. 重装系统后必装的5大软件,让你大幅度提升工作效率
  18. Python小程序之购买商品
  19. 计算机右下角图标显示桌面快捷方式,Win7系统下让常用软件图标显示在电脑右下角的方法【图】...
  20. 树莓派4B【RaspBerry Pi 4 Model B】系统安装及配置教程

热门文章

  1. Java开发自学教程!kafka配置文件参数说明
  2. Knald - 1.2.1 烘培贴图,利用贴图转换成其他贴图   笔记
  3. [论文笔记] 大型车牌检测数据集CCPD 阅读笔记
  4. 聚焦终端边缘AI芯片 放弃走云端路线的耐能到底行不行?
  5. 数据结构 ---- 哈夫曼树****
  6. scratch-blocks教程(一)
  7. linux系统编程之信号(一):信号基本概述
  8. 【Dubbo实战】基础学习篇(一)
  9. 正则环视 php,php正则表达式环视详解
  10. AJAX如何将参数带到并传给另一个页面?