poj2481树状数组解二维偏序

按区间r降序排列,r相同按照l升序排列,两个区间相同时特判一下即可

/*
给定n个闭区间[l,r],如果对区间[li,ri],[lj,rj]来说,
有区间j严格包含(两个边界不能同时重合)在区间i内,那么区间i大于区间j
问区间有多少个区间大于区间i
读入所有的区间,按r降序,l升序
然后按顺序访问每个区间,
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 100010
struct node{
    int l,r,id;
    bool operator<(const node & a)const {
        if(r==a.r) return l<a.l;
        return r>a.r;
    }
}inv[maxn];
int n,ans[maxn],bit[maxn];
void add(int x){
    for(int i=x;i<=n;i+=i&-i)
        bit[i]+=1;
}
int query(int x){
    int res=0;
    for(int i=x;i;i-=i&-i)
        res+=bit[i];
    return res;
}
int main(){
    while(scanf("%d",&n),n){
        memset(bit,0,sizeof bit);
        for(int i=1;i<=n;i++){
            scanf("%d%d",&inv[i].l,&inv[i].r);
            inv[i].l++;inv[i].r++;
            inv[i].id=i;
        }
        sort(inv+1,inv+1+n);
        memset(ans,0,sizeof ans);
        inv[0].l=-1;inv[0].r=-1;
        for(int i=1;i<=n;i++){
            if(inv[i].l==inv[i-1].l && inv[i].r==inv[i-1].r)
                ans[inv[i].id]=ans[inv[i-1].id];
            else ans[inv[i].id]=query(inv[i].l);
            add(inv[i].l);
        }
        for(int i=1;i<n;i++)
            printf("%d ",ans[i]);
        printf("%d\n",ans[n]);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/zsben991126/p/10079688.html

时间: 2024-10-09 20:12:20

poj2481树状数组解二维偏序的相关文章

免费的馅饼 HYSBZ - 2131 (树状数组维护二维偏序)

题目链接:https://cn.vjudge.net/problem/HYSBZ-2131 题目大意:中文题目 具体思路:对于任意的两个位置,posA和posB,我们可以如下推导. |posA-posB|<=2*(tA-tB) 2*tB-2*tA<=posA-posB<=2*tB-2*tA. 2*tA+posA>=2*tB+posB  || 2*tA -pos A > = 2*tB-posB.(注意这个地方,只要有一个满足就可以了) 然后我们对2*tA+posA进行排序,每一

poj 1195 二维树状数组 及二维树状数组模板

http://poj.org/problem?id=1195 求矩阵和的时候,下标弄错WA了一次... 求矩形(x1,y1) (x2,y2)的sum |sum=sum(x2,y2)-sum(x1-1,y2)-sum(x2,y1-1)+sum(x1-1,y1-1) 二维树状数组讲解:http://blog.csdn.net/u011026968/article/details/38532117 二维树状数组模板: /*========================================

[BZOJ4785][ZJOI2017]树状数组(概率+二维线段树)

4785: [Zjoi2017]树状数组 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 297  Solved: 195[Submit][Status][Discuss] Description 漆黑的晚上,九条可怜躺在床上辗转反侧.难以入眠的她想起了若干年前她的一次悲惨的OI 比赛经历.那是一道 基础的树状数组题.给出一个长度为 n 的数组 A,初始值都为 0,接下来进行 m 次操作,操作有两种: 1 x,表示将 Ax 变成 (Ax + 1)

【树状数组】树状数组一维二维模板

以下模板都是点更新,区间查询,如果是区间更新点查询,只需将利用lowbit的循环方向倒过来 一维: inline int lowbit(int x) { return x & -x; } void add(int x, int val) { for(int i = x; i <= n; i += lowbit(i)) C[i] += val; } int sum(int x) { int ret = 0; for(int i = x; i > 0; i -= lowbit(i)) re

HDU 2642(树状数组模板二维)

Stars Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/65536 K (Java/Others) Total Submission(s): 1350    Accepted Submission(s): 554 Problem Description Yifenfei is a romantic guy and he likes to count the stars in the sky. To make the

poj 2155- Matrix (树状数组,二维,更新区间,查询单点)

Matrix Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row and j-th column. Initially we have A[i, j]

树状数组_二维

class TreeArraryTwo{ public : const static int cmaxn = 1e3+200; int date[cmaxn][cmaxn]; int xsz, ysz; void init(int size_x, int size_y) { xsz = size_x; ysz = size_y; memset(date, 0, sizeof(date)); } inline int lowbit(int idx) { return idx & -idx; } v

UVA 11990 `Dynamic&#39;&#39; Inversion CDQ分治, 归并排序, 树状数组, 尺取法, 三偏序统计 难度: 2

题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3141 题意 一个1到n的排列,每次随机删除一个,问删除前的逆序数 思路 综合考虑,对每个数点,令value为值,pos为位置,time为出现时间(总时间-消失时间),明显是统计value1 > value2, pos1 < pos2, time1 < time2的个

树状数组(二)与poj2155 - matrix

今天下午,我进行了树状数组的进一步学习[1],并完成了poj2155的编程与调试,下面是一些记录与感想. 这道题目是一道二维树状数组的练习,中心思想如下: 1.C(x1, y1)(x2, y2)可以用c[x1][y1]++.c[x2 + 1][y1]++.c[x1][y1 + 1]--.c[x2 + 1][y2 + 1]--进行记录(证明与推理过程在注释[1]中). 2.Q(x, y)利用二维树状数组对c[1][1]到c[x][y]的累加和%2(即mod 2)求得(请各位参看注释[1]的资料自行