poj2481 树状数组

排序后类似stars, 用树状数组。

注意两个数组都要memset和去重

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct data{
    int s, e, i;
    friend bool operator <(data a, data b){
        if (a.e != b.e) return a.e > b.e;
        else return a.s<b.s;
    }
} a[100010];
int t[100010];
int lowbit(int x){
    return x & -x;
}
void build(int x){
    while (x <= 100001){
        t[x] ++;
        x += lowbit(x);
    }
}
int sum(int x){
    int res = 0;
    while (x){
        res += t[x];
        x -= lowbit(x);
    }
    return res;
}
int ans[100010];
int main(){
    int n;
    while (scanf("%d", &n) && n){
        memset(ans, 0, sizeof(ans));
        memset(t, 0, sizeof(t));
        for (int i = 0; i < n; i++) {scanf("%d%d", &a[i].s, &a[i].e);
        a[i].s++; a[i].e++; a[i].i = i;}
        sort(a, a + n);
        build(a[0].s);
        for (int i = 1; i < n; i++){
            if (a[i].s == a[i-1].s && a[i].e == a[i-1].e) {
                ans[a[i].i] = ans[a[i-1].i];
                build(a[i].s);
                continue;
            }
            ans[a[i].i] = sum(a[i].s);
            //cout<<a[i].i<<"    "<<a[i].s<<' '<<a[i].e<<' '<<ans[a[i].i]<<endl;
            build (a[i].s);
        }
        for (int i = 0; i < n-1; i++) printf("%d ", ans[i]); printf("%d", ans[n-1]);
        printf("\n");
    }
    return 0;
}
时间: 2024-11-03 11:02:07

poj2481 树状数组的相关文章

js用闭包遍历树状数组的方法

 这篇文章主要介绍了js中用闭包遍历树状数组的方法,需要的朋友可以参考下 做公司项目时,要求写一个方法,方法的参数为一个菜单数组集合和一个菜单id,菜单数组的格式为树状json,如下面所示: 代码如下:[{"id":28,"text":"公司信息","children":[        {"id":1,"text":"公司文化"},        {"id

树状数组专题【完结】

1 国外的论文点击打开链接 2 我的总结点击打开链接 任何能够造成树状数组下表为0的操作都会使得程序TLE,这是个很重要的地方! 第一题 poj 2299 Ultra-QuickSort 点击打开poj 2299 思路: 离散化+树状数组 分析: 1 题目的意思就是要求逆序数对 2 题目的输入个数有500000的规模但是每个数的最大值为999999999,因此我们需要离散化这些数据 3 对于数据9 1 0 5 4我们离散化成5 2 1 4 3 那么对于输入一个树a[i]我们去求一下它的离散化后的

hdu 1556 Color the ball 树状数组

    最基本的树状数组,成段更新,感觉只要构造的时候保证两端平衡,即对后面非更新地方无影响即可,所以这题是a++ (b+1)--    温习了下快速IO,速度果然提升1倍 /* author:jxy lang:C/C++ university:China,Xidian University **If you need to reprint,please indicate the source** */ #include <iostream> #include <cstdio> #

HDU 4311 树状数组+二分

题意:给出10W个点,找出一个点使得每点按网格走到它的步数和最小,求最小步数和.每步这么走Eg: (x,y) can be reached from (x-1,y), (x+1,y), (x, y-1), (x, y+1).. a点到达b点的步数为abs(b.x-a.x)+abs(b.y-a.y) 那么a点到所有点的步数和为abs(pi.x-a.x)+abs(pi.y-ay)所以按照从小到大的顺序吧x,y的值排序,二分查找a.x a.y在数组中的位置,就是给上面那个求和在打开就变成abs(num

[php]运用变量引用实现一维数组转多维树状数组

/** * 运用 变量引用 实现 一维数组 转 多维树状数组 * @param $array * @param array $options = ['id'=>'id', 'pid'=>'pid', 'sub'=>'_sub', 'root'=>0] * @return array */ public static function array2Tree($array, $options = []) { /** merge Options */ $opt = array_merge

poj 2352 Stars 树状数组

     统计x之前出现数字的次数,线段树和树状数组都可以,但明显树状数组更简洁 /* author:jxy lang:C/C++ university:China,Xidian University **If you need to reprint,please indicate the source** */ #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring&g

树状数组

                                                     1 一维树状数组   1 什么是树状数组        树状数组是一个查询和修改复杂度都为log(n)的数据结构,假设数组A[1..n],那么查询A[1]+...+A[n]的时,间是log级别的,而且是一个在线的数据结构.   2 树状数组作用        我们经常会遇到动态连续和查询问题,给定n个元素A[1~N],让我们求sum[L,R] = A[L]+...+A[R],或者更改A[i]

经典算法题每日演练——第十题 树状数组

原文:经典算法题每日演练--第十题 树状数组         有一种数据结构是神奇的,神秘的,它展现了位运算与数组结合的神奇魅力,太牛逼的,它就是树状数组,这种数据结构不是神人是发现不了的. 一:概序      假如我现在有个需求,就是要频繁的求数组的前n项和,并且存在着数组中某些数字的频繁修改,那么我们该如何实现这样的需求?当然大家可以往 真实项目上靠一靠. ① 传统方法:根据索引修改为O(1),但是求前n项和为O(n). ②空间换时间方法:我开一个数组sum[],sum[i]=a[1]+..

poj 3486 A Simple Problem with Integers(树状数组第三种模板改段求段)

/* 树状数组第三种模板(改段求段)不解释! 不明白的点这里:here! */ #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #define N 100005 using namespace std; typedef long long LL; LL ss[N], B[N], C[N]; int n, m; void addB(int x, int k){/