评分稍微有一点过分。。不过这个题目确确实实很厉害,对思维训练也非常有帮助。

按照套路,我们把矩阵中的子段和化为前缀和相减的形式。题目就变成了给定一些前缀和之间的大小关系,让你构造一组可行的数据。这个东西显然是传递闭包,但是如果仅仅传递闭包的话我们只能询问两两之间的关系,处理起来比较麻烦。有没有什么办法获取一个完整的顺序序列出来呢?显然是做一个拓扑排序就好啦~

但是问题来了。如果没有相等一切好说,现在有相等该咋玩?

注意到题目保证一定有一组可行解,我们可以先不表示相等的关系。(如果把\(<=\)的关系和\(<\)的关系混起来会乱的~环什么的也不好处理)先把不等关系列出来,求出大小顺序的拓扑序列。由于一定有可行解,所以如果两个数相等的话,受到其他条件制约后,它们一定还是相邻的。这里用并查集维护一下相等关系,查一查前后相等不相等就可以了。

我们初始维护的是一个顺着边的方向递增的数量关系,\(DF
S\)求出的拓扑序列数量关系是递减的。所以处理的时候如果前后\(find\)一样就赋一样的值,否则就是前面等于后面\(+1/\)后面等于前面\(-1\)。求出\(Sum\)数组之后原数列就有了。

(特判:手推可知不连通的子图不会对答案造成影响。不用特判。)

#include <bits/stdc++.h>
using namespace std; const int N = 10 + 5; int T, n, sum[N], Set[N], vis[N]; char s[N * N]; vector <int> G[N], topo; int find (int x) {
return x == Set[x] ? x : Set[x] = find (Set[x]);
} void dfs (int u) {
vis[u] = true;
for (int i = 0; i < (int)G[u].size (); ++i) {
int v = G[u][i];
if (!vis[v]) dfs (v); //题目保证有解 = 无环
}
topo.push_back (u);
} int main () {
// freopen ("data.in", "r", stdin);
cin >> T;
while (T--) {
cin >> n >> s; int k = 0;
for (int i = 0; i < N; ++i) {
Set[i] = i, G[i].clear ();
}
for (int i = 1; i <= n; ++i) {
for (int j = i; j <= n; ++j) {
if (s[k] == '+') {//sum[j] > sum[i - 1]
G[i - 1].push_back (j);
}
if (s[k] == '-') {//sum[j] < sum[i - 1]
G[j].push_back (i - 1);
}
if (s[k] == '0') {
Set[find (j)] = find (i - 1);//数值相等 -> 同一个集合中
}
//x -> y : sum[x] < sum[y]
k = k + 1;
}
}
topo.clear ();
memset (vis, 0, sizeof (vis));
memset (sum, 0, sizeof (sum));
for (int i = 0; i <= n; ++i) {
if (!vis[i]) dfs (i); //简便的DFS拓扑排序23333
}
int zero_pos = -1;
for (int i = 0; i < (int) topo.size (); ++i) {
if (topo[i] == 0) {zero_pos = i; break;}
}
//找到0,前面是负数后面是正数
for (int i = zero_pos - 1; i >= 0; --i) {
if (find (topo[i]) == find (topo[i + 1])) {
sum[topo[i]] = sum[topo[i + 1]];//如果相等 -> 按照其他约束条件排出来也应该相邻
} else {
sum[topo[i]] = sum[topo[i + 1]] + 1;
}
}
for (int i = zero_pos + 1; i <= n; ++i) {
if (find (topo[i]) == find (topo[i - 1])) {
sum[topo[i]] = sum[topo[i - 1]];//如果相等 -> 按照其他约束条件排出来也应该相邻
} else {
sum[topo[i]] = sum[topo[i - 1]] - 1;
}
}
for (int i = 1; i <= n; ++i) {
cout << sum[i] - sum[i - 1];
if (i != n) cout << " ";
}
cout << endl;
}
}

LA4255/UVa1423 Guess 拓扑排序 并查集的更多相关文章

  1. ACM: hdu 1811 Rank of Tetris - 拓扑排序-并查集-离线

    hdu 1811 Rank of Tetris Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & % ...

  2. HDU 1811 拓扑排序 并查集

    有n个成绩,给出m个分数间的相对大小关系,问是否合法,矛盾,不完全,其中即矛盾即不完全输出矛盾的. 相对大小的关系可以看成是一个指向的条件,如此一来很容易想到拓扑模型进行拓扑排序,每次检查当前入度为0 ...

  3. 拓扑排序 - 并查集 - Rank of Tetris

    Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球 ...

  4. LA 4255 (拓扑排序 并查集) Guess

    设这个序列的前缀和为Si(0 <= i <= n),S0 = 0 每一个符号对应两个前缀和的大小关系,然后根据这个关系拓扑排序一下. 还要注意一下前缀和相等的情况,所以用一个并查集来查询. ...

  5. Rank of Tetris(hdu1811拓扑排序+并查集)

    题意:关于Rating的信息.这些信息可能有三种情况,分别是"A > B","A = B","A < B",分别表示A的Rati ...

  6. Codeforces #541 (Div2) - D. Gourmet choice(拓扑排序+并查集)

    Problem   Codeforces #541 (Div2) - D. Gourmet choice Time Limit: 2000 mSec Problem Description Input ...

  7. hdu 1811 Rank of Tetris - 拓扑排序 - 并查集

    自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜, ...

  8. hdu 1811(缩点+拓扑排序+并查集)

    Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  9. hdu1811 Rank of Tetris 拓扑排序+并查集

    这道题是拓扑排序和并查集的综合运用. 由于排行榜是一种从高到低的排序.所以在拓扑排序的时候,如果有一次加入的入度为零的点数大于1,就有变得不确定了(UNCERTAIN). 由于只有一棵树,当树的数量大 ...

随机推荐

  1. mac webstorm无法打开 如何使webstorm不卡

    场景:在应用程序里删除了原先的webstorm,然后从官网下载了新的安装包,进行安装.安装后,webstorm就再也打不开了. 解决方案:执行以下命令,清楚webstorm所有缓存,然后重新安装 $ ...

  2. web服务器负载均衡与集群基本概念二

    前面已经说过负载均衡的作用是在多个节点之间按照一定的策略(算法)分发网络或计算处理负载.负载均衡可以采用软件和硬件来实现.一般的框架结构可以参考下图.    后台的多个Web节点上面有相同的Web应用 ...

  3. GDAL坐标转换

    一.引言 最近研究了一下GIS.测绘学的坐标转换的问题,感觉大部分资料专业性太强,上来就是一通专业性论述:但感觉对于相关从业者来说,其实不必了解那么多背景知识的:就通过GDAL这个工具,来简单总结下坐 ...

  4. python的学习笔记01_2变量 常量 注释 用户交互 格式化输出

    变量是什么? 变量的作用  Variables are used to store information to be referenced and manipulated in a computer ...

  5. 用Gogs在Windows上搭建Git服务

    1.下载并安装Git,如有需求,请重启服务器让Path中的环境变量生效. 2.下载并安装Gogs,请注意,在Windows中部署时,请下载MiniWinService(mws)版本. 3.在Maria ...

  6. APICloud Studio2新建应用报错和检出错误

    今天心血来潮,闲暇时间想做个移动应用app,听一哥们说APICloud开发app很方便,就查询了一下,看了之后简直就是热血沸腾,我感觉正是我一直要找的工具 信心满满的开始着手使用,看了一下介绍我选择了 ...

  7. Activi相关表归纳

    Activi相关归纳总结记录:        ACT_RE_* : 'RE'表示repository.这个前缀的表包含了流程定义和流程静态资源(图片,规则,等等). ACT_RU_* : 'RU'表示 ...

  8. ClickOnce一项Winform部署

    先建一个Winform 控制台程序 建好后从工具箱里拖出来个 文本框 在属性中把TEXT改了 鼠标放到项目上点击右键——>属性 如下图所示,有两个发布位置. 发布位置可以选择本地文件夹,也可以选 ...

  9. .net问号的作用

    ??运算符(C# 参考)http://msdn.microsoft.com/zh-cn/library/ms173224.aspx 可以为 null 的类型(C# 编程指南)http://msdn.m ...

  10. 不停服务,动态加载properties资源文件

    系统运行过程中,我们用注解@Value("${****}")可以获取资源文件中的内 容,获取的内容会被存储在spring缓存中,因此如果我们修改了资源文件,要 想读取到修改后的内容 ...