题目链接:点击查看

题目大意:二维平面坐标系中给出 nnn 个坐标点,然后是 mmm 次询问,每次询问需要回答一个闭合矩阵中有多少个点

题目分析:想挂树套树来着,但是复杂度有点大。本题不带修且可以离线,考虑将一个询问拆成四个二维前缀和的表示形式,然后就可以排个序直接用树状数组统计啦

有个小细节就是当 xxx 坐标相同时,需要先加点然后再询问。注意树状数组下标不能从 000 开始,所以需要坐标统一偏移 111 个单位

2021.8.26 UPDATE:

听camp的时候意识到主席树也能二维数点,对 xxx 轴可持久化,对 yyy 轴建立权值线段树就可以啦,带修的话可以挂带修主席树

本题内存给的不是很多,如果是桶排 vector 存点的话会 MLE,map 离散化的话会 TLE,毒瘤题当然要用毒瘤的 unordered_map 去卡

代码:
树状数组

// Problem: P2163 [SHOI2007]园丁的烦恼
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2163
// Memory Limit: 125 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<list>
#include<unordered_map>
#define lowbit(x) (x&-x)
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
template<typename T>
inline void read(T &x)
{T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f;
}
template<typename T>
inline void write(T x)
{if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0');
}
const int inf=0x3f3f3f3f;
const int N=1e7+100;
struct Node {int x,y,type,op,id;bool operator<(const Node& t)const {if(x!=t.x) {return x<t.x; } else {return type<t.type;}}
};
vector<Node>node;
int ans[N],c[N];
void add(int x) {for(int i=x;i<N;i+=lowbit(i)) c[i]++;
}
int ask(int x) {int ans=0;for(int i=x;i>0;i-=lowbit(i)) ans+=c[i];return ans;
}
int main()
{#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int n,m;read(n),read(m);for(int i=1,x,y;i<=n;i++) {read(x),read(y);x++,y++;node.push_back({x,y,0,-1,-1});}for(int i=1,x1,x2,y1,y2;i<=m;i++) {read(x1),read(y1),read(x2),read(y2);x1++,x2++,y1++,y2++;node.push_back({x2,y2,1,1,i});node.push_back({x1-1,y1-1,1,1,i});node.push_back({x1-1,y2,1,-1,i});node.push_back({x2,y1-1,1,-1,i});}sort(node.begin(),node.end());for(auto it:node) {if(it.type==1) {//askans[it.id]+=it.op*ask(it.y);} else {//addadd(it.y);}}for(int i=1;i<=m;i++) {printf("%d\n",ans[i]);}return 0;
}

主席树:

// Problem: P2163 [SHOI2007]园丁的烦恼
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2163
// Memory Limit: 125 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<list>
#include<unordered_map>
#define lowbit(x) (x&-x)
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
template<typename T>
inline void read(T &x)
{T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f;
}
template<typename T>
inline void write(T x)
{if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0');
}
const int inf=0x3f3f3f3f;
const int N=1e7+100;
struct Node {int l,r,sum;
}tree[500005*30];
int root[N],cnt;
unordered_map<int,vector<int>>node;
void update(int &k,int pos,int l,int r) {tree[++cnt]=tree[k];k=cnt;tree[k].sum++;if(l==r) return;int mid=(l+r)>>1;if(pos<=mid) update(tree[k].l,pos,l,mid);else update(tree[k].r,pos,mid+1,r);
}
int query(int i,int j,int l,int r,int L,int R) {if(L>r||R<l) return 0;if(L>=l&&R<=r) return tree[j].sum-tree[i].sum;int mid=(L+R)>>1;return query(tree[i].l,tree[j].l,l,r,L,mid)+query(tree[i].r,tree[j].r,l,r,mid+1,R);
}
void init() {cnt=0;root[0]=0;tree[0].l=tree[0].r=tree[0].sum=0;
}
int main()
{#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);init();int n,m;read(n),read(m);for(int i=1;i<=n;i++) {int x,y;read(x),read(y);x++,y++;node[x].push_back(y);}for(int x=1;x<N;x++) {root[x]=root[x-1];if(!node.count(x)) {continue;}for(auto y:node[x]) {update(root[x],y,1,N);}}while(m--) {int x1,y1,x2,y2;read(x1),read(y1),read(x2),read(y2);x1++,x2++,y1++,y2++;printf("%d\n",query(root[x1-1],root[x2],y1,y2,1,N));}return 0;
}

洛谷 - P2163 [SHOI2007]园丁的烦恼(不带修二维数点-树状数组/主席树)相关推荐

  1. 洛谷 - P4390 [BOI2007]Mokia 摩基亚(带修二维数点-四叉线段树/CDQ分治)

    题目链接:点击查看 题目大意:给出一个二维平面坐标系,需要执行数次操作,具体操作分为下列两种: 1 x y a:坐标 (x,y)(x,y)(x,y) 加上 aaa 个点 2 x1 y1 x2 y2:查 ...

  2. 洛谷 P2163 [SHOI2007]园丁的烦恼 (离线sort,树状数组,解决三维偏序问题)

    P2163 [SHOI2007]园丁的烦恼 题目描述 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草. 有一天国王漫步在花园 ...

  3. P2163 [SHOI2007]园丁的烦恼(二维数点模板题)

    P2163 [SHOI2007]园丁的烦恼 题意: 在一个二维平面内有一些点,给你一个左上角和右下角的点,问这个范围内有多少点 题解: 二维数点模板题 我们设F(a,b)表示以(0,0)为左下角,(a ...

  4. P2163 [SHOI2007]园丁的烦恼 (CDQ 分治)

    P2163 [SHOI2007]园丁的烦恼 注意x = 0 和 y = 0; 题目背景 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各 ...

  5. 洛谷 P2163 [SHOI2007]Tree 园丁的烦恼

    此题树状数组卡常好题(滑稽) 题目描述 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草.有一天国王漫步在花园里,若有所思,他 ...

  6. 洛谷P1527 [国家集训队] 矩阵乘法 [整体二分,二维树状数组]

    题目传送门 矩阵乘法 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入格式: 第一行两个数N,Q,表示矩阵大小和询问组数: 接下来N行N列一共N* ...

  7. [洛谷]P3374 【模板】树状数组 1 (#树状数组)

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...

  8. 洛谷P3688/uoj#291. [ZJOI2017]树状数组

    传送门(uoj) 传送门(洛谷) 这里是题解以及我的卡常数历程 话说后面那几组数据莫不是lxl出的这么毒 首先不难发现这个东西把查询前缀和变成了查询后缀和,结果就是查了\([l-1,r-1]\)的区间 ...

  9. 树状数组入门——以洛谷3374为例

    树状数组入门 含义:顾名思义,用树状表示的数组 功能:是一个查询和修改复杂度都为log(n)的数据结构.主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值:经过简单修改可以在log( ...

最新文章

  1. PHP学习总结(7)——PHP入门篇之PHP注释
  2. error: index-pack died of signal fatal: index-pack failed【Git】
  3. java 单个用户的多重并发会话_单个用户的多重并发会话限制/限制单客户端同时登录多个用户...
  4. 对11位手机号进行3-4-4格式化
  5. 只导出项目需要的pip依赖包-方法的缺陷
  6. 前端Javascript与Nodejs的异同
  7. tooctalstring_Java Long类toOctalString()方法的示例
  8. java 判断范围_java判断一个点是否在一个围栏范围内
  9. Oracle备份还原
  10. 两分钟让你变成jar包制作高手
  11. 文档屏幕水印_您的文档何时需要屏幕截图?
  12. 百度车牌识别API-Python版
  13. 【破解APP抓包限制】Xposed+JustTrustMe关闭SSL证书验证!
  14. 边框给背景图css怎么写,使用css设置边框背景图片
  15. win10下安装Elasticsearch和kibana教程
  16. c语言倒直角梯形,请问一下大佬们这段代码问题在哪里?
  17. (8)web安全|渗透测试|网络安全 常见的站点搭建类型分析,子域名爆破,旁注等,WAF防护分析及绕过,wafwoof工具的安装和使用
  18. Swift编程语言简介
  19. 2022最新超级蜘蛛池站群优化网站系统源码
  20. java 多个线程同时写同一个文件

热门文章

  1. 龙书啃不动?老司机带你从零入门编译原理,开发编译器
  2. hdfs安全模式退出_浅谈HDFS(二)之NameNode与SecondaryNameNode
  3. Nacos源码覆盖实例列表
  4. RocketMQ消息支持的模式-OrderProducer(顺序)
  5. 收货地址 - 需求分析与表设计
  6. 微服务网关-Gateway-LoadBalancerClient实现负载均衡讲解
  7. 用户操作-登录代码实现
  8. 字节输出流的续写和换行
  9. 函数基本使用-函数的定义以及调用执行线路图
  10. SpringBoot_日志-SpringBoot日志关系