小小粉丝度度熊 HDU

来源:互联网 发布:众人皆知的拼音 编辑:程序博客网 时间:2024/04/28 20:27

第一次写尺取,最开始写的很挫,最后看了一下别人的框架又重新写了一遍。

思路:首先预处理下,将相交区间何必,然后用尺取扫描一遍就可以了,

#include <algorithm>#include <bitset>#include <cassert>#include <climits>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <deque>#include <iomanip>#include <iostream>#include <map>#include <numeric>#include <queue>#include <set>#include <stack>#include <string>using namespace std;struct point{long long int l, r;};point p[100000+100];point p2[100000+100];bool cmp(const point &a, const point &b){return a.l < b.l;}int n;long long int m;int main(){while (scanf("%d%ld", &n, &m) != EOF) {for (int i = 0; i < n; i++) {scanf("%ld%ld", &p[i].l, &p[i].r);}sort(p, p+n, cmp);int num = 0;long long int l1 = p[0].l;long long int r1 = p[0].r;for (int i = 1; i < n; i++) {if (p[i].l > r1+1) {p2[num].l = l1;p2[num++].r = r1;r1 = p[i].r;l1 = p[i].l;}if (p[i].l <= r1+1) {r1 = max(r1, p[i].r);}}p2[num].l = l1;p2[num++].r = r1;int m1 = 0;l1 = 0;long long int ans = 0;for (int i = 1; i < num; i++) {m1 += p2[i].l - p2[i-1].r - 1;while (m1 > m) {m1 -= p2[l1+1].l - p2[l1].r - 1;l1++;}ans = max(ans, p2[i].r - p2[l1].l + 1 + m - m1);}ans = max(ans, p2[0].r - p2[0].l + 1 + m);cout << ans << endl;}return 0;}


原创粉丝点击