LA4255/UVa1423 Guess 拓扑排序 并查集
评分稍微有一点过分。。不过这个题目确确实实很厉害,对思维训练也非常有帮助。
按照套路,我们把矩阵中的子段和化为前缀和相减的形式。题目就变成了给定一些前缀和之间的大小关系,让你构造一组可行的数据。这个东西显然是传递闭包,但是如果仅仅传递闭包的话我们只能询问两两之间的关系,处理起来比较麻烦。有没有什么办法获取一个完整的顺序序列出来呢?显然是做一个拓扑排序就好啦~
但是问题来了。如果没有相等一切好说,现在有相等该咋玩?
注意到题目保证一定有一组可行解,我们可以先不表示相等的关系。(如果把\(<=\)的关系和\(<\)的关系混起来会乱的~环什么的也不好处理)先把不等关系列出来,求出大小顺序的拓扑序列。由于一定有可行解,所以如果两个数相等的话,受到其他条件制约后,它们一定还是相邻的。这里用并查集维护一下相等关系,查一查前后相等不相等就可以了。
我们初始维护的是一个顺着边的方向递增的数量关系,\(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 拓扑排序 并查集的更多相关文章
- ACM: hdu 1811 Rank of Tetris - 拓扑排序-并查集-离线
hdu 1811 Rank of Tetris Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & % ...
- HDU 1811 拓扑排序 并查集
有n个成绩,给出m个分数间的相对大小关系,问是否合法,矛盾,不完全,其中即矛盾即不完全输出矛盾的. 相对大小的关系可以看成是一个指向的条件,如此一来很容易想到拓扑模型进行拓扑排序,每次检查当前入度为0 ...
- 拓扑排序 - 并查集 - Rank of Tetris
Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球 ...
- LA 4255 (拓扑排序 并查集) Guess
设这个序列的前缀和为Si(0 <= i <= n),S0 = 0 每一个符号对应两个前缀和的大小关系,然后根据这个关系拓扑排序一下. 还要注意一下前缀和相等的情况,所以用一个并查集来查询. ...
- Rank of Tetris(hdu1811拓扑排序+并查集)
题意:关于Rating的信息.这些信息可能有三种情况,分别是"A > B","A = B","A < B",分别表示A的Rati ...
- Codeforces #541 (Div2) - D. Gourmet choice(拓扑排序+并查集)
Problem Codeforces #541 (Div2) - D. Gourmet choice Time Limit: 2000 mSec Problem Description Input ...
- hdu 1811 Rank of Tetris - 拓扑排序 - 并查集
自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜, ...
- hdu 1811(缩点+拓扑排序+并查集)
Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdu1811 Rank of Tetris 拓扑排序+并查集
这道题是拓扑排序和并查集的综合运用. 由于排行榜是一种从高到低的排序.所以在拓扑排序的时候,如果有一次加入的入度为零的点数大于1,就有变得不确定了(UNCERTAIN). 由于只有一棵树,当树的数量大 ...
随机推荐
- Asp.Net 将HTML中通过dom-to-image.js标签div内的内容转化为图片保存到本地
由于客户的需求,将js写出来的一个统计能够保存到本地.作为码奴的我只能慢慢搬砖咯!一开始使用的是html2canvas.js.功能是可以实现,但是有缺陷.话不多说开始搞! 1.引入几个JS库 ①:jq ...
- RFID NFC
RFID 和 NFC 的区别: ()NFC与RFID在物理层面看上去很相似,但实际上是两个完全不同的领域,因为RFID本质上属于识别技术,而NFC属于通信技术. ()NFC将非接触读卡器.非接触卡和点 ...
- servlet与jsp篇(一)$.ajax交互
servlet其实是利用java类编写的服务器端应用程序,他的生命周期可以分为三个阶段:初始化阶段.运行阶段和消亡阶段; jsp页面实质上是一个HTML页面,但他包含了用户产生动态网页内容的java代 ...
- DevExtreme App 开发记要
添加插件 除提供的标准插件外,可直接在config.xml中书写配置,然后编译模板,在后台能看到相关的插件了 无法显示百度地图 在IPHONE中正常加载地图,但在安卓中提示BM ...
- Python数据挖掘
Python之所以如此流行,原因在于它的数据分析和挖掘方面表现出的高性能,而我们前面介绍的Python大都集中在各个子功能(如科学计算.矢量计算.可视化等),其目的在于引出最终的数据分析和数据挖掘功能 ...
- android - TextView单行显示...或者文字左右滚动(走马灯效果)
条件 TextView单行显示,文字左右滚动(走马灯效果)实现条件: 实现单行设置固定宽度或者设置权重都行 代码 TextView滚动必须写下面几个属性 android:singleLine=&quo ...
- StackExchange.Redis中文使用文档
StackExchange.Redis中文使用文档 Intro 最近想深入学习一些 Redis 相关的东西.于是看了看官方的项目 StackExchange,发现里面有一份文档,于是打算翻译成中文,方 ...
- BASE64编码的图片在网页中的显示问题的解决
BASE64位转码有两种: 一种是图片转为Base64编码,这种编码是直接可以在页面通过<img src='base64编码'/>的方式显示 Base64 在CSS中的使用 .demoIm ...
- selenium-自动化用例(十一)
思路 将页面操作与用例case分别封装,编写case时就可以用同一个操作方法对应多个case 如下图: PageGUI:存放页面操作方法,每个页面写一个文件,每个文件中写同一个页面不同的操作,例如检索 ...
- casbin-权限管理
概要 权限管理几乎是每个系统或者服务都会直接或者间接涉及的部分. 权限管理保障了资源(大部分时候就是数据)的安全, 权限管理一般都是和业务强关联, 每当有新的业务或者业务变化时, 不能将精力完全放在业 ...