有一个(比较显然又有点假的)结论:最优方案中(若存在),每一个数(指$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的更多相关文章

  1. easyUI 如何不跳转页面,只是加载替换center部分内容

    以前做的一个故障报修系统,前端框架使用easyUI框架,layout布局,center使用datagrid .点击左边树形菜单时时页面跳转,想要知道如何点击菜单时不进行页面跳转,而是只对center模 ...

  2. text-align=center 失效原因

    text-align属性是针对 内联元素居中得属性设置,对于块状元素使用margin:0 auto;来控制居中: 笔者在设置一个h2标签时设置了text-align:center;但是却始终出现在中间 ...

  3. Thinkstation center M8600t装RHEL7不能联网,网卡驱动没装问题

    Thinkstation center M8600t装RHEL7时不能联网,配置ip也不可以,后来发现网卡驱动没有安装.可以通过装网卡驱动的方式解决问题,解决方法如下: root登录 lspci |  ...

  4. Radmin Center 1.54 测试版

    软件简介:radmin center 用于集中管理安装了 radmin server 的服务器,支持一键远程管理,数据全部本地存储,关键数据使用RC4变形加密.同时保留了radmin的高安全性和高易用 ...

  5. margin:0 auto 与 text-align:center

    1.text-align:通过指定行框与哪个点对齐,从而设置块级元素内文本的水平对齐方式;            text-align:center 设置文本或img标签等一些内联对象的居中. 2.m ...

  6. margin:0 auto 与 text-align:center 的区别

    基本概念: 1.text-align: 属性规定元素中的文本的水平对齐方式;   该属性通过指定行框与哪个点对齐,从而设置块级元素内文本的水平对齐方式;  一般情况下设置文本对齐方式的时使用此属性.支 ...

  7. [XAF] How to set List View Columns Title Customization align center?

    https://www.devexpress.com/Support/Center/Question/Details/T423138

  8. iOS--------坐标系统(UIView的frame、bounds跟center属性)

    1.概要翻开ios官方开发文档,赫然发现上面对这三个属性的解释如下: frame:描述当前视图在其父视图中的位置和大小. bounds:描述当前视图在其自身坐标系统中的位置和大小. center:描述 ...

  9. ligerUI布局时,Center中的Tab高度太小问题解决

    1.0 引用的js,css <link href="/Content/scripts/ligerUI/skins/Aqua/css/ligerui-all.css" rel= ...

随机推荐

  1. t-SNE算法

    t-SNE 算法 前言 t-SNE(t-distributed stochastic neighbor embedding) 是用于降维的一种机器学习算法,由 Laurens van der Maat ...

  2. 给力!斩获 GitHub 14000 Star,两周创办开源公司获数百万美元融资

    文章来源|AI科技大本营 作者|伍杏玲 上世纪 90 年代初,21 岁大学生 Linus Torvalds 开源 Linux 操作系统,自此掀起全球开源浪潮.随后"中国 Linux 第一人& ...

  3. css3新增文本属性

    css3新增属性 边框属性 背景属性 文本属性 颜色属性 文本属性 属性 说明 text-shadow 为文字添加阴影 box-shadow 在元素的框架上添加阴影效果 text-overflow 确 ...

  4. GoLang设计模式11 - 备忘录模式

    备忘录模式是一种行为型设计模式.这种模式允许我们保存对象在某些关键节点时的必要信息,以便于在适当的时候可以将之恢复到之前的状态.通常它可以用来帮助设计撤销/恢复操作. 下面是备忘录设计模式的主要角色: ...

  5. 后缀自动机(SAM)奶妈式教程

    后缀自动机(SAM) 为了方便,我们做出如下约定: "后缀自动机" (Suffix Automaton) 在后文中简称为 SAM . 记 \(|S|\) 为字符串 \(S\) 的长 ...

  6. Linux中使用dd制作文件的.img

    dd if=/dev/zero of=new_img.img bs=1M count=20   //生成20M的文件,bs块的大小,count块的数量 mkfs.ext3 new_img.img  / ...

  7. 保护模式篇——PAE分页

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

  8. Java-基础-ArrayList

    1. 简介 ArrayList 实现了 List 接口,其底层基于数组实现容量大小动态可变.既然是数组,那么元素存放一定是有序的,并允许包括 null 在内的所有元素. 每个 ArrayList 实例 ...

  9. spring social理解

    现在互联网飞速发展,人们每天在互联网上冲浪,获取各种信息.各大网站为了方便用户的登录,提供了各式各样的社交登录,比如:QQ.微信和微博登录等.这些主流的社交登录大多是基于oauth协议进行实现,spr ...

  10. Netty:Netty的介绍以及它的核心组件(三)—— 事件和ChannelHandler

    Netty 使用异步事件驱动(Asynchronous Event-Driven)的应用程序范式,因此数据处理的管道(ChannelPipeLine)是经过处理程序(ChannelHandler)的事 ...