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;
}

BZOJ1935或洛谷2163 [SHOI2007]园丁的烦恼的更多相关文章

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

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

  2. bzoj1935 [Shoi2007]园丁的烦恼

    bzoj1935 [Shoi2007]园丁的烦恼 有N个点坐标为(xi,yi),M次询问,询问(a,b)-(c,d)的矩形内有多少点. 0≤n≤500000,1≤m≤500000,0≤xi,yi≤10 ...

  3. P2163 [SHOI2007]园丁的烦恼

    题目 P2163 [SHOI2007]园丁的烦恼 做法 关于拆点,要真想拆直接全部用树状数组水过不就好了 做这题我们练一下\(cdq\)分治 左下角\((x1,y1)\)右上角\((x2,y2)\), ...

  4. [LuoguP2163][SHOI2007]园丁的烦恼_CDQ分治

    园丁的烦恼 题目链接:https://www.luogu.org/problem/P2163 数据范围:略. 题解: 树套树过不去,那就$CDQ$分治好了. 有点小细节,但都是$CDQ$分治必要的. ...

  5. 洛谷 P2057 [SHOI2007]善意的投票 解题报告

    P2057 [SHOI2007]善意的投票 题目描述 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己的主见,但是为了照 ...

  6. [洛谷P2057][SHOI2007]善意的投票

    题目大意:有$n(n\leqslant300)$个人,每个人可以选择$0$或$1$,每个人最开始有意愿,有$m(m\leqslant\dfrac{n(n-1)}2)$对好朋友.定义一次的冲突数为好朋友 ...

  7. [洛谷P1434] [SHOI2007]滑雪

    题目链接: here we go 题外话: 谁能想到这是一道咕了两年的\(AC\)呢--当年是在搜索还半懂不懂的时候遇到的这道题,感觉真是难得要命()所以一直拖着不做,后面就下意识地逃避了搜索相关的内 ...

  8. 洛谷P2057 [SHOI2007]善意的投票 题解

    题目链接: https://www.luogu.org/problemnew/show/P2057 分析: 由0和1的选择我们直觉的想到0与S一堆,1与T一堆. 但是发现,刚开始的主意并不一定是最终的 ...

  9. 洛谷$P2057\ [SHOI2007]$ 善意的投票 网络流

    正解:网络流 解题报告: 传送门! $umm$看到每个人要么0要么1就考虑最小割呗,,,? 然后贡献有两种?一种是违背自己的意愿,一种是和朋友的意愿违背了 所以考虑开一排点分别表示每个人,然后$S$表 ...

随机推荐

  1. trie数的实现

    Trie树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用字符串 ...

  2. php图片转base64

    /*读取问价家图片生澈哥哥js文件 */header("Access-Control-Allow-Origin: *");$i=0;$handle = opendir('./ima ...

  3. php 5.3.10 cli 模式加载php_openssl.dll

    问题描述: 开启php_openssl.dll,仍提示php_openssl.dll required/Not found 原因:可能是php的版本跟php_openssl.dll的版本不一样 具体排 ...

  4. Android Studio SVN配置

    一 . 原文链接:忽略文件[转]    https://blog.csdn.net/buaaroid/article/details/51546521 1.用Android Studio创建一个项目, ...

  5. 动态代理 JDK动态代理 CGLIB代理

    代理模式:代理类和被代理类实现共同的接口(或继承),代理类中存有指向被代理类的索引,实际执行时通过调用代理类的方法.实际执行的是被代理类的方法. 而AOP,是通过动态代理实现的. 一.简单来说: JD ...

  6. GreenDao3.0简单使用(转)

    关于GreenDao greenDao是一个将对象映射到SQLite数据库中的轻量且快速的ORM解决方案. 关于greenDAO的概念可以看官网greenDAO greenDAO 优势 1.一个精简的 ...

  7. jdk各版本名称

  8. PropertyGrid控件动态生成属性及下拉菜单 (转)

    http://blog.sina.com.cn/s/blog_6f14b7010101b91b.html https://msdn.microsoft.com/zh-cn/library/ms1718 ...

  9. mysql5.6 基于Binlog ROW记录方式进行数据恢复(无备份)

    数据库配置注意事项 /etc/my.cnf 必须要开户binlog支持,字符集要求 是utf8 binlog类型为row server-id=121 log_bin=/home/mysqllog bi ...

  10. JAVA高精度模板

    刚开始还坚持用C++写高精来着,后来发现JAVA写高精方便太多了,所以也来学习一下JAVA高精度的模板. 参考:https://www.cnblogs.com/imzscilovecode/p/883 ...