标签:
http://acm.hdu.edu.cn/showproblem.php?pid=1199
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5135 Accepted Submission(s): 1262
开始看到这道题以为要用到线段树会很难,仔细一想发现并不是多难,用一般方法就可以解决正常模拟一下染色,
0为黑色1位白色,然后循环统计每一段的白色个数,并将其起点和终点记录到结构体中,
通过排序找到白色个数最多的那一段,输出其起点和终点,即为该题结果
#include<stdio.h> #include<string.h> #include<algorithm> #define N 200010//这里注意开大点 using namespace std; struct st { int x, y, ans;//x表示白色部分的起点,y表示终点,ans表示这段区间的白色的数量 } node[N]; int G[N];//G[i] 0表示黑色 1表示白色 int cmp(const void *a, const void *b) { st *s1 = (st *)a, *s2 = (st *)b; if(s1->ans == s2->ans) return s1->x - s2->x; else return s2->ans - s1->ans; } int main() { int n, a, b, i, f, k, j, Max; char ch; while(~scanf("%d", &n)) { f = k = j = Max = 0; memset(G, 0, sizeof(G)); memset(node, 0, sizeof(node)); while(n--) { scanf("%d%d %c", &a, &b, &ch); Max = max(max(a, b), Max); if(ch == ‘w‘) for(i = a ; i <= b ; i++) G[i] = 1; else for(i = a ; i <= b ; i++) G[i] = 0; } for(i = 1 ; i < Max ; i++) { if(G[i] == 1) { f = 1; break; } } if(f == 0) { printf("Oh, my god\n"); continue; } for(i = 1 ; i <= Max ; i++) { if(G[i] == 1) { node[j].ans++; if(k == 0) { node[j].x = i; k = 1; } } if(G[i] == 0 && k == 1) { node[j].y = i - 1; k = 0; j++; } if(G[i] == 1 && i == Max && k == 1) { node[j].y = i; k = 0; j++; } } qsort(node, j, sizeof(node[0]), cmp); printf("%d %d\n", node[0].x, node[0].y); } return 0; } /* 3 1 4 w 8 11 w 3 5 b 4 1 4 w 8 11 w 3 5 b 6 8 w*/
标签:
原文地址:http://www.cnblogs.com/qq2424260747/p/4787103.html