zoukankan      html  css  js  c++  java
  • BZOJ1828: [Usaco2010 Mar]balloc 农场分配

    1828: [Usaco2010 Mar]balloc 农场分配

    Time Limit: 3 Sec  Memory Limit: 32 MB
    Submit: 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

    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 }
    View Code
  • 相关阅读:
    VC常用代码
    richedit
    vc++ 2005 发布程序
    管道应用之捕获控制台程序信息
    黑客基础知识编程(转)
    Get All IE Info from win32 api
    vc 界面编程常用方法(http://blog.emuch.net/244485/spacelistblogitemtypeid2708.html)
    使用ADO调用存储过程
    在C#中如何实现文件夹的复制(转)
    C语言开发病毒程序(转)
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/4031577.html
Copyright © 2011-2022 走看看