zoukankan      html  css  js  c++  java
  • USACO 2017 February Contest Gold T3: Why Did the Cow Cross the Road III

    题目大意

    给定长度为2N的序列,1~N各出现过2次,i第一次出现位置记为ai,第二次记为bi,求满足 ai<aj<bi<bj 的对数

    题目分析

    把所有数对找出来,然后按左端点排序。令当前数对为j, 那么排序保证了 ai<aj<bj ,然后每次统计左右端点之间的标记个数,即找出aj与bj间的bi, 其个数就是该数对的答案。用树状数组维护即可。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int MAXN=1e5+10;
     4 
     5 
     6 struct Node{
     7     int l,r;
     8 }s[MAXN];
     9 inline bool cmp(Node x,Node y){
    10     return x.l<y.l;
    11 }
    12 
    13 int n,ans;
    14 int BIT[MAXN];
    15 inline int lowbit(int x){
    16     return x&(-x);
    17 }
    18 inline void Update(int x,int v){
    19     for(int i=x;i<=n*2;i+=lowbit(i))
    20         BIT[i]+=v;
    21 } 
    22 inline int Query(int x){
    23     int res=0;
    24     for(int i=x;i;i-=lowbit(i))
    25         res+=BIT[i];
    26     return res;
    27 }
    28 int main(){
    29     scanf("%d",&n);
    30     for(int i=1,x;i<=n*2;++i){
    31         scanf("%d",&x);
    32         if(!s[x].l) s[x].l=i;
    33         else s[x].r=i;
    34     }
    35     sort(s+1,s+n+1,cmp);
    36     for(int i=1;i<=n;++i){
    37         Update(s[i].r,1);
    38         ans+=Query(s[i].r-1)-Query(s[i].l);
    39     }
    40     printf("%d
    ",ans);
    41     return 0;
    42 }
  • 相关阅读:
    go基础_defer
    go基础_函数
    go基础_控制语句
    go基础_数组
    go基础_切片
    go命令行参数
    Hdu2795Billboard线段树
    Hdu1394Minimum Inversion Number线段树
    Hdu1754单点更新
    Hdu1166单点更新线段树
  • 原文地址:https://www.cnblogs.com/LI-dox/p/11228728.html
Copyright © 2011-2022 走看看