首页 > 其他分享 >2021杭电多校1 J (普通莫队 树状数组)

2021杭电多校1 J (普通莫队 树状数组)

时间:2022-09-26 15:58:32浏览次数:45  
标签:杭电多校 cnt const int tr pos 2021 poi 莫队

题意: 给出1e5个二维平面上的坐标点 0 <= (x, y) <= 1e5, 1e5个询问,每次问x0,y0 到x1,y1的矩阵中有多少y值不同的坐标点。
思路: 操作只有询问,不强制在线,数据范围1e5,就差把莫队的tag标上去了。 莫队离线处理询问区间和区间种类数,求值域内的数用权值线段树或者树状数组解决。
时间复杂度\(ONsqrt(N)log(N)\)
5e8的时间复杂度:
image

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false) ,cin.tie(0), cout.tie(0);
//#pragma GCC optimize(3,"Ofast","inline")
#define ll long long
#define PII pair<int, int>
//#define int long long
const int N = 1e5 + 5;
const int M = 5e5 + 5;
const int INF = 0x3f3f3f3f;
const ll LNF = 0x3f3f3f3f3f3f3f3f;
const int mod = 998244353;
const double PI = acos(-1.0);
int tr[N];
struct Poi { int l, r, id, up, down; } poi[N];
int belong[N], blo;
int a[N], ans[N], cnt[N];
int m, n;
bool st[N];
int lowbit(int x) { return (-x) & x; }
void modify(int x, int val) {
    for (int i = x; i < N; i += lowbit(i)) tr[i] += val;
}
int query(int l, int r) {
    int res = 0;
    for ( int i = r; i; i -= lowbit(i) ) res += tr[i];
    if(l == 1) return res;
    for ( int i = l - 1; i; i -= lowbit(i) ) res -= tr[i];
    return res;
}

int cmp (Poi a, Poi b) {
    return (belong[a.l] ^ belong[b.l]) ? belong[a.l] < belong[b.l] :
    ((belong[a.l] & 1) ? a.r < b.r : a.r > b.r);
}
void add(int pos) { if(!cnt[a[pos]]) modify(a[pos], 1); ++cnt[a[pos]]; }
void del(int pos) { --cnt[a[pos]]; if(!cnt[a[pos]]) modify(a[pos], -1); }
void init() {
    memset(st, 0, sizeof st);
    memset(cnt, 0, sizeof cnt);
    memset(tr, 0, sizeof tr);
}
void solve() {
    cin >> n >> m;
    init();
    blo = sqrt(n);
    for ( int i = 1; i <= n; ++ i ) belong[i] = (i - 1) / blo + 1;
    for ( int i = 1; i <= n; ++ i ) cin >> a[i], ++ a[i];
    for ( int i = 1; i <= m; ++ i ) {
        cin >> poi[i].l >> poi[i].down >> poi[i].r >> poi[i].up;
        poi[i].down ++, poi[i].up ++;
        poi[i].id = i;
    }
    sort(poi + 1, poi + m + 1, cmp);
    int l = 1, r = 0;
    for ( int i = 1; i <= m; ++ i ) {
        int ql =poi[i].l,qr=poi[i].r;
        while(l < ql) del(l++);
        while(l > ql) add(--l);
        while(r < qr) add(++r);
        while(r > qr) del(r--);
        ans[poi[i].id] = query(poi[i].down, poi[i].up);
    }

    for(int i=1; i<=m; ++i) cout << ans[i] << "\n";
}
int main() {
    IOS
    int t; cin >> t;
    while(t -- ) solve();
    return 0;
}

标签:杭电多校,cnt,const,int,tr,pos,2021,poi,莫队
From: https://www.cnblogs.com/muscletear/p/16731182.html

相关文章

  • 2021-2022-1 20211420《信息安全系统设计基础》课程总结
    每周作业链接汇总第一周作业2021-2022-120211420《信息安全专业导论》第一周学习总结2021-2022-120211420《信息安全专业导论》自我介绍2021-2022-120211420《......
  • 【补题计划】CSP-S 2021
    【CSP-S2021】补题记录T1[CSP-S2021]廊桥分配这明显就不是普通的签到题啊(记得当时我刚学OI只会数组和for循环搞出来15pts)......
  • 上市公司排污费和环境保护税数据(1990-2021)
     最新版数据已整理为Excel格式,数据的时间区间为1990-2021年,内含“数据+计算方法+数据来源+参考文献”!数据来源:https://idata.work/forum.php?mod=viewthread&tid=17&......
  • 2022杭电多校7
    这场难度有点大可改的题没几个B.IndependentFeedbackVertexSet题意:有1-n个点,每个点有权值。初始三个点的互相连接。接下来从第4个点开始,每次给出两个点,保证这两个......
  • Premiere Pro 2021 for Mac(pr 2021 直装版)v15.4.1中文版
    PremierePro2021forMac是Adobe公司旗下的一款功能强大的视频编辑软件,具有智能化视频剪辑工具,可以为您提供采集、剪辑、调色、美化音频、字幕添加、输出、DVD刻录的一整......
  • CSP2021括号序列
    [CSP-S2021]括号序列题目描述小w在赛场上遇到了这样一个题:一个长度为\(n\)且符合规范的括号序列,其有些位置已经确定了,有些位置尚未确定,求这样的括号序列一共有多少......
  • JOIG 2021/2022 F 题解
    链接题意:给定一张\(n\)个点,\(m\)条边的无向图(保证没有重边、自环)。边有两种,\(type=1\)时,经过后手中的数\(-1\);\(type=2\)时,经过后手中的数\(\div2\)下取整。给定......
  • 【补题计划】NOIP 2021
    前言听说Eafoo最近在搞真题,正好闲来无事(其实没有啦),也开始我的补题计划T1[NOIP2021]报数签到题qwq不过也没见过这么水的签到题就是筛啦还有就是筛的时候不要卡在1e7......
  • 2022杭电多校8
    A.Theramore题意:给定一个01串,可以选择一个奇数长度的区间,使得该区间翻转,求任意次数操作后的最小字典序。分析:我们发现不管怎么转,奇数位置上的数永远在奇数上,偶数永远......
  • 2021 ccpc 威海 D. Period(next数组)
    https://vjudge.net/problem/Gym-103428D题意:给你一个字符串,q次查询,每次查询会将字符串中的一个字符修改为#,求在新串中可以选出几种长度不同的前后缀,使得前后缀相同分析......