poj 2376

来源:互联网 发布:网络使人更疏远的例子 编辑:程序博客网 时间:2024/05/15 10:42

贪心? 贪心!


对于格点 i,计算出能覆盖格点 i 的区间的最右端点 f

然后跳转到格点 f+1 继续处理即可。


#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <ctime>#include <string>#include <map>#include <vector>#include <stack>#include <queue>#include <utility>#include <iostream>#include <algorithm>template<class Num>void read(Num &x){    char c; int flag = 1;    while((c = getchar()) < '0' || c > '9')        if(c == '-') flag *= -1;    x = c - '0';    while((c = getchar()) >= '0' && c <= '9')        x = (x<<3) + (x<<1) + (c-'0');    x *= flag;    return;}template<class Num>void write(Num x){    if(x < 0) putchar('-'), x = -x;    static char s[20];int sl = 0;    while(x) s[sl++] = x%10 + '0',x /= 10;    if(!sl) {putchar('0');return;}    while(sl) putchar(s[--sl]);}#define REP(__i,__st,__ed) for(int __i = (__st); __i <= (__ed); __i++)typedef std::pair<int,int> segment;const int maxn = 25050, Nya = -1;int n, T;segment s[maxn];void init(){    int l, r;    read(n), read(T);    REP(i, 1, n)    {        read(l), read(r);        s[i] = std::make_pair(l, r);    }}int solve(){    int f = 0, pos = 1, cnt = 0;    std::sort(s + 1, s + n + 1);    for(int i = 1; i <= T; i = f + 1)    {        while(pos <= n && s[pos].first <= i)            f = std::max(s[pos++].second, f);        if(f >= i) cnt++; else return Nya;    }    return cnt;}int main(){#ifndef ONLINE_JUDGE    freopen("2376.in","r",stdin);    freopen("2376.out","w",stdout);#endif    init(), write(solve());#ifndef ONLINE_JUDGE    fclose(stdin);    fclose(stdout);#endif    return 0;           }
0 0
原创粉丝点击