标签:
= =之前跟队友兴致勃勃说要一起刷usaco,然后就卡在这题了,因为真没看懂。
今天莫名想起,感觉是左闭右开区间,然后一试就过了= = 然后又可以愉快开刷了
//然而队友已经不是原来的队友了
//人和人的价值观差别太大
//我觉得玩的开心就好+信守承诺最重要
//他觉得要当一队拿金然后进final最重要
//另一个迷之乱入的觉得和他妹子打+不离开原队友最重要,好吧 = =
//另外一个人迷之乱入的我也不知道他觉得什么重要,然而我信守对他承诺,以至于抛弃了队友(抱歉),然而他却背弃了呵呵呵,和学霸组队真是太危险辣,世界观我永远不懂
//反正闹得N头不是人,都怪我咯。。。
//好烦躁,还是刷题吧
我用的是不知道叫什么名字法,两端标记然后扫两遍,复杂度就是时间的长度
另外一种方法是记录所有的区间后排序然后乱搞
#include <bits/stdc++.h> using namespace std; const int N = 1000005; int d[N]; int main() { #ifndef poi freopen("milk2.in","r",stdin); freopen("milk2.out","w",stdout); #endif int n, i, x, y, temp, minn = 0x3f3f3f3f, maxn = 0; memset(d, 0, sizeof(d)); scanf("%d", &n); while(n--){ scanf("%d %d",&x, &y); d[x] ++; d[y] --; //[x, y) minn = min(minn, x); maxn = max(maxn, y); } for(i = minn; i <=1+ maxn; i++){ d[i] += d[i-1]; // printf("%d %d\n", i, d[i]); } int ans1 = 0, ans2 = 0; for(i = minn; i <= maxn; ){ temp = i; // printf("%d\n", i); while(d[i]&&i <= maxn+1) { i ++; } // printf("ans1 : %d %d\n", i, i-temp-1); ans1 = max(i-temp, ans1); temp = i; while(!d[i]&& i <= maxn+1){ i ++; } // printf("ans2 : %d %d\n", i, temp); ans2 = max(min(i,maxn)-temp, ans2); } printf("%d %d\n", ans1, ans2); return 0; }
标签:
原文地址:http://www.cnblogs.com/bbbbbq/p/4631394.html