首页 > 其他分享 >「学习笔记」二维数点

「学习笔记」二维数点

时间:2023-08-06 19:56:31浏览次数:44  
标签:ch emplace yl int 数点 back 笔记 read 二维

P2163 [SHOI2007] 园丁的烦恼 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

这个是二维数点的板子题,二维数点这一类题目就是上面的题所描述的,我们用树状数组 + 离散化来解决这个问题。

这里就不解释了,记录此篇博文的目的主要就是提醒自己曾经学过这个,看看代码,方便回忆起来。

这题其实不用离散化,离散化会 T,开 O2 才能过。

//The code was written by yifan, and yifan is neutral!!!

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define bug puts("NOIP rp ++!");
typedef pair<int, int> pii;
#define lowbit(x) (x & (-x))

template<typename T>
inline T read() {
    T x = 0;
    bool fg = 0;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        fg |= (ch == '-');
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        x = (x << 3) + (x << 1) + (ch ^ 48);
        ch = getchar();
    }
    return fg ? ~x + 1 : x;
}

const int N = 1e6 + 5;

int n, m, lim;
ll t[N << 3];
ll ans[N];
pii v[N];
vector<int> s;

struct vt {
    int x, y;
} V[N];

struct ASK {
    int xl, yl, xr, yr;
} Ask[N << 2];

struct Query {
    int x, y, opt, id;
} ask[N << 2];

void add(int x, int v) {
    while (x <= lim) {
        t[x] += v;
        x += lowbit(x);
    }
}

ll query(int x) {
    ll ans = 0;
    while (x) {
        ans += t[x];
        x -= lowbit(x);
    }
    return ans;
}

int main() {
    n = read<int>(), m = read<int>();
    s.emplace_back(-100);
    for (int i = 1; i <= n; ++ i) {
        int x = read<int>(), y = read<int>();
        V[i] = vt{x, y};
        s.emplace_back(x), s.emplace_back(y);
    }
    for (int i = 1; i <= m; ++ i) {
        int xl = read<int>(), yl = read<int>(), xr = read<int>(), yr = read<int>();
        Ask[i] = ASK{xl, yl, xr, yr};
        s.emplace_back(xl), s.emplace_back(yl);
        s.emplace_back(xr), s.emplace_back(yr);
    }
    sort(s.begin(), s.end());
    s.erase(unique(s.begin(), s.end()), s.end());
    for (int i = 1; i <= n; ++ i) {
        int x = lower_bound(s.begin(), s.end(), V[i].x) - s.begin() + 1;
        int y = lower_bound(s.begin(), s.end(), V[i].y) - s.begin() + 1;
        v[i] = {x, y};
        // cout << x << ' ' << y << '\n';
    }
    for (int i = 1; i <= m; ++ i) {
        int xl = lower_bound(s.begin(), s.end(), Ask[i].xl) - s.begin() + 1;
        int yl = lower_bound(s.begin(), s.end(), Ask[i].yl) - s.begin() + 1;
        int xr = lower_bound(s.begin(), s.end(), Ask[i].xr) - s.begin() + 1;
        int yr = lower_bound(s.begin(), s.end(), Ask[i].yr) - s.begin() + 1;
        ask[i] = Query{xl - 1, yl - 1, 1, i};
        ask[i + m] = Query{xl - 1, yr, -1, i};
        ask[i + 2 * m] = Query{xr, yl - 1, -1, i};
        ask[i + 3 * m] = Query{xr, yr, 1, i};
    }
    sort(v + 1, v + n + 1);
    sort(ask + 1, ask + 4 * m + 1, [](Query a, Query b) -> bool {
        return a.x < b.x;
    });
    int cur = 1;
    lim = s.size();
    for (int i = 1; i <= 4 * m; ++ i) {
        Query it = ask[i];
        while (v[cur].first <= it.x && cur <= n) {
            add(v[cur].second, 1);
            ++ cur;
        }
        ans[it.id] += it.opt * query(it.y);
    }
    for (int i = 1; i <= m; ++ i) {
        cout << ans[i] << '\n';
    }
    return 0;
}

标签:ch,emplace,yl,int,数点,back,笔记,read,二维
From: https://www.cnblogs.com/yifan0305/p/17609833.html

相关文章

  • qrcode生成二维码
    jsqrcode包生成二维码安装npminstall--saveqrcode或者,全局安装以便从命令行保存qrcode图像或生成您可以在您的终端中查看的图像。npminstall-gqrcode使用importQRCodefrom"qrcode"letcode="string....";QRCode.toDataURL(code,{errorCorrect......
  • 【狂神说Java】Java零基础学习笔记-Java方法
    【狂神说Java】Java零基础学习笔记-Java方法Java方法01:何谓方法?System.out.println(),那么它是什么呢?Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用设计方法的原则:方......
  • 博弈论笔记
    博弈论公平组合游戏公平组合游戏(ImpartialGame)的定义如下:\(\bullet\)游戏有两个人参与,二者轮流做出决策,双方均知道游戏的完整信息;\(\bullet\)任意一个游戏者在某一确定状态可以作出的决策集合只与当前的状态有关,而与游戏者无关;\(\bullet\)游戏中的同一个状态不可能多次......
  • 系统架构设计师笔记第45期:SOA参考架构
    SOA(Service-OrientedArchitecture,面向服务的架构)是一种软件设计和开发的方法论,它将软件系统划分为一组相互协作的服务。下面是一个示例的SOA参考架构,展示了不同服务之间的关系和功能:服务提供者(ServiceProvider):这些服务提供者负责实现和提供具体的功能服务,如用户管理服务、支付服......
  • VIM进阶学习笔记(二) 总结复习vim的移动光标导航
    惊闻vim作者BramMoolenaar去世,享年62岁。唉,这vim还没学会,太遗憾了。。。几十年致力于这么伟大的工具开发,令人敬佩。致敬。 个人从vim大致入门后,使用了基本配置vim操作体验来看,vim是在Linux等命令行界面,以及鼠标还未普及的情况下,使得通过纯键盘操作达到十分便捷的强大编......
  • 流畅的python笔记 (一) 1.python的数据模型
    python的数据模型:python风格的设计思想完全体现在Python的数据模型上,而数据模型所描述的API,为使用最地道的语言特性来构建你自己的对象提供了工具。数据模型其实是对Python框架的描述,它规范了这门语言自身构建模块的接口,这些模块包括但不限于序列、迭代器、函数、类和上下文管理......
  • 笔记|数据库设计——《数据库原理》
    数据库结构设计包括⚫需求分析阶段:综合各个用户的应用需求⚫概念结构设计:形成独立于各个DBMS概念模式,如E-R图⚫逻辑结构设计:形成数据库逻辑模式与外模式,用(基本)数据模型描述,例基本表、视图等⚫物理结构设计:形成数据库内模式,如DB文件或目录、索引一.需求分析......
  • 「学习笔记」扫描线
    什么是扫描线?顾名思义,一根用来扫描的线扫描线就是一条线在整个图上扫来扫去,它一般被用来解决图形面积,周长,以及二维数点等问题。下面我们用例题来引入。P5490【模板】扫描线-洛谷|计算机科学教育新生态(luogu.com.cn)我们对于这种题有三种做法暴力的进行覆盖扫描容......
  • 笔记|《Python数据分析基础》
    python基础StrategyforFindingaRegexWeneedastrategytofindaregexthatmatchesallthewinnersbutnoneofthelosers.Icameupwiththisapproach:Generateapoolofregexparts:smallregexesofafewcharacters,suchasoror."bu"&......
  • 实现二维卷积层
    importtorchfromtorchimportnnfromd2limporttorchasd2ldefcorr2d(x,k):"""计算二维互相关运算"""#获取卷积核的高和宽h,w=k.shape#输出的高和宽y=torch.zeros((x.shape[0]-h+1,x.shape[1]-w+1))foriinrange(y.shape[0......