1935: [Shoi2007]Tree 园丁的烦恼
1935: [Shoi2007]Tree 园丁的烦恼
Time Limit: 15 Sec Memory Limit: 357 MB
Submit: 648 Solved: 273
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
0 0
0 1
1 0
0 0 1 1
Sample Output
HINT
Source
题解:一个超级神奇的题目,对于此题,首先很快可以想到用树状数组来搞,然后第一反应就是二维的,但想想这数据规模显然不现实。。。于是就想办法变成一维的,将Y坐标全部离散化(包括询问里面的),然后按照X坐标优先,Y坐标其次优先从小到大排序,然后遇到查询点就查询,否则就加入数组,然后没了,就是程序略长
/**************************************************************
Problem:
User: HansBug
Language: Pascal
Result: Accepted
Time: ms
Memory: kb
****************************************************************/ var
i,j,k,l,m,n,nx,ny:longint;
a:array[..,..] of longint;
b:array[..,..] of longint;
c:array[..] of longint;
d:array[..,..] of longint;
e:array[..,..] of longint;
procedure swap(var x,y:longint);
var z:longint;
begin
z:=x;x:=y;y:=z;
end;
procedure sort(l,r:longint);
var i,j,x,y:longint;
begin
i:=l;j:=r;x:=d[(l+r) div ,];
repeat
while d[i,]<x do inc(i);
while d[j,]>x do dec(j);
if i<=j then
begin
swap(d[i,],d[j,]);
swap(d[i,],d[j,]);
inc(i);dec(j);
end;
until i>j;
if i<r then sort(i,r);
if l<j then sort(l,j);
end;
procedure sort0(l,r:longint);
var i,j,x,y,z:longint;
begin
i:=l;j:=r;x:=e[(l+r) div ,];y:=e[(l+r) div ,];z:=e[(l+r) div ,];
repeat
while (e[i,]<x) or ((e[i,]=x) and (e[i,]<y)) or ((e[i,]=x) and (e[i,]=y) and (e[i,]>z)) do inc(i);
while (e[j,]>x) or ((e[j,]=x) and (e[j,]>y)) or ((e[j,]=x) and (e[j,]=y) and (e[j,]<z)) do dec(j);
if i<=j then
begin
swap(e[i,],e[j,]);
swap(e[i,],e[j,]);
swap(e[i,],e[j,]);
inc(i);dec(j);
end;
until i>j;
if i<r then sort0(i,r);
if l<j then sort0(l,j);
end;
procedure sort1(l,r:longint);
var i,j,x,y:longint;
begin
i:=l;j:=r;x:=e[(l+r) div ,];
repeat
while e[i,]<x do inc(i);
while e[j,]>x do dec(j);
if i<=j then
begin
swap(e[i,],e[j,]);
swap(e[i,],e[j,]);
swap(e[i,],e[j,]);
swap(e[i,],e[j,]);
inc(i);dec(j);
end;
until i>j;
if i<r then sort1(i,r);
if l<j then sort1(l,j);
end;
procedure add(x,y:longint);
begin
if x<= then exit;
while x<=nx do
begin
inc(c[x],y);
inc(x,x and (-x));
end;
end;
function sum(x:longint):longint;
begin
sum:=;
while x> do
begin
inc(sum,c[x]);
dec(x,x and (-x));
end;
end;
begin
readln(n,m);
for i:= to n do readln(a[i,],a[i,]);
for i:= to m do readln(b[i*-,],b[i*-,],b[i*,],b[i*,]);
for i:= to n do
begin
d[i,]:=a[i,];
d[i,]:=i;
end;
for i:= to m* do
begin
d[n+i,]:=b[i,];
d[n+i,]:=-i;
end;
sort(,n+m*);j:=;d[,]:=-;
for i:= to n+m* do
begin
if d[i,]<>d[i-,] then inc(j);
if d[i,]> then a[d[i,],]:=j else b[-d[i,],]:=j;
end;
nx:=j;
for i:= to m do
begin
e[i*-,]:=b[i*-,]-;e[i*-,]:=b[i*-,]-;
e[i*-,]:=b[i*-,]-;e[i*-,]:=b[i*,];
e[i*-,]:=b[i*,];e[i*-,]:=b[i*-,]-;
e[i*,]:=b[i*,];e[i*,]:=b[i*,];
end;
for i:= to n do begin e[m*+i,]:=a[i,];e[m*+i,]:=a[i,]; end;
for i:= to m*+n do e[i,]:=i;
sort0(,m*+n);
fillchar(c,sizeof(c),);
for i:= to m*+n do if e[i,]<=(m*) then e[i,]:=sum(e[i,]) else add(e[i,],);
sort1(,m*+n);
for i:= to m do writeln(e[i*,]-e[i*-,]-e[i*-,]+e[i*-,]);
readln;
end.
1935: [Shoi2007]Tree 园丁的烦恼的更多相关文章
- BZOJ 1935: [Shoi2007]Tree 园丁的烦恼( 差分 + 离散化 + 树状数组 )
假如矩阵范围小一点就可以直接用二维树状数组维护. 这道题, 差分答案, 然后一维排序, 另一维离散化然后树状数组维护就OK了. ----------------------------------- ...
- bzoj1382 1935: [Shoi2007]Tree 园丁的烦恼
1935: [Shoi2007]Tree 园丁的烦恼 Time Limit: 15 Sec Memory Limit: 357 MBSubmit: 1261 Solved: 578[Submit] ...
- BZOJ 1935: [Shoi2007]Tree 园丁的烦恼 +CDQ分治
1935: [Shoi2007]Tree 园丁的烦恼 参考与学习:https://www.cnblogs.com/mlystdcall/p/6219421.html 题意 在一个二维平面中有n颗树,有 ...
- bzoj 1935: [Shoi2007]Tree 园丁的烦恼
Description 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草.有一天国王漫步在花园里,若有所思,他问一个园丁道: ...
- BZOJ 1935: [Shoi2007]Tree 园丁的烦恼 [树状数组 离线 离散化]
传送门 刚才我还在郁闷网上怎么没人用$CDQ$分治做 突然发现根本没有时间序.... #include<iostream> #include<cstdio> #include& ...
- BZOJ.1935.[SHOI2007]Tree园丁的烦恼(CDQ分治 三维偏序)
题目链接 矩形查询可以拆成四个点的前缀和查询(树套树显然 但是空间不够) 每个操作表示为(t,x,y),t默认有序,对x分治,y用树状数组维护 初始赋值需要靠修改操作实现. //119964kb 43 ...
- [bzoj1935][shoi2007]Tree 园丁的烦恼(树状数组+离线)
1935: [Shoi2007]Tree 园丁的烦恼 Time Limit: 15 Sec Memory Limit: 357 MBSubmit: 980 Solved: 450[Submit][ ...
- 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 ...
随机推荐
- HDU-1166-敌兵布阵(线段树)
前言: 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a, ...
- table固定前两列和最后一列,其他滑动显示
网上搜的基本都是4个table做的,数据处理比较麻烦,写了个一个table的,此示例只固定了前两列和最后一列,和网上的不太一样. 网上搜的基本都是4个table做的,数据处理比较麻烦,写了个一个tab ...
- 基于UDP协议的socket通信
服务器端: 1.创建DatagramSocket,指定端口号 2.创建DatagramPacket 3.接收客户端发送的数据信息 4.读取数据 客户端: 1.定义发送信息 2.创建DatagramPa ...
- libMF阅读记录(一):首先要编译通过
libMF是林智仁老师开发的一个用于推荐系统的矩阵分解库,下载地址:libMF 测试用的数据集是MovieLen,一个给电影评分的数据集,下载在此:ML 最近在阅读libMF的源代码,并且准备开发其M ...
- Linux下使用javac编译
Linux下使用javac编译Hadoop程序 首先要配置好Hadoop, 给出两个教程 Hadoop安装教程单机/伪分布式配置Hadoop2.6.0/Ubuntu14.04 Hadoop集群安装配置 ...
- std::vector 源代码
vector身为一个动态数组,每次以空间不够的时候会以2倍的倍数增加,而且每次扩充的时候分为3部,分配内存,拷贝数据,释放内存 vector内部有两个成员变量,begin,finish ,endcat ...
- Docker实战--部署简单nodejs应用
如何在Docker的container里运行Node.js程序 主体思路:一个简单的Node.js web app,来构建一个镜像,然后基于这个镜像,运行一个容器,从而实现快速部署. 操作环境: 虚拟 ...
- C++中将string类型转化为int类型
写程序需要将string转化为int,所以就探索了一下. 方法一:atoi函数 atoi函数将字符串转化为整数,注意需要stdlib库.所以就尝试了一下: #include <iostream& ...
- Codeforces Round #396.D
D. Mahmoud and a Dictionary time limit per test 4 seconds memory limit per test 256 megabytes input ...
- V3学院XILINX FPGA寒假班培训感受 江苏大学 电子信息科学与技术 邓普建
事先申明一点,我是大一的学生,因此会站在一个新生的角度叙述. 刚开始接触V3学院是在江苏大学与V3学院合办的FPGA/SOC培训中,那是对全校开放的免费培训,历时三个周末.我那时有幸从头听到了尾,觉得 ...