• poj 2481 树状数组


     题目大意:给你很多线段的头S和尾E,问每一条线段中包含了多少个线段,(S和E相同不计在内)

    变成坐标系上的点后求每个点左上角的点的个数

    按y从大到小插入结点


    3
    1 2
    0 3
    3 4
    0

    1 0 0

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<cmath>
     6 #include<queue>
     7 #include<map>
     8 using namespace std;
     9 #define MOD 1000000007
    10 const int INF=0x3f3f3f3f;
    11 const double eps=1e-5;
    12 #define cl(a) memset(a,0,sizeof(a))
    13 #define ts printf("*****
    ");
    14 int n,m,tt;
    15 const int MAXN=100005;
    16 int c[MAXN],val[MAXN];
    17 int lowbit(int x)
    18 {
    19     return x&(-x);
    20 }
    21 void add(int i,int val)
    22 {
    23     while(i<=n)
    24     {
    25         c[i]+=val;
    26         i+=lowbit(i);
    27     }
    28 }
    29 int sum(int i)
    30 {
    31     int s=0;
    32     while(i>0)
    33     {
    34         s+=c[i];
    35         i-=lowbit(i);
    36     }
    37     return s;
    38 }
    39 struct node
    40 {
    41     int x,y,id;
    42     void in(int i)
    43     {
    44         scanf("%d%d",&x,&y);
    45         x++,y++;
    46         id=i;
    47     }
    48 }a[MAXN];
    49 bool cmp(node a,node b)
    50 {
    51     if(a.y==b.y)    return a.x<b.x;
    52     return a.y>b.y;
    53 }
    54 int main()
    55 {
    56     int i,j;
    57     #ifndef ONLINE_JUDGE
    58     freopen("1.in","r",stdin);
    59     #endif
    60     while(scanf("%d",&n)!=EOF&&n!=0)
    61     {
    62         cl(val);
    63         cl(c);
    64         cl(a);
    65         for(i=0;i<n;i++)
    66         {
    67             a[i].in(i);
    68         }
    69         sort(a,a+n,cmp);
    70         val[a[0].id]=0;
    71         add(a[0].x,1);
    72         for(i=1;i<n;i++)
    73         {
    74             if(a[i].x==a[i-1].x&&a[i].y==a[i-1].y)  val[a[i].id]=val[a[i-1].id];    //区间完全重合
    75             else
    76             {
    77                 val[a[i].id]=sum(a[i].x);
    78             }
    79             add(a[i].x,1);
    80         }
    81         int k=0;
    82         for(i=0;i<n;i++)
    83         {
    84             if(k++) printf(" ");
    85             printf("%d",val[i]);
    86         }
    87         printf("
    ");
    88     }
    89     return 0;
    90 }
  • 相关阅读:
    VMWare Workstation的激活码 亲测有效
    虚拟机搭建appRtcDemo的appr.tc服务器
    windows webrtc支持H264的源码编译
    windows webrtc 编译
    获取windows系统分屏个数
    windows cmd窗口光标闪动效果消失
    win10 检测系统是不是正版的 以及slmgr.vbm -dlv命令不生效
    symfonos2
    利用ARP欺骗进行MITM(中间人攻击)
    内网学习之MySQL服务提权
  • 原文地址:https://www.cnblogs.com/cnblogs321114287/p/4442068.html
Copyright © 2020-2023  润新知