hdu 4325 Flowers

线段树+离散化

View Code
  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<algorithm>
  4 using namespace std;
  5 #define lson l , m , rt << 1
  6 #define rson m + 1 , r , rt << 1 | 1
  7 
  8 const int maxn = 100005;
  9 int add[maxn<<2];
 10 int sum[maxn<<2];
 11 int x[maxn*3];
 12 int li[maxn],ri[maxn];
 13 int q[maxn];
 14 
 15 void PushUp(int rt)
 16 {
 17     sum[rt] = sum[rt<<1] + sum[rt<<1|1];
 18 }
 19 void PushDown(int rt)
 20 {
 21     if(add[rt])
 22     {
 23         add[rt<<1] += add[rt];
 24         add[rt<<1|1] += add[rt];
 25         sum[rt<<1] += add[rt];
 26         sum[rt<<1|1] += add[rt];
 27         add[rt] = 0;
 28     }
 29 }
 30 void build(int l,int r,int rt)
 31 {
 32     add[rt] = 0;
 33     sum[rt] = 0;
 34     if(l == r)return ;
 35     int m = (l + r) >> 1;
 36     build(lson);
 37     build(rson);
 38 }
 39 void update(int L,int R,int l,int r,int rt)
 40 {
 41     if(L <= l && r <= R)
 42     {
 43         add[rt]++;
 44         sum[rt]++;
 45         return ;
 46     }
 47     PushDown(rt);
 48     int m = (l + r) >> 1;
 49     if(L <= m)update(L,R,lson);
 50     if(m < R)update(L,R,rson);
 51     PushUp(rt);
 52 }
 53 int query(int k,int l,int r,int rt)
 54 {
 55     if(l == k && r == k)
 56     {
 57         return sum[rt];
 58     }
 59     PushDown(rt);
 60     int ret = 0;
 61     int m = (l + r) >> 1;
 62     if(k <= m)ret += query(k,lson);
 63     else ret += query(k,rson);
 64     return ret;
 65 }
 66 int find(int key,int n)
 67 {
 68     int l = 0, r = n - 1;
 69     while(l <= r)
 70     {
 71         int m = (l + r) >> 1;
 72         if(x[m] == key)return m;
 73         else if(x[m] < key)l = m + 1;
 74         else r = m - 1;
 75     }
 76     return -1;
 77 }
 78 int main()
 79 {
 80     #ifndef ONLINE_JUDGE
 81     freopen("in","r",stdin);
 82     #endif
 83     int t;
 84     scanf("%d",&t);
 85     for(int cas=1;cas<=t;cas++)
 86     {
 87         int n,m;
 88         int nn=0;
 89         scanf("%d%d",&n,&m);
 90         for(int i=0;i<n;i++)
 91         {
 92             scanf("%d%d",&li[i],&ri[i]);
 93             x[nn++] = li[i];
 94             x[nn++] = ri[i];
 95         }
 96         for(int i=0;i<m;i++)
 97         {
 98             scanf("%d",&q[i]);
 99             x[nn++]=q[i];
100         }
101         sort(x,x+nn);
102         int num = 1;
103         for(int i=1;i<nn;i++)
104         {
105             if(x[i] != x[i-1])x[num++] = x[i];
106         }
107         printf("Case #%d:\n",cas);
108         build(0,num,1);
109         for(int i=0;i<n;i++)
110         {
111             int l=find(li[i],num);
112             int r=find(ri[i],num);
113             update(l,r,0,num,1);
114         }
115         for(int i=0;i<m;i++)
116         {
117             int k= find(q[i],num);
118             printf("%d\n",query(k , 0, num,1));
119         }
120     }
121 }

转载于:https://www.cnblogs.com/fzf123/archive/2012/08/20/2648189.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值