首页 > 代码库 > BZOJ1828: [Usaco2010 Mar]balloc 农场分配
BZOJ1828: [Usaco2010 Mar]balloc 农场分配
1828: [Usaco2010 Mar]balloc 农场分配
Time Limit: 3 Sec Memory Limit: 32 MBSubmit: 482 Solved: 253
[Submit][Status]
Description
Input
第1行:两个用空格隔开的整数:N和M* 第2行到N+1行:第i+1行表示一个整数C_i* 第N+2到N+M+1行: 第i+N+1行表示2个整数 A_i和B_i
Output
* 第一行: 一个整数表示最多能够被满足的要求数
Sample Input
5 4
1
3
2
1
3
1 3
2 5
2 3
4 5
1
3
2
1
3
1 3
2 5
2 3
4 5
Sample Output
3
HINT
Source
Gold
题解:
这种选区间的问题如果范围很大一定是贪心。。。
题解戳这里:
http://blog.163.com/fjxmlhx@126/blog/static/144072841201022521659527/
http://blog.csdn.net/sdj222555/article/details/13005815
知道做法以后就是码题了。。。
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #define N 100005 6 using namespace std; 7 inline int read() 8 { 9 int x=0;char ch=getchar();10 while(ch<‘0‘||ch>‘9‘)ch=getchar();11 while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}12 return x;13 }14 int n,m,ans;15 struct data{int l,r;}a[N];16 struct seg{int l,r,mn,tag;}t[N*3];17 inline bool cmp(data a,data b)18 {return a.r<b.r;}19 void pushdown(int k)20 {21 int l=t[k].l,r=t[k].r,tag=t[k].tag;22 if(l==r||!tag)return;23 t[k].tag=0;24 t[k<<1].mn-=tag;t[k<<1|1].mn-=tag;25 t[k<<1].tag+=tag;t[k<<1|1].tag+=tag;26 }27 void build(int k,int l,int r)28 {29 t[k].l=l;t[k].r=r;30 if(l==r){t[k].mn=read();return;}31 int mid=(l+r)>>1;32 build(k<<1,l,mid);33 build(k<<1|1,mid+1,r); 34 t[k].mn=min(t[k<<1].mn,t[k<<1|1].mn);35 }36 bool ask(int k,int x,int y)37 {38 pushdown(k);39 int l=t[k].l,r=t[k].r;40 if(l==x&&y==r)return t[k].mn>=1;41 int mid=(l+r)>>1;42 if(mid>=y)return ask(k<<1,x,y);43 else if(mid<x)return ask(k<<1|1,x,y);44 else return (ask(k<<1,x,mid)&ask(k<<1|1,mid+1,y));45 t[k].mn=min(t[k<<1].mn,t[k<<1|1].mn);46 }47 void update(int k,int x,int y)48 {49 pushdown(k);50 int l=t[k].l,r=t[k].r;51 if(l==x&&y==r){t[k].tag++;t[k].mn--;return;}52 int mid=(l+r)>>1;53 if(mid>=y)update(k<<1,x,y);54 else if(mid<x)update(k<<1|1,x,y);55 else {update(k<<1,x,mid);update(k<<1|1,mid+1,y);}56 t[k].mn=min(t[k<<1].mn,t[k<<1|1].mn);57 }58 int main()59 {60 n=read();m=read();61 build(1,1,n);62 for(int i=1;i<=m;i++)63 a[i].l=read(),a[i].r=read();64 sort(a+1,a+m+1,cmp);65 for(int i=1;i<=m;i++)66 if(ask(1,a[i].l,a[i].r))67 {68 update(1,a[i].l,a[i].r);69 ans++;70 }71 printf("%d",ans);72 return 0;73 }
BZOJ1828: [Usaco2010 Mar]balloc 农场分配
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。