[atACL001F]Center Rearranging
有一个(比较显然又有点假的)结论:最优方案中(若存在),每一个数(指$3n$个)最多被移动1次
先$o(n^{2})$枚举移动到队首和队尾的操作次数(即目标状态的一个前缀和后缀),判定能否合法
首先,根据这个前缀和后缀的数字以及个数,可以确定每类数(指$n$类)的操作(但不能确定顺序),即可以知道操作了多少次$L$和$R$
(同时由于不同类的顺序是独立的,这就保证了这个前缀和后缀符合条件,考虑中间未被操作的部分)
其次,对于每一类数,将其$L$和$R$的操作次数组成二元组,分为以下几类:
(1)$(3,0)$和$(0,3)$,一定无解
(2)$(1,1)$,与顺序有关,未被操作数的位置可能是原序列中最左/最右的
(3)$(1,2)$和$(2,1)$,强制顺序(例如$(1,2)$必须先$L$),可以确定未被操作数的位置
(4)除此之外($(0,0)$、$(0,1)$和$(1,0)$),顺序无关(一共就1次)且可以确定未被操作数的位置
最后,考虑中间这些未被操作数的位置关系:
假设已经确定了未被操作数的位置(在目标状态中的),我们不需要算出具体的初始位置,比较相邻两数的对应位置是否满足单调性(因为未被操作的两数相对顺序不变)、操作的顺序是否有矛盾
(对应位置:根据目标状态以及二元组可以判断其在初始状态中是该类数中的第几个,初始状态中该类数的第“几”个即对应位置)
操作顺序的限制分为两类:1.对于第(2)(3)种情况,同一类数不同操作的限制;2.对于不同类数的同一种操作,距离1或$3n$越远的越优先,可以证明存在矛盾等价于存在4元环(点更多可以压缩)
还有$(1,1)$的情况,考虑2-sat连边,限制(边)同样有两类,每一类再分为确定点与非确定点、非确定点与非确定点两类讨论一下即可
判定时间复杂度为$o(n^{2})$,因此总复杂度为$o(n^{4})$,可以通过


1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 105
4 struct ji{
5 int nex,to;
6 }edge[N*N];
7 vector<int>vv,v[N];
8 int E,n,x,ans,a[N],mx[N],mn[N],sl[N],sr[N],s[N],p[N],head[N],vis[N];
9 void add(int x,int y){
10 edge[E].nex=head[x];
11 edge[E].to=y;
12 head[x]=E++;
13 }
14 void dfs(int k){
15 if (vis[k])return;
16 vis[k]=1;
17 for(int i=head[k];i!=-1;i=edge[i].nex)dfs(edge[i].to);
18 }
19 bool pd(int k){
20 memset(vis,0,sizeof(vis));
21 dfs(k);
22 return vis[k^1];
23 }
24 bool pd(int x,int y){
25 memset(sl,0,sizeof(sl));
26 memset(sr,0,sizeof(sr));
27 for(int i=1;i<=x;i++)sl[a[i]]++;
28 for(int i=y;i<=3*n;i++)sr[a[i]]++;
29 for(int i=1;i<=n;i++)
30 if ((sl[i]==3)||(sr[i]==3))return 0;
31 vv.clear();
32 memset(s,0,sizeof(s));
33 memset(p,0,sizeof(p));
34 p[x]=-1,p[y]=0x3f3f3f3f;
35 for(int i=x+1;i<y;i++){
36 if ((sl[a[i]]==1)&&(sr[a[i]]==1)){
37 vv.push_back(i);
38 continue;
39 }
40 if (!s[a[i]]){
41 p[i]=0;
42 if ((sl[a[i]]==2)&&(sr[a[i]]==0))p[i]=2;
43 }
44 if (s[a[i]]==1){
45 p[i]=2;
46 if ((!sl[a[i]])&&(!sr[a[i]]))p[i]=1;
47 }
48 if (s[a[i]]==2)p[i]=2;
49 p[i]=v[a[i]][p[i]];
50 if (p[i]<p[i-1])return 0;
51 s[a[i]]++;
52 }
53 for(int i=1;i<=n;i++)
54 if ((sl[i]==2)&&(sr[i]==1))
55 for(int j=1;j<=n;j++)
56 if ((sl[j]==1)&&(sr[j]==2)&&(mx[j]<mx[i])&&(mn[j]<mn[i]))return 0;
57 E=0;
58 memset(head,-1,sizeof(head));
59 for(int i=0;i<vv.size();i++){
60 if (p[vv[i]-1]){
61 if (v[a[vv[i]]][2]<p[vv[i]-1])return 0;
62 if (v[a[vv[i]]][0]<p[vv[i]-1])add(2*i,2*i+1);
63 }
64 else{
65 if (v[a[vv[i]]][2]<v[a[vv[i]-1]][0])return 0;
66 if (v[a[vv[i]]][2]<v[a[vv[i]-1]][2])add(2*i+1,2*i-2);
67 if (v[a[vv[i]]][0]<v[a[vv[i]-1]][0])add(2*i,2*i+1);
68 else
69 if (v[a[vv[i]]][0]<v[a[vv[i]-1]][2])add(2*i,2*i-2);
70 }
71 if (p[vv[i]+1]){
72 if (v[a[vv[i]]][0]>p[vv[i]+1])return 0;
73 if (v[a[vv[i]]][2]>p[vv[i]+1])add(2*i+1,2*i);
74 }
75 else{
76 if (v[a[vv[i]]][0]>v[a[vv[i]+1]][2])return 0;
77 if (v[a[vv[i]]][0]>v[a[vv[i]+1]][0])add(2*i,2*i+3);
78 if (v[a[vv[i]]][2]>v[a[vv[i]+1]][2])add(2*i+1,2*i);
79 else
80 if (v[a[vv[i]]][2]>v[a[vv[i]+1]][0])add(2*i+1,2*i+3);
81 }
82 }
83 for(int i=1;i<=n;i++)
84 if ((sl[i]==2)&&(sr[i]==1))
85 for(int j=0;j<vv.size();j++)
86 if ((mx[a[vv[j]]]<mx[i])&&(mn[a[vv[j]]]<mn[i]))add(2*j+1,2*j);
87 for(int i=1;i<=n;i++)
88 if ((sl[i]==1)&&(sr[i]==2))
89 for(int j=0;j<vv.size();j++)
90 if ((mx[a[vv[j]]]>mx[i])&&(mn[a[vv[j]]]>mn[i]))add(2*j,2*j+1);
91 for(int i=0;i<vv.size();i++)
92 for(int j=0;j<vv.size();j++)
93 if ((i!=j)&&(mx[a[vv[j]]]<mx[a[vv[i]]])&&(mn[a[vv[j]]]<mn[a[vv[i]]])){
94 add(2*i,2*j);
95 add(2*j+1,2*i+1);
96 }
97 for(int i=0;i<vv.size();i++)
98 if ((pd(2*i))&&(pd(2*i+1)))return 0;
99 return 1;
100 }
101 int main(){
102 scanf("%d",&n);
103 for(int i=1;i<=3*n;i++){
104 scanf("%d",&x);
105 v[x].push_back(i);
106 }
107 for(int i=1;i<=3*n;i++){
108 scanf("%d",&a[i]);
109 if (!mn[a[i]])mn[a[i]]=i;
110 mx[a[i]]=i;
111 }
112 ans=0x3f3f3f3f;
113 for(int i=0;i<=3*n;i++)//[1,i]
114 for(int j=3*n+1;j>i;j--)//[j,3*n]
115 if ((i+3*n-j+1<ans)&&(pd(i,j)))ans=i+3*n-j+1;
116 if (ans==0x3f3f3f3f)ans=-1;
117 printf("%d",ans);
118 }
[atACL001F]Center Rearranging的更多相关文章
- easyUI 如何不跳转页面,只是加载替换center部分内容
以前做的一个故障报修系统,前端框架使用easyUI框架,layout布局,center使用datagrid .点击左边树形菜单时时页面跳转,想要知道如何点击菜单时不进行页面跳转,而是只对center模 ...
- text-align=center 失效原因
text-align属性是针对 内联元素居中得属性设置,对于块状元素使用margin:0 auto;来控制居中: 笔者在设置一个h2标签时设置了text-align:center;但是却始终出现在中间 ...
- Thinkstation center M8600t装RHEL7不能联网,网卡驱动没装问题
Thinkstation center M8600t装RHEL7时不能联网,配置ip也不可以,后来发现网卡驱动没有安装.可以通过装网卡驱动的方式解决问题,解决方法如下: root登录 lspci | ...
- Radmin Center 1.54 测试版
软件简介:radmin center 用于集中管理安装了 radmin server 的服务器,支持一键远程管理,数据全部本地存储,关键数据使用RC4变形加密.同时保留了radmin的高安全性和高易用 ...
- margin:0 auto 与 text-align:center
1.text-align:通过指定行框与哪个点对齐,从而设置块级元素内文本的水平对齐方式; text-align:center 设置文本或img标签等一些内联对象的居中. 2.m ...
- margin:0 auto 与 text-align:center 的区别
基本概念: 1.text-align: 属性规定元素中的文本的水平对齐方式; 该属性通过指定行框与哪个点对齐,从而设置块级元素内文本的水平对齐方式; 一般情况下设置文本对齐方式的时使用此属性.支 ...
- [XAF] How to set List View Columns Title Customization align center?
https://www.devexpress.com/Support/Center/Question/Details/T423138
- iOS--------坐标系统(UIView的frame、bounds跟center属性)
1.概要翻开ios官方开发文档,赫然发现上面对这三个属性的解释如下: frame:描述当前视图在其父视图中的位置和大小. bounds:描述当前视图在其自身坐标系统中的位置和大小. center:描述 ...
- ligerUI布局时,Center中的Tab高度太小问题解决
1.0 引用的js,css <link href="/Content/scripts/ligerUI/skins/Aqua/css/ligerui-all.css" rel= ...
随机推荐
- 洛谷2543AHOI2005]航线规划 (树剖+线段树+割边思路)
这个题的思路还是比较巧妙的. 首先,我们发现操作只有删除和询问两种,而删除并不好维护连通性和割边之类的信息. 所以我们不妨像WC2006水管局长那样,将询问离线,然后把操作转化成加边和询问. 然后,我 ...
- DFS与BFS题解:[kaungbin]带你飞 简单搜索 解题报告
DFS and BFS 在解题前我们还是大致讲一下dfs与bfs的.(我感觉我不会bfs) 1.DFS dfs(深度优先算法) 正如其名,dfs是相当的深度,不走到最深处绝不回头的那种. 深度优先搜 ...
- 图解Redis6中的9种数据结构,墙裂建议准备去面试的人先看(干货,建议收藏)
如图所示,Redis中提供了9种不同的数据操作类型,他们分别代表了不同的数据存储结构. 图2-17 数据类型 String类型 String类型是Redis用的较多的一个基本类型,也是最简单的一种类型 ...
- logging模块二
背景,在学习logging时总是遇到无法理解的问题,总结,尝试一下更清晰明了了,让我们开始吧! logging模块常用format格式说明 %(levelno)s: 打印日志级别的数值 %(level ...
- Java:泛型小记
Java:泛型小记 对 Java 中的 泛型类,做一个微不足道的小小小小记 泛型实现 概述 开篇: List<String> l1 = new ArrayList<String> ...
- [no_code][Beta]项目展示博客
$( "#cnblogs_post_body" ).catalog() 团队项目链接 Beta阶段核心开发点: github 前端 github 后端 github OCR文档-含 ...
- BUAA软件工程结对项目作业
BUAA软件工程结对项目 小组成员:16005001,17373192 1.教学班级和项目地址 项目 内容 这个作业属于哪个课程 博客园班级连接 这个作业的要求在哪里 结对项目作业 我在这个课程的目标 ...
- FastAPI 学习之路(三十四)数据库多表操作
之前我们分享的是基于单个的数据库表的操作,我们在设计数据库的时候也设计了跨表,我们可以看下数据库的设计. class User(Base): __tablename__ = "users&q ...
- (四)、Docker 镜像
1.Docker镜像是什么? 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码.运行时.库.环境变量和配置文件. 2.Do ...
- 「总结」$dp1$
大概就是做点题. 先列一下要做的题目列表,从\(UOJ\)上找的. 129寿司晚宴 348州区划分 370滑稽树上滑稽果 457数树 22外星人 37主旋律 300吉夫特 196线段树 311积劳成疾 ...