poj1201(贪心+树状数组)
2015-08-09 19:51
169 查看
网上的题解都用啥差分约束系统。。。太高端,不会玩,额。。这题把数据按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 +=x; n+=n&(-n); } } int get_sum(int n) { int s=0; while(n>=1) { s+=c ; 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; }
相关文章推荐
- OC中字典
- 整理一下看过的图像识别的文章(人脸、车牌、验证码)
- Android-扩展BaseAdapter实现progressBar下载
- 学习计划,我希望这不会虎头蛇尾
- Java程序设计求出岁数
- Stripe
- ios警告与提示对话框
- HDU 2157 How many ways??
- Network Saboteur
- 熟人UML
- SDImage框架实现原理详解
- Network Saboteur 分类: 搜索 POJ 2015-08-09 19:48 7人阅读 评论(0) 收藏
- HDU 5365 Run (判断正四边形)
- HTML5 入门--1
- 1.3 翻烙饼问题
- arm,gpio开发第二天
- HDU5349——multiset——MZL's simple problem
- poj3268(线段树)
- jquery基础学习之变量命名不污染的方法总结
- CodeForces 18C