【清华集训 2017】小Y的地铁 [模拟退火]
小Y的地铁
Time Limit: 50 Sec Memory Limit: 256 MB
Description

Input

Output
对于每组输入数据,输出一行一个整数,表示除掉这 n 个换乘站之外,最少有几个换乘站。
Sample Input
4
4
1 2 1 2
8
1 2 3 4 1 2 3 4
5
5 4 3 3 5
8
1 2 3 4 1 3 2 4
Sample Output
0
0
0
1
HINT
n <= 44
Solution
首先,答案显然只和几个区域的连通状态有关,那么我们可以写出四种本质不同的方案。(即下图中被线分开的六块)。

我们可以考虑,对于一条线,其他线(显然仅有 部分相交 与 完全相交 两种)造成的贡献。打出表来,上图是不会造成交点的线段种类。
既然知道了这个,我们的复杂度显然可以做到 O(4 ^ (n / 2))。还是不足以通过,怎么办呢?
模拟退火大法好!
Code
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<ctime>
using namespace std;
typedef long long s64; const int ONE = ;
const int INF = ; int get()
{
int res = , Q = ; char c;
while( (c = getchar()) < || c > )
if(c == '-') Q = -;
if(Q) res = c - ;
while( (c = getchar()) >= && c <= )
res = res * + c - ;
return res * Q;
} int n, num;
int pos[ONE], val[ONE];
int vis[ONE], a[ONE];
int Ans = INF;
struct power {int l, r;} A[ONE]; int x[ONE][ONE], y[ONE][ONE]; void Deal_first()
{
x[][] = x[][] = x[][] = ;
x[][] = x[][] = x[][] = ;
x[][] = x[][] = x[][] = ;
x[][] = x[][] = x[][] = ;
for(int i = ; i <= ; i++) y[i][] = y[i][] = ;
} int Now; int Judge(int pos, int type)
{
int res = Now;
for(int i = pos, j = pos + ; j <= num; j++)
{
if(A[i].r < A[j].l) continue;
if(A[i].r < A[j].r) res -= !x[a[i]][a[j]];
if(A[j].r < A[i].r) res -= !y[a[i]][a[j]];
}
for(int i = , j = pos; i < pos; i++)
{
if(A[i].r < A[j].l) continue;
if(A[i].r < A[j].r) res -= !x[a[i]][a[j]];
if(A[j].r < A[i].r) res -= !y[a[i]][a[j]];
} a[pos] = type; for(int i = pos, j = pos + ; j <= num; j++)
{
if(A[i].r < A[j].l) continue;
if(A[i].r < A[j].r) res += !x[a[i]][a[j]];
if(A[j].r < A[i].r) res += !y[a[i]][a[j]];
}
for(int i = , j = pos; i < pos; i++)
{
if(A[i].r < A[j].l) continue;
if(A[i].r < A[j].r) res += !x[a[i]][a[j]];
if(A[j].r < A[i].r) res += !y[a[i]][a[j]];
} Now = res, Ans = min(Ans, res);
return res;
} double Random() {return (double)rand() / RAND_MAX;}
void SA()
{
if(num == ) return;
double T = num * ;
while(T >= 0.01)
{
int pos = rand() % num + , type = rand() % + ;
int ori = Now, ori_type = a[pos]; int dE = Judge(pos, type) - ori;
if(dE <= || Random() <= exp(-dE / T)) a[pos] = type;
else Judge(pos, ori_type); T *= 0.9993;
}
} void Deal()
{
Ans = INF;
n = get();
for(int i = ; i <= n; i++) a[i] = get(), pos[a[i]] = vis[a[i]] = ;
for(int i = n; i >= ; i--)
if(!pos[a[i]]) pos[a[i]] = i; num = ;
for(int i = ; i <= n; i++)
if(!vis[a[i]] && pos[a[i]] != i)
A[++num] = (power){i, pos[a[i]]}, vis[a[i]] = ; for(int i = ; i <= num; i++)
a[i] = rand() % + ;
Ans = ;
for(int i = ; i <= num; i++)
for(int j = i + ; j <= num; j++)
{
if(A[i].r < A[j].l) break;
if(A[i].r < A[j].r) Ans += !x[a[i]][a[j]];
if(A[j].r < A[i].r) Ans += !y[a[i]][a[j]];
}
Now = Ans;
for(int i = ; i <= ; i++)
SA();
printf("%d\n", Ans);
} int main()
{
Deal_first();
int T = get();
while(T--)
Deal();
}
【清华集训 2017】小Y的地铁 [模拟退火]的更多相关文章
- [清华集训2017]小 Y 和地铁(神奇思路,搜索,剪枝,树状数组)
世界上最不缺的就是好题. 首先考虑暴搜.(还有什么题是从这东西推到正解的……) 首先单独一个换乘站明显没用,只用考虑一对对的换乘站. 那么有八种情况:(从题解偷图) 然后大力枚举每个换 ...
- 【清华集训】小Y和地铁
图已挂,前往luogu 题目: 小 $\rm Y$ 是一个爱好旅行的 $\rm OIer$.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁.她发现每条地铁线路可以看成平面上的一条 ...
- 清华集训2017D2T1 小 Y 和地铁(metro)
题目:https://www.luogu.org/problem/show?pid=P4005 题意:一条线段,给定n个点(n<=44)其中每个点可能对应另外一个点.如果一个点有对应点,那么就要 ...
- [LOJ#2323]「清华集训 2017」小Y和地铁
[LOJ#2323]「清华集训 2017」小Y和地铁 试题描述 小Y是一个爱好旅行的OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的 ...
- Loj #2324. 「清华集训 2017」小 Y 和二叉树
Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...
- 【UOJ#340】【清华集训2017】小 Y 和恐怖的奴隶主(矩阵快速幂,动态规划)
[UOJ#340][清华集训2017]小 Y 和恐怖的奴隶主(矩阵快速幂,动态规划) 题面 UOJ 洛谷 题解 考虑如何暴力\(dp\). 设\(f[i][a][b][c]\)表示当前到了第\(i\) ...
- loj #2325. 「清华集训 2017」小Y和恐怖的奴隶主
#2325. 「清华集训 2017」小Y和恐怖的奴隶主 内存限制:256 MiB时间限制:2000 ms标准输入输出 题目类型:传统评测方式:文本比较 题目描述 "A fight? Co ...
- [LOJ#2324]「清华集训 2017」小Y和二叉树
[LOJ#2324]「清华集训 2017」小Y和二叉树 试题描述 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙 ...
- Loj #2321. 「清华集训 2017」无限之环
Loj #2321. 「清华集训 2017」无限之环 曾经有一款流行的游戏,叫做 *Infinity Loop***,先来简单的介绍一下这个游戏: 游戏在一个 \(n \times m\) 的网格状棋 ...
随机推荐
- 0428-Scrum团队成立
------------------------------3.0------------------------------------------ 一.项目要求 5.Scrum团队成立 5.1 团 ...
- display:flex 布局教程,弹性布局!
display:flex 布局教程 布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现. ...
- rocketmq 主机负载异常飙高问题的解决
最近在部署rocketmq到物理机时, 发现并解决了一个主机Load异常飙高的问题, 觉得有必要记录一下. 我们采用了rocketmq(https://github.com/alibaba/Rocke ...
- iOS 一些常见问题
1.屏幕横屏时 xib上拖拉的控件不会跟着横过来: 是因为在主文件面里的 main interface 方框里的main 没有删除: 2.运行出现你没有权限 : 清理一下: 3.将对象转成字符串: / ...
- JAVA Junit4
JAVA Junit4 测试框架 序言 刚学Java的时候就听说过JUnit了,单元测试框架,很好用的测试框架,JUnit测试 ...
- c语言宏定义#define
1. 利用define来定义 数值宏常量 #define 宏定义是个演技非常高超的替身演员,但也会经常耍大牌的,所以我们用它要慎之又慎.它可以出现在代码的任何地方,从本行宏定义开始,以后的代码就就都认 ...
- 编辑器配置 vscode / Atom / Sublime Text
vscode配置 https://code.visualstudio.com/docs/languages/cpp https://www.zhihu.com/question/30315894/an ...
- 【hihocoder编程练习赛9】闰秒
题目链接 #include<stdio.h> #include<string.h> #include<algorithm> #include<math.h&g ...
- 【刷题】LOJ 2480 「CEOI2017」One-Way Streets
题目描述 给定一张 \(n\) 个点 \(m\) 条边的无向图,现在想要把这张图定向. 有 \(p\) 个限制条件,每个条件形如 \((xi,yi)\) ,表示在新的有向图当中,\(x_i\) 要能够 ...
- CSU1911 Card Game 【FWT】
题目链接 CSU1911 题解 FWT模板题 #include<algorithm> #include<iostream> #include<cstdlib> #i ...