[atAGC001F]Wide Swap
结论:排列$p'_{i}$可以通过排列$p_{i}$得到当且仅当$\forall 1\le i<j<i+k,(p_{i}-p_{j})(p'_{i}-p'_{j})>0$
证明:构造$b_{p_{i}}=i$,交换即令$b_{i}$与$b_{i+1}$交换,条件为$|b_{i}-b_{i+1}|\ge k$,那么对于$x<y$的$|b_{x}-b_{y}|<k$,相对位置不会发生改变,同时其他位置可以任意交换,反映在$p'_{i}$上即$p'_{b_{x}}$和$p'_{b_{y}}$的相对大小不会改变,即得证
考虑从$n$到$1$依次填数,统计每一个位置上$cnt_{i}=\sum_{j=\max(i-k+1,1)}^{\min(i+k-1,n)}[p_{i}<p_{j}]$,然后不断找到最后一个$cnt_{i}$为0且未被填过的位置填$i$,并将其左右长度为$2k-1$的区间的$cnt_{i}$减1
先考虑贪心填$n$的正确性,由于这些位置之间的距离必然大于$k$(否则不可能同时$cnt_{i}=0$),那么当$n$填在了不是最后一个的位置,两者交换必然更优
之后的问题相当于当前问题的子问题,已经填过的位置可以看作最小的(因为已经对之前的-1),那么新的最大值$n-1,n-2,...$的填法与$n$相同
那么用线段树来维护,相当于支持:1.区间-1;2.查询最后一个0,为了方便查询,可以将填写后的$cnt_{i}$置为$\infty
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 500005
4 #define L (k<<1)
5 #define R (L+1)
6 #define mid (l+r>>1)
7 int n,k,x,a[N],cnt[N],ans[N],f[N<<3],tag[N<<3];
8 void upd(int k,int x){
9 tag[k]+=x;
10 f[k]+=x;
11 }
12 void down(int k){
13 upd(L,tag[k]);
14 upd(R,tag[k]);
15 tag[k]=0;
16 }
17 void update(int k,int l,int r,int x){
18 if (l==r){
19 f[k]=1;
20 return;
21 }
22 if (x<=mid)update(L,l,mid,x);
23 else update(R,mid+1,r,x);
24 f[k]=f[L]+f[R];
25 }
26 int query(int k,int l,int r,int x,int y){
27 if ((l>y)||(x>r))return 0;
28 if ((x<=l)&&(r<=y))return f[k];
29 return query(L,l,mid,x,y)+query(R,mid+1,r,x,y);
30 }
31 void update(int k,int l,int r,int x,int y,int z){
32 if ((l>y)||(x>r))return;
33 if ((x<=l)&&(r<=y)){
34 upd(k,z);
35 return;
36 }
37 down(k);
38 update(L,l,mid,x,y,z);
39 update(R,mid+1,r,x,y,z);
40 f[k]=min(f[L],f[R]);
41 }
42 int find(int k,int l,int r){
43 if (l==r)return l;
44 down(k);
45 if (!f[R])return find(R,mid+1,r);
46 return find(L,l,mid);
47 }
48 int main(){
49 scanf("%d%d",&n,&k);
50 for(int i=1;i<=n;i++){
51 scanf("%d",&x);
52 a[x]=i;
53 }
54 for(int i=n;i;i--){
55 cnt[i]=query(1,1,n,max(a[i]-k+1,1),min(a[i]+k-1,n));
56 update(1,1,n,a[i]);
57 }
58 memset(f,0,sizeof(f));
59 for(int i=1;i<=n;i++)update(1,1,n,a[i],a[i],cnt[i]);
60 for(int i=n;i;i--){
61 int l=find(1,1,n);
62 ans[l]=i;
63 update(1,1,n,l,l,0x3f3f3f3f);
64 update(1,1,n,max(l-k+1,1),min(l+k-1,n),-1);
65 }
66 for(int i=1;i<=n;i++)printf("%d\n",ans[i]);
67 }
[atAGC001F]Wide Swap的更多相关文章
- 【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 ...
- AT1984 Wide Swap
AT1984 Wide Swap 题意翻译 给出一个元素集合为\(\{1,2,\dots,N\}(1\leq N\leq 500,000)\)的排列\(P\),当有\(i,j(1\leq i<j ...
- AtCoder AGC001F Wide Swap (线段树、拓扑排序)
题目链接: https://atcoder.jp/contests/agc001/tasks/agc001_f 题解: 先变成排列的逆,要求\(1\)的位置最小,其次\(2\)的位置最小,依次排下去( ...
- AGC001F - Wide Swap
Description 给你一个长度为$n$的排列,每次可以交换$|i-j|\geq K$并且$|a_i-a_j|=1$的数对,问你经过若干次变换后最小字典序的排列是啥 Solution 对$a$做一 ...
- AGC001 F - Wide Swap【线段树+堆+拓扑排序】
给出的模型很难搞,所以转换一下,记p[i]为i这个数的位置,然后相邻两个p值差>k的能交换,发现使原问题字典序最小也需要使这里的字典序最小 注意到p值差<=k的前后顺序一定不変,那么可以n ...
- AtCoder Grand Contest 001F Wide Swap
解法参考这位大佬的:https://www.cnblogs.com/BearChild/p/7895719.html 因为原来的数组不好做于是我们想反过来数组,根据交换条件:值相邻且位置差大于等于k, ...
- 题解 Wide Swap
题目传送门 题目大意 给出一个长度为 \(n\) 的排列 \(a_{1,2,...,n}\) 以及常数 \(k\),每次可以交换两个数 \(a_i,a_j\) 当且仅当 \(j-i\ge k \tex ...
- Atcoder Grand Contest 001 F - Wide Swap(拓扑排序)
Atcoder 题面传送门 & 洛谷题面传送门 咦?鸽子 tzc 来补题解了?奇迹奇迹( 首先考虑什么样的排列可以得到.我们考虑 \(p\) 的逆排列 \(q\),那么每次操作的过程从逆排列的 ...
- RE:从零开始的AGC被虐(到)生活(不能自理)
RE:从零开始的AGC被虐(到)生活(不能自理) 「一直注视着你,似近似远,总是触碰不到.」 --来自风平浪静的明天 AtCoder Grand Contest 001 B: Mysterious L ...
随机推荐
- IL合集
由于之前写的表达式树合集,未编写任何注释且是以图片的形式展现给大家,在这里向各位看官道歉了,接下来为大家奉上新鲜出炉的香喷喷的IL合集,后面会持续更新,各位看官点关注不迷路,之前答应的手写IOC以及多 ...
- 【分享】 一款自用的Anki卡片模板:黄子涵单词卡片 v1
[分享] 一款自用的Anki卡片模板:黄子涵单词卡片 v1 说明 第一代的功能 主要有两部分组成:英文和含义,目前主要是为自己记忆Web前端一些常用的单词而服务 有美美哒背景图,本来想修改为随机背景图 ...
- 分布式应用开发 | SpringBoot+dubbo+zookeeper实现服务注册发现 | 远程服务调用
前言 通过新建两个独立服务--提供者.消费者,模拟两个独立分布的应用,通过使用dubbo+zookeeper来实现远程服务调用. 目录 项目搭建 provider-server consumer-se ...
- python单例模式设计
class MyTest(): my_obj = None def __new__(cls,*args,**kwargs): if not cls.my_obj: cls.my_obj =object ...
- Netty 进阶
1. 粘包与半包 1.1 粘包现象 服务端代码 public class HelloWorldServer { static final Logger log = LoggerFactory.getL ...
- 利用ps在光污染地图上寻找最近的观星地区
城市灯光对于天文观测和天文摄影是有害的,进行这两类活动之前应提前规划地点,下面是笔者尝试的一种利用ps在光污染地图上进行规划的方法. 目前大部分的光污染地图都是基于WA 2015绘制的,可以结合VII ...
- 初学Python-day13 文件处理1
IO操作 一.os模块 作用:包含了操作系统的基本功能,提供了非常丰富的用来处理文件和目录的函数或方法. 1.属性 函数名 函数说明 name 获取操作系统的类型 uname 获取操作系统的信息(li ...
- Less-32 宽字节
<!-- 下午整了半天Less-29~31,愣是没调好jsp环境,只好跳过. 难受.jpg !--> Less-32: 核心语句: 各种回显均存在. 第一句话指定了字符集为gbk. che ...
- [对对子队]事后总结Beta
设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 要做一个游戏,定义的很清楚,实现出来的效果贴近定义,对用户和场景有清晰描述 我们达到目标了么(原计划的功 ...
- [敏捷软工团队博客]Beta阶段使用指南
软件工程教学实践平台使用指南 项目地址:http://20.185.223.195:8000/ 项目团队:the agiles 进入界面如图: 目录 软件工程教学实践平台使用指南 学生端 登录 iss ...