BZOJ 3410: [Usaco2009 Dec]Selfish Grazing 自私的食草者 离散化dp

来源:互联网 发布:琢磨先生妻子淘宝店 编辑:程序博客网 时间:2024/05/20 19:33

3410: [Usaco2009 Dec]Selfish Grazing 自私的食草者

Time Limit: 3 Sec  Memory Limit: 128 MB
Submit: 178  Solved: 153
[Submit][Status][Discuss]

Description

    约翰有N(1≤N≤50000)头牛,约翰的草地可以认为是一条直线.每只牛只喜欢在某个特定的范围内吃草.第i头牛喜欢在区间(Si,Ei)吃草,1≤Si<Ei≤1,000,000,00.
    奶牛们都很自私,他们不喜欢和其他奶牛共享自己喜欢吃草的领域,因此约翰要保证任意
两头牛都不会共享他们喜欢吃草昀领域.如果奶牛i和奶牛J想要同时吃草,那么要满足:Si>=Ej或者Ei≤Sj.约翰想知道在同一时刻,最多可以有多少头奶牛同时吃草?

Input

    第1行:一个整数N.
    第2到N+1行:第i+l行有两个整数Si,Ei.

Output

 
    一个整数,最多可以有多少头牛同时吃草.

Sample Input

5
2 4
1 12
4 5
7 10
7 8

Sample Output

3

HINT

  1343只奶牛可以同时吃草,第135也可以.


离散化之后dp,开心切掉

查题解   贪心   

rank第一  倒数的 哈哈哈哈哈哈


#include<cmath>#include<ctime>#include<cstdio>#include<cstring>#include<cstdlib>#include<complex>#include<iostream>#include<algorithm>#include<iomanip>#include<vector>#include<string>#include<queue>#include<set>#include<map>using namespace std;typedef double db;inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}const int N=100100;int a[N],f[N],cnt;struct data{int l,r;}p[N>>1];map<int,int>mp;inline bool cmp(data x,data y){return x.r==y.r?x.l>y.l:x.r<y.r;}int main(){int n=read();for(int i=1;i<=n;i++){a[i*2]=read();a[i*2-1]=read();p[i].l=a[i*2];p[i].r=a[i*2-1];}sort(a+1,a+2*n+1);for(int i=1;i<=n<<1;i++)if(a[i]!=a[i-1])mp[a[i]]=++cnt;cnt++;for(int i=1;i<=n;i++)p[i].l=mp[p[i].l],p[i].r=mp[p[i].r];sort(p+1,p+1+n,cmp);int now=1;for(int i=1;i<=cnt;i++){f[i]=f[i-1];while(now<=n&&i>=p[now].r)f[i]=max(f[i],f[p[now++].l]+1);}printf("%d\n",f[cnt]);return 0;}


阅读全文
0 0