zoukankan      html  css  js  c++  java
  • POJ 2481 Cows (树状数组)

    题意:给定n个区间,问每个区间所覆盖的区间的个数。

    思路:第三道树状数组,终于有感觉了,要不就傻X了,对区间排序,然后树状数组查询,思路和Stars那道差不多,不过还要处理重合区间的情况,只需排序后O(N)扫描一遍就好了。

    /* Cows 2481
    * 树状数组第三题,对牛排序即可 ,注意要
    * 排除体型相等的牛.
    */
    #include
    <iostream>
    #include
    <cstdio>
    #include
    <algorithm>
    #include
    <memory.h>
    #include
    <cmath>
    #include
    <bitset>
    #include
    <queue>
    #include
    <vector>
    using namespace std;

    const int BORDER = (1<<20)-1;
    const int MAXSIZE = 37;
    const int MAXN = 100200;
    const int INF = 1000000000;
    #define CLR(x,y) memset(x,y,sizeof(x))
    #define ADD(x) x=((x+1)&BORDER)
    #define IN(x) scanf("%d",&x)
    #define OUT(x) printf("%d\n",x)
    #define MIN(m,v) (m)<(v)?(m):(v)
    #define MAX(m,v) (m)>(v)?(m):(v)
    #define ABS(x) ((x)>0?(x):-(x))

    typedef
    struct{
    int s,e;
    int id;
    }Node;

    Node node[MAXN];
    int tre[MAXN],n_tre;
    int n;
    int ans[MAXN],same[MAXN];

    int lowbit(int x)
    {
    return x&(-x);
    }
    void modify(int ind,int delta)
    {
    while( ind <= n_tre)
    {
    tre[ind]
    += delta;
    ind
    += lowbit(ind);
    }
    }
    int get_sum(int ind)
    {
    int sum = 0;
    while(ind > 0)
    {
    sum
    += tre[ind];
    ind
    -= lowbit(ind);
    }
    return sum;
    }
    bool cmp(const Node& a,const Node& b)
    {
    if(a.e == b.e)
    return a.s < b.s;
    return a.e > b.e;
    }
    int init()
    {
    n_tre
    = 100400;
    CLR(same,
    0);
    CLR(tre,
    0);
    CLR(ans,
    0);
    return 0;
    }
    int input()
    {
    for(int i = 0; i < n; ++i)
    {
    scanf(
    "%d%d",&node[i].s,&node[i].e);
    ++node[i].s;
    ++node[i].e;
    node[i].id
    = i;
    }
    return 0;
    }
    int _find_same()
    {
    int i,j,tmp;
    for(i = 1; i < n; ++i)
    {
    tmp
    = 0;
    if(node[i-1].s == node[i].s && node[i-1].e == node[i].e)
    same[i]
    = same[i-1] + 1;
    }
    return 0;
    }
    int work()
    {
    int i,j,s,e,tmp;
    sort(node,node
    +n,cmp);
    _find_same();
    for(i = 0; i < n; ++i)
    {
    ans[node[i].id]
    = get_sum(node[i].s)-same[i];
    modify(node[i].s,
    1);
    }
    printf(
    "%d",ans[0]);
    for(i = 1; i < n; ++i)
    printf(
    " %d",ans[i]);
    printf(
    "\n");
    return 0;
    }
    int main()
    {
    while(IN(n))
    {
    if(!n)
    break;
    init();
    input();
    work();
    }
    return 0;
    }

  • 相关阅读:
    爱情三十七课,恩情仪式
    爱情三十二课,幽默的用法
    爱情四十二课,距离就是问题
    爱情二十八课,你为什么爱
    爱情三十四课,放手的时机
    爱情三十九课,爱的礼物
    爱情三十三课,读懂愤怒
    爱情三十一课,先信自己
    爱情三十课,爱情整理术
    爱情二十四课,妥协50分
  • 原文地址:https://www.cnblogs.com/lvpengms/p/1718169.html
Copyright © 2011-2022 走看看