小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的地铁 [模拟退火]的更多相关文章

  1. [清华集训2017]小 Y 和地铁(神奇思路,搜索,剪枝,树状数组)

    世界上最不缺的就是好题. 首先考虑暴搜.(还有什么题是从这东西推到正解的……) 首先单独一个换乘站明显没用,只用考虑一对对的换乘站. 那么有八种情况:(从题解偷图)         然后大力枚举每个换 ...

  2. 【清华集训】小Y和地铁

    图已挂,前往luogu 题目: 小 $\rm Y$ 是一个爱好旅行的 $\rm OIer$.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁.她发现每条地铁线路可以看成平面上的一条 ...

  3. 清华集训2017D2T1 小 Y 和地铁(metro)

    题目:https://www.luogu.org/problem/show?pid=P4005 题意:一条线段,给定n个点(n<=44)其中每个点可能对应另外一个点.如果一个点有对应点,那么就要 ...

  4. [LOJ#2323]「清华集训 2017」小Y和地铁

    [LOJ#2323]「清华集训 2017」小Y和地铁 试题描述 小Y是一个爱好旅行的OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的 ...

  5. Loj #2324. 「清华集训 2017」小 Y 和二叉树

    Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...

  6. 【UOJ#340】【清华集训2017】小 Y 和恐怖的奴隶主(矩阵快速幂,动态规划)

    [UOJ#340][清华集训2017]小 Y 和恐怖的奴隶主(矩阵快速幂,动态规划) 题面 UOJ 洛谷 题解 考虑如何暴力\(dp\). 设\(f[i][a][b][c]\)表示当前到了第\(i\) ...

  7. loj #2325. 「清华集训 2017」小Y和恐怖的奴隶主

    #2325. 「清华集训 2017」小Y和恐怖的奴隶主 内存限制:256 MiB时间限制:2000 ms标准输入输出 题目类型:传统评测方式:文本比较   题目描述 "A fight? Co ...

  8. [LOJ#2324]「清华集训 2017」小Y和二叉树

    [LOJ#2324]「清华集训 2017」小Y和二叉树 试题描述 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙 ...

  9. Loj #2321. 「清华集训 2017」无限之环

    Loj #2321. 「清华集训 2017」无限之环 曾经有一款流行的游戏,叫做 *Infinity Loop***,先来简单的介绍一下这个游戏: 游戏在一个 \(n \times m\) 的网格状棋 ...

随机推荐

  1. python 菜鸟入门

    python 菜鸟博客: http://www.cnblogs.com/wupeiqi/articles/5433893.html http://www.cnblogs.com/linhaifeng/ ...

  2. jsp页面has already been called for this response错误解决方法。

    创建验证码的jsp页面提示错误:has already been called for this response <%@ page contentType="image/jpeg&q ...

  3. [至顶网] Win2019 发布 LTSC 10年支持期

    Windows Server 2019新特性:Linux.HCI…… Windows Server 2019是微软公司长期服务渠道(简称LTSC)之下新一轮的迭代产品,其中囊括大量新的特性以及部分管理 ...

  4. js框架总结

    参考地址 http://www.techweb.com.cn/network/system/2015-12-23/2245809.shtml https://www.cnblogs.com/mbail ...

  5. js本地储存userData实例

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head ...

  6. java与C++相比增加和缺少的特性--持续更新

    缺少的特性 java值类型中没有无符号数 java没有运算符重载语法 java中没有struct和union等用户自定义值类型 java中没有虚函数的概念,所有函数默认具有虚函数的特性 java采用单 ...

  7. 【bzoj4712】洪水 树链剖分+线段树维护树形动态dp

    题目描述 给出一棵树,点有点权.多次增加某个点的点权,并在某一棵子树中询问:选出若干个节点,使得每个叶子节点到根节点的路径上至少有一个节点被选择,求选出的点的点权和的最小值. 输入 输入文件第一行包含 ...

  8. PGM学习之四 Factor,Reasoning

    通过上一篇文章的介绍,我们已经基本了解了:Factor是组成PGM模型的基本要素:Factor之间的运算和推理是构建高维复杂PGM模型的基础.那么接下来,我们将重点理解,Factor之间的推理(Rea ...

  9. ML科普向

    转载自http://www.cnblogs.com/qscqesze/ Basis(基础): MSE(Mean Square Error 均方误差),LMS(LeastMean Square 最小均方 ...

  10. 【BZOJ4025】二分图(线段树分治,并查集)

    [BZOJ4025]二分图(线段树分治,并查集) 题面 BZOJ 题解 是一个二分图,等价于不存在奇环. 那么直接线段树分治,用并查集维护到达根节点的距离,只计算就好了. #include<io ...