【bzoj4822/bzoj1935】[Cqoi2017]老C的任务/[Shoi2007]Tree 园丁的烦恼 树状数组
原文地址:http://www.cnblogs.com/GXZlegend/p/6825530.html
bzoj4822
题目描述
输入
输出
样例输入
4 2
0 0 1
0 1 2
2 2 4
1 0 8
0 0 1 1
1 1 5 6
样例输出
11
4
bzoj1935
题目描述
同上,只是少了个权值p_i,并且y的范围也减小到10^7
题解
树状数组
将点按x递增;将询问拆成2个,离线,离散化,按x递增排序。
然后每次找到一个询问,就判断有哪些点可以加到树状数组中,然后查询一下就好了。
注意题目中边上也算是包含,所以应将左下边界-1;同时坐标必须是正的,还需要+2。
如果是bzoj1935,不需要离散化也可以。
bzoj4822:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
struct POINT
{
int x , y;
ll v;
}a[500010];
struct QUERY
{
int p , d , u , id , opt;
}b[1000010];
int tot , val[1500010];
ll f[10000010] , ans[500010];
bool cmp1(POINT a , POINT b)
{
return a.x < b.x;
}
bool cmp2(QUERY a , QUERY b)
{
return a.p < b.p;
}
void update(int x , ll a)
{
int i;
for(i = x ; i <= tot ; i += i & -i) f[i] += a;
}
ll query(int x)
{
int i;
ll ans = 0;
for(i = x ; i ; i -= i & -i) ans += f[i];
return ans;
}
int main()
{
int n , m , i , s = 1;
scanf("%d%d" , &n , &m);
for(i = 1 ; i <= n ; i ++ ) scanf("%d%d%lld" , &a[i].x , &a[i].y , &a[i].v) , a[i].x += 2 , a[i].y ++ , val[++tot] = a[i].y;
for(i = 1 ; i <= m ; i ++ )
{
scanf("%d%d%d%d" , &b[i].p , &b[i].d , &b[i + m].p , &b[i].u);
b[i].p ++ , b[i].d ++ , b[i + m].p += 2 , b[i].u ++ ;
b[i + m].d = b[i].d , b[i + m].u = b[i].u;
b[i].id = b[i + m].id = i , b[i].opt = -1 , b[i + m].opt = 1;
val[++tot] = b[i].d , val[++tot] = b[i].u;
}
sort(a + 1 , a + n + 1 , cmp1) , sort(b + 1 , b + 2 * m + 1 , cmp2);
sort(val + 1 , val + tot + 1);
for(i = 1 ; i <= 2 * m ; i ++ )
{
while(s <= n && a[s].x <= b[i].p) update(lower_bound(val + 1 , val + tot + 1 , a[s].y) - val , a[s].v) , s ++ ;
ans[b[i].id] += b[i].opt * (query(lower_bound(val + 1 , val + tot + 1 , b[i].u) - val) - query(lower_bound(val + 1 , val + tot + 1 , b[i].d) - val - 1));
}
for(i = 1 ; i <= m ; i ++ ) printf("%lld\n" , ans[i]);
return 0;
}
bzoj1935:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct POINT
{
int x , y;
}a[500010];
struct QUERY
{
int p , d , u , id , opt;
}b[1000010];
int f[10000010] , k , ans[500010];
bool cmp1(POINT a , POINT b)
{
return a.x < b.x;
}
bool cmp2(QUERY a , QUERY b)
{
return a.p < b.p;
}
void update(int x , int a)
{
int i;
for(i = x ; i <= k ; i += i & -i) f[i] += a;
}
int query(int x)
{
int i , ans = 0;
for(i = x ; i ; i -= i & -i) ans += f[i];
return ans;
}
int main()
{
int n , m , i , s = 1;
scanf("%d%d" , &n , &m);
for(i = 1 ; i <= n ; i ++ ) scanf("%d%d" , &a[i].x , &a[i].y) , a[i].x += 2 , a[i].y ++ , k = max(k , a[i].y);
for(i = 1 ; i <= m ; i ++ )
{
scanf("%d%d%d%d" , &b[i].p , &b[i].d , &b[i + m].p , &b[i].u);
b[i].p ++ , b[i].d ++ , b[i + m].p += 2 , b[i].u ++ ;
b[i + m].d = b[i].d , b[i + m].u = b[i].u , k = max(k , b[i].u);
b[i].id = b[i + m].id = i , b[i].opt = -1 , b[i + m].opt = 1;
}
sort(a + 1 , a + n + 1 , cmp1) , sort(b + 1 , b + 2 * m + 1 , cmp2);
for(i = 1 ; i <= 2 * m ; i ++ )
{
while(s <= n && a[s].x <= b[i].p) update(a[s].y , 1) , s ++ ;
ans[b[i].id] += b[i].opt * (query(b[i].u) - query(b[i].d - 1));
}
for(i = 1 ; i <= m ; i ++ ) printf("%d\n" , ans[i]);
return 0;
}
【bzoj4822/bzoj1935】[Cqoi2017]老C的任务/[Shoi2007]Tree 园丁的烦恼 树状数组的更多相关文章
- [bzoj1935][shoi2007]Tree 园丁的烦恼(树状数组+离线)
1935: [Shoi2007]Tree 园丁的烦恼 Time Limit: 15 Sec Memory Limit: 357 MBSubmit: 980 Solved: 450[Submit][ ...
- BZOJ1935: [Shoi2007]Tree 园丁的烦恼(树状数组 二维数点)
题意 题目链接 Sol 二维数点板子题 首先把询问拆成四个矩形 然后离散化+树状数组统计就可以了 // luogu-judger-enable-o2 #include<bits/stdc++.h ...
- BZOJ 1935: [Shoi2007]Tree 园丁的烦恼 [树状数组 离线 离散化]
传送门 刚才我还在郁闷网上怎么没人用$CDQ$分治做 突然发现根本没有时间序.... #include<iostream> #include<cstdio> #include& ...
- BZOJ1935: [Shoi2007]Tree 园丁的烦恼
1935: [Shoi2007]Tree 园丁的烦恼 Time Limit: 15 Sec Memory Limit: 357 MBSubmit: 552 Solved: 220[Submit][ ...
- bzoj千题计划143:bzoj1935: [Shoi2007]Tree 园丁的烦恼
http://www.lydsy.com/JudgeOnline/problem.php?id=1935 二维偏序问题 排序x,离散化树状数组维护y #include<cstdio> #i ...
- BZOJ 1935: [Shoi2007]Tree 园丁的烦恼 +CDQ分治
1935: [Shoi2007]Tree 园丁的烦恼 参考与学习:https://www.cnblogs.com/mlystdcall/p/6219421.html 题意 在一个二维平面中有n颗树,有 ...
- BZOJ 1935: [Shoi2007]Tree 园丁的烦恼( 差分 + 离散化 + 树状数组 )
假如矩阵范围小一点就可以直接用二维树状数组维护. 这道题, 差分答案, 然后一维排序, 另一维离散化然后树状数组维护就OK了. ----------------------------------- ...
- 1935: [Shoi2007]Tree 园丁的烦恼
1935: [Shoi2007]Tree 园丁的烦恼 Time Limit: 15 Sec Memory Limit: 357 MBSubmit: 648 Solved: 273[Submit][ ...
- bzoj1382 1935: [Shoi2007]Tree 园丁的烦恼
1935: [Shoi2007]Tree 园丁的烦恼 Time Limit: 15 Sec Memory Limit: 357 MBSubmit: 1261 Solved: 578[Submit] ...
随机推荐
- MySQL-常用的存储引擎
MySQL-常用的存储引擎 存储引擎 事务 锁粒度 主要应用 忌用 MyISAM 不支持 支持并发插入的表级锁 select,insert 读写操作频繁 MRG_MYISAM 不支持 支持并发插入的表 ...
- linux中安装JDK linux中安装Tomcat linux中安装Mysql 及故障解析 linux系统安装redis
Linux 安装JDK 配置完环境变量后无法使用 java -version 无法打开 通过下面语句 将32位文件与当前系统64位兼容 (有待补充32位查法)sudo yum install glib ...
- 【复杂度分析】loj#6043. 「雅礼集训 2017 Day7」蛐蛐国的修墙方案
感觉有点假 题目大意 数据范围:$n<=100$ 题目分析 由于题目给出的是 置换,所以相当于只需枚举每个环的两个状态. 主要是复杂度分析这里: 一元环:不存在 二元环:特判保平安 三元环:不存 ...
- jstree 全部选中事件 select_all 使用
select_all function of jstree not checked node for jstree-open branch of ajax-jstree 很尴尬啊,找了整个百度,360 ...
- datatable中reload和load的区别
ajax.reload()用于datatable表某个数据的变化而重新加载 ajax.url(url).load() 用于切换url时,datatable重新获取数据,加载.
- (转)数据库老兵:NewSQL才是未来
编者按:在数据库技术领域,Michael Stonebraker几乎是无人不知无人不晓的人物.现年70岁的Stonebraker不仅是Ingres和PostgreSQL的创始人,同时在Informix ...
- 微信小程序推广方案
拥有小程序只是基础,能玩转小程序运营才是关键.本文将会简单讲述十种最实用的小程序推广策略,结合具体案例阐述商家企业如何在拥有小程序后玩转小程序,快速实现小程序的推广. 一. 公众号+小程序 小程序可以 ...
- python-无参函数
#!/usr/local/bin/python3 # -*- coding:utf-8 -*- ''' #-----------定义函数---------- def func1(): "te ...
- 数据分析处理库Pandas——数据透视表
数据 按指定的行列值显示 求和 按行求和 按列求和 数据 求平均 备注:按性别计算每个等级船票的平均价格. 备注:每个等级船舱中每种性别获救的平均值,也就是获救的比例. 备注:每种性别未成年人获救的平 ...
- 学习Pytbon第十天 函数2 内置方法和匿名函数
print( all([1,-5,3]) )#如果可迭代对象里所有元素都为真则返回真.0不为真print( any([1,2]) )#如果数据里面任意一个数据为真返回则为真a= ascii([1,2, ...