有一个(比较显然又有点假的)结论:最优方案中(若存在),每一个数(指$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. 怎样将.h文件添加到项目中

    作为C++的初学者,在运行别人的程序时,第一个遇到的问题就是无法将程序中写到的.h文件包含到项目中来.下面来写一下处理方法.本文以easyx.h为例进行说明 首先右键你的工程 选择Properties ...

  2. C#开发BIMFACE系列44 服务端API之计算图纸对比差异项来源自哪个图框

    BIMFACE二次开发系列目录     [已更新最新开发文章,点击查看详细] 在前两篇博客<C#开发BIMFACE系列42 服务端API之图纸对比>.<C#开发BIMFACE系列43 ...

  3. 洛谷2494 [SDOI2011]保密 (分数规划+最小割)

    自闭一早上 分数规划竟然还能被卡精度 首先假设我们已经知道了到每个出入口的时间(代价) 那我们应该怎么算最小的和呢? 一个比较巧妙的想法是,由于题目规定的是二分图. 我们不妨通过最小割的形式. 表示这 ...

  4. spoj839 Optimal Marks(最小割,dinic)

    题目大意: 给你一个无向图\(G(V,E)\). 每个顶点都有一个int范围内的整数的标记. 不同的顶点可能有相同的标记. 对于边\((u,v)\),我们定义\(Cost(u,v)=mark [u]\ ...

  5. .Net微信服务商平台ApiV3接口

    最近做个对接微信服务商平台的小程序项目,大概要实现的流程是:a)特约商户进件 > b)生成带参数的小程序码 > c)小程序支付 > d)分账,记录一下,希望能对需要的朋友有所帮助 开 ...

  6. 4.1 The Example Domain 领域示例代码

    4.1 The Example Domain 领域示例代码 The examples will use some concepts those are used by GitHub, like Iss ...

  7. 2.3 Core Building Blocks 核心构件

    Core Building Blocks 核心构件 DDD mostly focuses on the Domain & Application Layers and ignores the ...

  8. vue3.x全局插件和组件

    做vue项目的时候,总有一些小组件或者工具类,我们需要频繁的使用,每个使用的地方再去引用相对比较麻烦,当然也有一些好处,尤其是配合组件异步加载的时候,能最更好的减少项目首次加载的体积,从而优化一些体验 ...

  9. .Net 5下的单文件部署

    由于.net程序没有静态链接,一直缺乏单文件部署这种干净的发布方案.对客户端程序发布并不是很友好.在之前的.net framework下,有ILMerge合并程序集,以及LibZ的嵌入资源文件等第三方 ...

  10. 【好好编程-技术博客】微信小程序开发中前后端的交互

    微信小程序开发中前后端的交互 微信小程序的开发有点类似与普通网页的开发,但是也不尽然相同.小程序的主要开发语言是JavaScript,开发同普通的网页开发有很大的相似性,对于前端开发者而言,从网页开发 ...