首页 > 其他分享 >P10814 【模板】离线二维数点 题解

P10814 【模板】离线二维数点 题解

时间:2024-07-31 11:57:11浏览次数:9  
标签:le P10814 log int 题解 离线 pos 端点

题目传送门

思路

一眼主席树板子题,但是一看数据范围 \(n,m\le 2\times 10 ^ 6\),似了

在线做法应该是似完了,考虑离线做法。

我们知道树状数组是可以做二维偏序的,大家应该都知道一个经典问题:对于一个序列,多次询问下标 \(\le a\) 且数值 \(\le b\) 的数的个数。

回到这道题,相比上面只多了一个左端点的限制当然还有数据范围,所以可以采用类似前缀和的方法,对于一个询问 \(\{l, r, x\}\),用 \([1, r]\) 的这种数的个数减去 \([1, l - 1]\) 中的即可。

那么可以将询问拆成两部分,一部分是左端点减一,一部分是右端点,同时还要记录符号,左端点是减,右端点是加。
接下来就可以像扫描线一样,将 \(pos\) 按从小到大排序,然后从左到右扫描一遍计算答案就行了。

时间复杂度 \((n\log {2\cdot 10 ^ 6} + m\log m + m\log n)\),若都与 \(n\) 同级就为 \(O(n\log n)\)。

\(\texttt{Code:}\)

#include <iostream>
#include <algorithm>

#define lowbit(x) x & -x
using namespace std;

const int N = 2000010;

int n, m;
int a[N];
struct BIT{
    int c[N];
    void add(int x, int y) {
        for(; x < N; x += lowbit(x)) c[x] += y;
    }
    int ask(int x) {
        int res = 0;
        for(; x; x -= lowbit(x)) res += c[x];
        return res; 
    }
}tr;

struct node{
    int id, pos, x, sign;
    bool operator< (const node &o) const {
        return pos < o.pos;
    }
}q[N << 1];
int tt;
int ans[N];

int main() {
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
    int l, r, x;
    for(int i = 1; i <= m; i++) {
        scanf("%d%d%d", &l, &r, &x);
        q[++tt] = {i, l - 1, x, -1};
        q[++tt] = {i, r, x, 1};
    }
    sort(q + 1, q + tt + 1);
    int id = 1;
    for(int i = 1; i <= tt; i++) {
        while(id <= q[i].pos && id <= n) tr.add(a[id++], 1);
        ans[q[i].id] += q[i].sign * tr.ask(q[i].x);
    }
    for(int i = 1; i <= m; i++)
        printf("%d\n", ans[i]);
    return 0;
}

标签:le,P10814,log,int,题解,离线,pos,端点
From: https://www.cnblogs.com/Brilliant11001/p/18334341

相关文章

  • P2163 [SHOI2007] 园丁的烦恼 题解
    题目传送门题目大意:在一个平面直角坐标系上,给定\(n\)个点的坐标\((x,y)\),\(m\)次询问,每次询问一个矩形范围内的点的数量,此矩形用\(\{a,b,c,d\}\)来描述,其中\((a,b)\)为左下角,\((c,d)\)为右上角。思路:不难将题目转化为:给定一个长度为\(n\)的序列,序列中的每个元......
  • CF1997(edu168)题解 A-F
    A.StrongPassword注意到最大效果是在两个相同字符之间插入一个不同的,贡献为3。否则在一开始插入一个和首位不同的,贡献为2。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;voidsolve(){strings;cin>>s;boolok=0;for(inti......
  • 【题解】2024牛客多校第5场
    E安https://ac.nowcoder.com/acm/contest/81600/E分析简单博弈/思维题。当ai>bi时,当前骑士一定存活。当ai<bi时,当前骑士一定死亡。为了使得自己存活的骑士尽可能多,若存在ai=bi的情况,一定会选择令该骑士去攻击对方,并且双方均会轮流优先选择此类骑士。......
  • 07-30 题解
    07-30题解A朴素的想法$dp(i,j,k)$表示考虑到第\(i\)位,前\(i\)位的和为\(j\),第\(i\)位的值为\(k\)然后咋转移?重新定义移动小球的方式:从自己右边的邻居拿过来正数个球拿过来负数个球(即往右边的邻居放正数个球)在第2种操作中,我们拿走的球会被后面放过来......
  • Luogu P1983 车站分级 题解 [ 绿 ] [ 拓扑排序 ] [ 图论建模 ] [ 虚点 ]
    车站分级:很好的拓扑排序题,细节有点多。图论建模首先观察对于一条线路,我们可以从中直接得到什么信息:假设这条线路的开头为\(st\),结尾为\(ed\),那么在\([st,ed]\)的车站中,没有被选入线路的点一定比选入线路的点的级数至少少\(1\)。对于这一点条件,我们就可以建模了。......
  • CF538H Summer Dichotomy 题解
    Description有\(T\)名学生,你要从中选出至少\(t\)人,并将选出的人分成两组,可以有某一组是空的。有\(n\)名老师,每名老师要被分配到两个小组之一,对于第\(i\)名老师,要求所在的小组中的学生人数\(\in[l_i,r_i]\)。此外,有\(m\)对老师不能在同一个小组中。你需要判断能否......
  • SP8099 TABLE - Crash´s number table 题解
    题目传送门前置知识一般的积性函数|数论分块|莫比乌斯反演解法令\(n\lem\)。考虑莫比乌斯反演,推式子,有\(\begin{aligned}&\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\operatorname{lcm}(i,j)\\&=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\frac{ij}{\gcd(i,j)......
  • 题解:Pinely Round 4 (Div. 1 + Div. 2) A
    A.MaximizetheLastElementtimelimitpertest:1secondmemorylimitpertest:256megabytesinput:standardinputoutput:standardoutputYouaregivenanarray\(a\)of\(n\)integers,where\(n\)isodd.Inoneoperation,youwillremovetwoa......
  • P4449 于神之怒加强版 (题解)
    题目链接P4449于神之怒加强版题目大意:求\[\sum_{i=1}^{n}\sum_{j=1}^{m}gcd(i,j)^k\]\(数据范围n,m\leq5e6\)\(二话不说,先开导式子(假定n<m):\)\begin{aligned}ans&=\sum_{i=1}^{n}\sum_{j=1}^{m}gcd(i,j)^k\\\end{aligned}\[先套路地枚举d=gcd(i,j)\]\begin{align......
  • 题解 - Alice
    题目描述Alice和Bob在玩游戏,游戏规则如下:有两堆石子,每堆石子有非负整数个Alice与Bob轮流操作,Alice先手,每次可以从任意一堆石子中取出若干个取出的石子个数应满足为另一堆石子个数的因数(此处规定任何数均为0的因数)将石子取完的玩家获胜给定一个初始状态,现......