COGS 2533. [HZOI 2016]小鱼之美
我们可以发现所有的操作当中,只有坐标的增加,没有坐标的减少。
所以我们可以发现这么一个简单的事实,一条鱼一旦出了渔网,那么它就不可能再回来。
但是目前这并没有什么卵用。
我们可以把询问一个矩阵当中的鱼的数量转化为分别求这个矩阵的四个角的左下角的鱼的数量。又因为我们发现x和y的坐标是独立的,所以我们可以分别维护。
维护这个东西本人使用的线段树,在这里维护了八颗线段树。
然后在维护的过程中,八颗线段树应该是两两配对维护的,也就是x坐标和y坐标应该一同维护,因为我们维护的是某一个点的左下角的点的数量,所以我们在维护任意一对线段树时,如果我们发现某一个点的某一维超过了限制,那么就直接删除这个点(删除这个点的时候直接将两个坐标置为-inf)保证它不会再次影响到答案(好吧,这个性质还是有卵用的)。
这道题实际上是考察代码力。。。 。。。
#include <queue>
#include <cstdio>
#include <cstring>
#include <climits>
#include <algorithm>
using namespace std;
typedef long long ll;
template<typename T>inline void read(T &x){
x=;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=*x+ch-'',ch=getchar(),ch>'!');if(flag) x=-x;
}
inline ll cat_min(const ll &a,const ll &b){return a<b ? a:b;}
inline ll cat_max(const ll &a,const ll &b){return a>b ? a:b;}
const int maxn = ;
const ll inf = LLONG_MAX>>;
int n,m,X[maxn],Y[maxn];
int sum[maxn<<][];
ll max_x[maxn<<][],max_y[maxn<<][];
ll lazy_x[maxn<<][],lazy_y[maxn<<][];
int stander_x[],stander_y[];
int ls,rs,dx,idx;
inline void push_down(int x){
if(lazy_x[x][idx]){
max_x[x<<][idx] += lazy_x[x][idx];
lazy_x[x<<][idx] += lazy_x[x][idx];
max_x[x<<|][idx] += lazy_x[x][idx];
lazy_x[x<<|][idx] += lazy_x[x][idx];
lazy_x[x][idx] = ;
}
if(lazy_y[x][idx]){
max_y[x<<][idx] += lazy_y[x][idx];
lazy_y[x<<][idx] += lazy_y[x][idx];
max_y[x<<|][idx] += lazy_y[x][idx];
lazy_y[x<<|][idx] += lazy_y[x][idx];
lazy_y[x][idx] = ;
}
return ;
}
inline void update(int x){
sum[x][idx] = sum[x<<][idx] + sum[x<<|][idx];
max_x[x][idx] = cat_max(max_x[x<<][idx],max_x[x<<|][idx]);
max_y[x][idx] = cat_max(max_y[x<<][idx],max_y[x<<|][idx]);
return ;
}
void build(int rt,int l,int r){
lazy_x[rt][idx] = lazy_y[rt][idx] = ;
if(l == r){
if(X[l] <= stander_x[idx] && Y[l] <= stander_y[idx]){
sum[rt][idx] = ;
max_x[rt][idx] = X[l];
max_y[rt][idx] = Y[l];
}else{
sum[rt][idx] = ;
max_x[rt][idx] = -inf;
max_y[rt][idx] = -inf;
} return;
}
int mid = l+r >> ;
build(rt<<,l,mid);
build(rt<<|,mid+,r);
update(rt);
}
void modify_x(int rt,int l,int r){
if(ls <= l && r <= rs){
lazy_x[rt][idx] += dx;
max_x[rt][idx] += dx;
return;
}
push_down(rt);
int mid = l+r >> ;
if(ls <= mid) modify_x(rt<<,l,mid);
if(rs > mid) modify_x(rt<<|,mid+,r);
update(rt);
}
void modify_y(int rt,int l,int r){
if(ls <= l && r <= rs){
lazy_y[rt][idx] += dx;
max_y[rt][idx] += dx;
return;
}
push_down(rt);
int mid = l+r >> ;
if(ls <= mid) modify_y(rt<<,l,mid);
if(rs > mid) modify_y(rt<<|,mid+,r);
update(rt);
}
ll query(int rt,int l,int r){
if(ls <= l && r <= rs) return sum[rt][idx];
push_down(rt);
int mid = l+r >> ;
if(rs <= mid) return query(rt<<,l,mid);
if(ls > mid) return query(rt<<|,mid+,r);
return query(rt<<,l,mid) + query(rt<<|,mid+,r);
}
void prse(int rt,int l,int r){
if(max_x[rt][idx] <= stander_x[idx] && max_y[rt][idx] <= stander_y[idx]) return;
if(l == r){
sum[rt][idx] = ;
max_x[rt][idx] = -inf;
max_y[rt][idx] = -inf;
return;
}
push_down(rt);
int mid = l+r >> ;
prse(rt<<,l,mid);
prse(rt<<|,mid+,r);
update(rt);
}
inline void work(){
int n;read(n);
int x1,y1,x2,y2;
read(x1);read(y1);read(x2);read(y2);
stander_x[] = x2;stander_y[] = y2;
stander_x[] = x1-;stander_y[] = y2;
stander_x[] = x2;stander_y[] = y1-;
stander_x[] = x1-;stander_y[] = y1-;
for(int i=;i<=n;++i) read(X[i]),read(Y[i]);
for(idx = ;idx < ;++ idx) build(,,n),prse(,,n);
int m;read(m);
for(int i=,op;i<=m;++i){
read(op);read(ls);read(rs);
if(op == ){
read(dx);
for(idx = ;idx < ;++idx) modify_x(,,n),prse(,,n);
}else if(op == ){
read(dx);
for(idx = ;idx < ;++idx) modify_y(,,n),prse(,,n);
}else{
static ll num[];
for(idx = ;idx < ;++idx)
num[idx] = query(,,n);
// printf("I got it:: %d %d %d %d\n",num[3],num[2],num[1],num[0]);
ll ans = num[] - num[] - num[] + num[];
printf("%lld\n",ans);
}
}
}
int main(){
freopen("skyfishs.in","r",stdin);
freopen("skyfishs.out","w",stdout);
int T;read(T);
while(T--) work();
getchar();getchar();
fclose(stdin);fclose(stdout);
return ;
}
COGS 2533. [HZOI 2016]小鱼之美的更多相关文章
- COGS 2532. [HZOI 2016]树之美 树形dp
可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...
- COGS 2416.[HZOI 2016]公路修建 & COGS 2419.[HZOI 2016]公路修建2 题解
大意: [HZOI 2016]公路修建 给定一个有n个点和m-1组边的无向连通图,其中每组边都包含一条一级边和一条二级边(连接的顶点相同),同一组边中的一级边权值一定大于等于二级边,另外给出一个数k( ...
- cogs——2478. [HZOI 2016]简单的最近公共祖先
2478. [HZOI 2016]简单的最近公共祖先 ★☆ 输入文件:easy_LCA.in 输出文件:easy_LCA.out 简单对比时间限制:2 s 内存限制:128 MB [题 ...
- COGS 2199. [HZOI 2016] 活动投票
2199. [HZOI 2016] 活动投票 ★★ 输入文件:hztp.in 输出文件:hztp.out 简单对比时间限制:0.5 s 内存限制:2 MB [题目描述] 衡中活动很多, ...
- COGS 2485. [HZOI 2016]从零开始的序列
2485. [HZOI 2016]从零开始的序列 ★★ 输入文件:sky_seq.in 输出文件:sky_seq.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] ...
- COGS 2334. [HZOI 2016]最小函数值
时间限制:1 s 内存限制:128 MB [题目描述] 有n个函数,分别为F1,F2,...,Fn.定义Fi(x)=Aix2+Bix+Ci(x∈N∗).给定这些Ai.Bi和Ci,请求出所有函数的所 ...
- cogs——2419. [HZOI 2016]公路修建2
2419. [HZOI 2016]公路修建2 ★☆ 输入文件:hzoi_road2.in 输出文件:hzoi_road2.out 简单对比时间限制:1 s 内存限制:128 MB [题 ...
- cogs——2416. [HZOI 2016]公路修建
2416. [HZOI 2016]公路修建 ★☆ 输入文件:hzoi_road.in 输出文件:hzoi_road.out 简单对比时间限制:1 s 内存限制:128 MB [题目描述 ...
- cogs 2478. [HZOI 2016]简单的最近公共祖先
2478. [HZOI 2016]简单的最近公共祖先 ★☆ 输入文件:easy_LCA.in 输出文件:easy_LCA.out 简单对比时间限制:2 s 内存限制:128 MB [题 ...
随机推荐
- jvm内存区域
概述 jvm内存分为几个区域: 程序计数器 虚拟机栈 本地方法栈 堆 方法区 运行时常量池 直接内存 这些内存区域是在java进程中细分的,为java程序提供服务 不同的区域存储的内容不一样,生命周期 ...
- QT数据库连接的几个重要函数的使用及注意事项(原创)
注:在这里数据库对象等同于数据库连接对象,也就是QSqlDatabase类的对象 QSqlDatabase QSqlDatabase::addDatabase((const QString & ...
- 如何用CSS画三角形
很多时候页面都需要一个或者多个小型三角形!多数人直接用PS扣个图片预览 下面用CSS简单画几个最终效果如下图 <div class="border-all-color"> ...
- [deviceone开发]-心形点赞动画示例
一.简介 这个示例展示do_Animator组件的简单使用,通过点击"点赞"按钮,不断弹出心形图片,向上动画漂移到顶部消失.间隔时间和上下左右移动的步长都是一定范围的随机值.二.效 ...
- Android将应用调试log信息保存在SD卡
转载:http://blog.csdn.net/way_ping_li/article/details/8487866 把自己应用的调试信息写入到SD卡中. package com.sdmc.hote ...
- 仿喜马拉雅实现ListView添加头布局和脚布局
ListView添加头布局和脚布局 之前学习喜马拉雅的时候做的一个小Demo,贴出来,供大家学习参考: 如果我们当前的页面有多个接口.多种布局的话,我们一般的选择无非就是1.多布局:2.各种复杂滑动 ...
- 拥抱.NET Core,跨平台的轻量级RPC:Rabbit.Rpc
不久前发布了一篇博文".NET轻量级RPC框架:Rabbit.Rpc",当初只实现了非常简单的功能,也罗列了之后的计划,经过几天的不断努力又为Rabbit.Rpc增加了一大波新特性 ...
- T-SQL 将动态SQL的结果集赋值到变量
1. 使用输出变量 ) ) DECLARE @counts int SET @city = 'New York' SET @sqlCommand = 'SELECT @cnt=COUNT(*) FRO ...
- 用友NC开发的ListView切换成FormEdit
在点击 “修改” 按钮或者双击ListView中某一项Item,将进入FormEdit即卡片界面,但是 FormEdit有两种状态,一种是 可编辑的状态(点修改按钮进入的状态),一种是非可编辑状态(双 ...
- 安装Ubuntu的那些事儿
这是博主第一次写博客,本人虽然目前就读的专业属计算机,但目前也是属于新手上路的那一类人.正好不久前解决了一个困扰了我很久的问题 ,现在拿出来给大家分享一下. 上个学期学校的工作室给大家集中普及linu ...