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

设这个序列的前缀和为Si(0 <= i <= n),S0 = 0

每一个符号对应两个前缀和的大小关系,然后根据这个关系拓扑排序一下。

还要注意一下前缀和相等的情况,所以用一个并查集来查询。

 1 #include <cstdio>
 2 #include <cstring>
 3
 4 const int maxn = 15;
 5 int n;
 6 int G[maxn][maxn];
 7 char s[100];
 8 int sum[maxn], a[maxn];
 9
10 int topo[maxn], c[maxn], t;
11
12 void dfs(int u)
13 {
14     c[u] = 1;
15     for(int v = 0; v <= n; v++) if(G[u][v] && !c[v]) dfs(v);
16     topo[--t] = u;
17 }
18
19 void toposort()
20 {
21     t = n + 1;
22     memset(c, 0, sizeof(c));
23     for(int u = 0; u <= n; u++) if(!c[u]) dfs(u);
24 }
25
26 int p[maxn];
27 int find(int x)
28 { return x == p[x] ? x : p[x] = find(p[x]); }
29
30 void link(int x, int y)
31 {
32     int px = find(x), py = find(y);
33     if(px != py) p[px] = py;
34 }
35
36 int main()
37 {
38     //freopen("in.txt", "r", stdin);
39
40     int T; scanf("%d", &T);
41     while(T--)
42     {
43         scanf("%d", &n);
44         scanf("%s", s);
45
46         for(int i = 0; i <= n; i++) p[i] = i;
47
48         memset(G, 0, sizeof(G));
49         int p = 0;
50         for(int i = 1; i <= n; i++)
51             for(int j = i; j <= n; j++)
52             {
53                 if(s[p] == ‘+‘) G[i-1][j]++;
54                 if(s[p] == ‘-‘) G[j][i-1]++;
55                 if(s[p] == ‘0‘) link(i-1, j);
56                 p++;
57             }
58         toposort();
59         for(p = 0; p <= n; p++) if(topo[p] == 0) break;
60         s[0] = 0;
61
62         for(int i = p + 1; i <= n; i++)
63         {
64             int s1 = topo[i], s2 = topo[i-1];
65             if(find(s1) == find(s2)) sum[s1] = sum[s2]; //前缀和相等
66             else sum[s1] = sum[s2] + 1;
67         }
68         for(int i = p - 1; i >= 0; i--)
69         {
70             int s1 = topo[i], s2 = topo[i+1];
71             if(find(s1) == find(s2)) sum[s1] = sum[s2];
72             else sum[s1] = sum[s2] - 1;
73         }
74         for(int i = 1; i <= n; i++)
75         {
76             if(i > 1) printf(" ");
77             printf("%d", sum[i] - sum[i - 1]);
78         }
79         puts("");
80     }
81
82     return 0;
83 }

代码君

时间: 2024-10-30 10:41:32

LA 4255 (拓扑排序 并查集) Guess的相关文章

hdu 1811 Rank of Tetris (拓扑排序+并查集)

Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4931 Accepted Submission(s): 1359 Problem Description自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他

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

Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6920    Accepted Submission(s): 1947 Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想

hdu 1811 Rank of Tetris(拓扑排序+并查集)

1 #include "cstdio" 2 #include "iostream" 3 #include "cstring" 4 #include "vector" 5 #include "queue" 6 using namespace std; 7 const int N = 10005; 8 int n, m, t; 9 int fa[N]; 10 int rank[N]; 11 int X[2*N]

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

Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜,定时更新,名堂要比福布斯富豪榜还响.关于如何排名,这个不用说都知道是根据Rating从高到低来排,如果两个人具有相同的Rating,那就按这几个人的RP从高到低来排. 终于,Lele要开始行动了,对N个人进行排名.为了方便起见,每个人都已经被编号,分别从0到N-1,并且编号越

hdu 1811(拓扑排序+并查集)

Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7961    Accepted Submission(s): 2266 Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为 了更好的符合那些爱好者的喜好,Lele又想

2015 ACM/ICPC Asia Regional Changchun Online Pro 1002 (拓扑排序+并查集)

Ponds Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 0    Accepted Submission(s): 0 Problem Description Betty owns a lot of ponds, some of them are connected with other ponds by pipes, and th

HDU 1811 Rank of Tetris 拓扑排序+并查集

Rank of Tetris Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜,定时更新,名堂要比福布斯富豪榜还响.关于如何排名,这个不用说都知道是根据Rating从高到低

(拓扑排序+并查集)HDU - 1811 Rank of Tetris

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1811 题意:有个很多关系,现在需要产生一个名单,有的人比有的人牛逼,有的人没有的人牛逼,有的人一样牛逼,现在需要通过牛逼程度排名,如果1比2牛逼,1的排名就比2前,如果1和2一样牛逼,就比两个人的人品,人品好的人排前面. 现在有三种情况: 1.正确 2.矛盾 3.无法确定 分析: 这里其他方面还是比较简单.首先确定三种情况的发生条件: 矛盾--存在环,也就是在toposort之后,没有把所有的点全都

HDU 1811 Rank of Tetris 【拓扑排序 + 并查集】

自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜,定时更新,名堂要比福布斯富豪榜还响.关于如何排名,这个不用说都知道是根据Rating从高到低来排,如果两个人具有相同的Rating,那就按这几个人的RP从高到低来排. 终于,Lele要开始行动了,对N个人进行排名.为了方便起见,每个人都已经被编号,分别从0到N-1,并且编号越大,RP就越高. 同时L