poj1201(贪心+树状数组)

来源:互联网 发布:阿里云网站日志在哪里 编辑:程序博客网 时间:2024/06/05 03:27
网上的题解都用啥差分约束系统。。。太高端,不会玩,额。。这题把数据按b的大小进行从小到大排序。然后每次取最右边的数据,用树状数组维护,真的是很方便
#include <iostream>#include<stdio.h>#include<algorithm>#include<cstring>#define mem(a) memset(a,0,sizeof(a))using namespace std;const int MAX=5*1e4+20;typedef struct{    int a,b,c;}Node;Node no[MAX];int c[MAX];bool vis[MAX];bool cmp(const Node&a,const Node &b){    return a.b<b.b;}void add(int n,int x){    while(n<MAX)    {        c[n]+=x;        n+=n&(-n);    }}int get_sum(int n){    int s=0;    while(n>=1)    {        s+=c[n];        n-=n&(-n);    }    return s;}int main(){    int n,i,sum,ist,j,num=0;    scanf("%d",&n);    for(i=1;i<=n;i++)        scanf("%d%d%d",&no[i].a,&no[i].b,&no[i].c);    sort(no+1,no+1+n,cmp);    /*for(i=1;i<=n;i++)        cout<<no[i].a<<" "<<no[i].b<<" "<<no[i].c<<endl;    */for(i=1;i<=n;i++)    {        int left=no[i].a,right=no[i].b;        sum=get_sum(right)-get_sum(left-1);        ist=no[i].c-sum;//cout<<ist<<endl;        for(j=right;;j--)        {            if(ist<=0)                break;            if(vis[j]==0)            {                num++;                add(j,1);                vis[j]=1;                ist--;            }            else                continue;        }    }    printf("%d\n",num);    return 0;}

0 0