BZOJ原题链接

洛谷原题链接

很容易想到二维前缀和。

设\(S[i][j]\)表示矩阵\((0, 0)(i, j)\)内树木的棵数,则询问的矩形为\((x, y)(xx, yy)\)时,答案为\(S[xx][yy] - S[x - 1][yy] - S[xx][y - 1] + S[x - 1][y - 1]\)。

但这题坐标极大,显然不能直接求。

对\(x,y\)都进行离散化,然后我们考虑求询问。

将询问的矩阵拆成二维前缀和计算形式的四个矩阵,这样就可以用扫描线快速求矩阵,并统计答案即可。

这里我是用树状数组来维护的。

因为偷懒就用了\(vector\)

#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int N = 5e5 + 10;
struct dd {
int x, y, xx, yy;
};
dd a[N];
int tr_x[N], tr_y[N], ls_x[N << 2], ls_y[N << 2], C[N], an[N], nl, ml, xl, yl;
vector<int>X[N], q_1[N], q_2[N];
inline int re()
{
int x = 0;
char c = getchar();
bool p = 0;
for (; c < '0' || c > '9'; c = getchar())
p |= c == '-';
for (; c >= '0' && c <= '9'; c = getchar())
x = x * 10 + c - '0';
return p ? -x : x;
}
inline int lowbit(int x) { return x & -x; }
inline void add(int x)
{
for (; x <= ml; x += lowbit(x))
C[x]++;
}
inline int ask(int x)
{
int s = 0;
for (; x; x -= lowbit(x))
s += C[x];
return s;
}
inline int BSX(int x)
{
int l = 1, r = nl, mid;
while (l <= r)
{
mid = (l + r) >> 1;
if (!(ls_x[mid] ^ x))
return mid;
ls_x[mid] > x ? r = mid - 1 : l = mid + 1;
}
return 0;
}
inline int BSY(int x)
{
int l = 1, r = ml, mid;
while (l <= r)
{
mid = (l + r) >> 1;
if (!(ls_y[mid] ^ x))
return mid;
ls_y[mid] > x ? r = mid - 1 : l = mid + 1;
}
return 0;
}
int main()
{
int i, j, n, m, L;
n = re();
m = re();
for (i = 1; i <= n; i++)
{
tr_x[i] = re() + 1;
tr_y[i] = re() + 1;
ls_x[++xl] = tr_x[i];
ls_y[++yl] = tr_y[i];
}
for (i = 1; i <= m; i++)
{
a[i].x = re();
a[i].y = re();
a[i].xx = re() + 1;
a[i].yy = re() + 1;
ls_x[++xl] = a[i].x;
ls_x[++xl] = a[i].xx;
ls_y[++yl] = a[i].y;
ls_y[++yl] = a[i].yy;
}
sort(ls_x + 1, ls_x + xl + 1);
sort(ls_y + 1, ls_y + yl + 1);
ls_x[xl + 1] = ls_y[yl + 1] = -1;
for (i = 1; i <= xl; i++)
if (ls_x[i] ^ ls_x[i + 1])
ls_x[++nl] = ls_x[i];
for (i = 1; i <= yl; i++)
if (ls_y[i] ^ ls_y[i + 1])
ls_y[++ml] = ls_y[i];
for (i = 1; i <= n; i++)
X[BSX(tr_x[i])].push_back(BSY(tr_y[i]));
for (i = 1; i <= m; i++)
{
a[i].y = BSY(a[i].y);
a[i].yy = BSY(a[i].yy);
q_1[BSX(a[i].x)].push_back(i);
q_2[BSX(a[i].xx)].push_back(i);
}
for (i = 1; i <= nl; i++)
{
for (j = 0, L = X[i].size(); j < L; j++)
add(X[i][j]);
for (j = 0, L = q_1[i].size(); j < L; j++)
an[q_1[i][j]] += ask(a[q_1[i][j]].y) - ask(a[q_1[i][j]].yy);
for (j = 0, L = q_2[i].size(); j < L; j++)
an[q_2[i][j]] += ask(a[q_2[i][j]].yy) - ask(a[q_2[i][j]].y);
}
for (i = 1; i <= m; i++)
printf("%d\n", an[i]);
return 0;
}

最新文章

  1. 【腾讯优测干货分享】如何降低App的待机内存(三)——探索内存增长的原因
  2. 配置hadoop
  3. 创建数据库和表的SQL语句【转】
  4. HNOI2002营业额统计(平衡树)
  5. 在NodeJS中配置aws ec2
  6. 关于FPGA异步时钟采样--结绳法的点点滴滴
  7. 14.8.11 Physical Structure of an InnoDB Index InnoDB Index 的物理结构
  8. [Apache系列]怎样在windows下配置apache vhost
  9. FUSE and File System
  10. #WEB安全基础 : HTML/CSS | 0x4.1嵌套列表
  11. Cookie的几点忠告
  12. 15个优秀的开源项目,让你轻松应对Android开发
  13. python与pycharm安装
  14. git使用 从远程库克隆和更新到本地
  15. 【MVC】bootstrap-paginator 分页
  16. 《mysql必知必会》学习_第11章_20180801_欢
  17. Identity Server4学习系列三
  18. 关于Cocos2d-x中掉帧导致游戏一卡一卡的网上一些的解决方法
  19. Python爬虫基础(四)Requests库的使用
  20. eclipse+maven+tomcat构建web工程

热门文章

  1. yum update 自动忽略内核更新
  2. cxf怎样提高webservice性能,及访问速度调优
  3. usb-blaster安装
  4. python解释器配置和python常用快捷键
  5. 今天设置apache二级域名ssl证书后出现问题
  6. 项目的发布(nginx、uwsgi、django、virtualenv、supervisor)
  7. mycat配置实现mysql读写分离
  8. Android四大组件总结
  9. PHP遍历数组常用方式(for,foreach,while,指针等等)
  10. 【网络编程一】主机字节序与网络字节序以及ip地址转换函数