汕头市队赛 SRM1X T2 ——扫描线
绵津见-终 SRM 13
背景
“西瓜也是可以种在海上的!”——绵津见
然而种在海上的西瓜最需要防范的,是时不时会涌向瓜田的阵阵海浪。
幸好,身为海神的绵津见可以释放魔法“水平如镜”来阻止海浪拍打西瓜。
然而,当西瓜一个接一个成熟之时,它们就要离开瓜田,飘向遥远的彼岸。绵津见的魔法无法保护离开瓜田的西瓜们,但至少,也得知道西瓜们遭遇了多大的风浪啊。
描述
我们用一个坐标系来描述大海,绵津见的瓜田位于x轴下方,每当有一个西瓜成熟时,它会从x轴上一点出发,沿一条平行y轴的直线往y轴正方向前进。
某个时刻,海上会有一个海浪生成。每个海浪都是一条平行于x轴的线段,并且会往y轴负方向前进。当它达到x轴下方时,它会受到“水平如镜”的影响而消失。
所有西瓜、海浪每个时刻会前进一个单位距离,西瓜与西瓜之间,海浪与海浪之间互不影响,相互重叠的情况也是允许发生的。
当一个西瓜与海浪重叠时,认定为该西瓜遭遇该海浪的拍打,西瓜与海浪的运动不受此次拍打的影响,原路前进。
每个时刻的流程如下:
①在该时刻成熟的西瓜被摆放在x轴上,该时刻生成的海浪出现。
②进行一次判定操作:如果有西瓜和某海浪上的一点重合,判定为发生了一次拍打。
③所有西瓜前进一个单位距离,即y坐标加1。
④进行一次判定操作。
⑤所有海浪前进一个单位距离,即y坐标减1。y坐标为-1的海浪消失。
你需要回答每个西瓜、每个海浪共涉及多少次拍打。
输入格式
第一行两个整数n,m表示西瓜的数量和海浪的数量。
接下来n行,每行两个整数ti,xi描述一个西瓜,分别表示西瓜成熟的时间ti,成熟时出现在(xi,0)位置。
接下来m行,每行四个整数Ti,li,ri,yi描述一个海浪,分别表示海浪生成的时间ti,生成时两个端点为(li,yi),(ri,yi)。
输出格式
输出第一行n个数,第i个数表示第i个西瓜被拍打的次数。
输出第二行m个数,第i个数表示第i个海浪拍打到的西瓜数。
| 样例输入 | 样例输出 | 
| 5 3 2 3 2 5 2 6 4 6 4 7 1 1 6 0 2 1 6 0 2 6 7 3  | 
1 1 2 1 1 0 3 3  | 
数据范围与约定
对于初:  ,
,
对于续:  ,
,
对于终:  ,
,
样例解释
不解释
————————————————————————————————————
这道题分析之后 我们发现西瓜和海浪相碰需要满足
设西瓜出发时间T1 位置x 海浪T2 l r 高度 y
l<=x<=r T2-y<=T1<=T2+y
很明显这是符合扫描线的性质 所以我们可以将T排序 将 l x r 离散化一波
将询问拆为两个 相减得到答案
按T扫一波然后进行区间求和 因为点和矩阵相互影响是对称的
所以询问和求和是相反的 这样就可以直接维护一波答案了
代码简短但是略复杂 还是要花时间慢慢体会的
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=1e5+;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int n,m;
int xs[M*],xp;
int qp,ep;
int s1[*M],s2[*M],ans1[M],ans2[M];
int lowbit(int x){return x&-x;}
void add(int x,int v,int s[]){
while(x<=xp){
s[x]+=v;
x+=lowbit(x);
}
}
int query(int x,int s[]){
int ans=;
while(x){ans+=s[x]; x-=lowbit(x);}
return ans;
}
struct Q{
int l,r,y,id,s;
bool operator <(const Q& h)const{return y<h.y;}
void cal(){
ans1[id]+=(query(r,s1)-query(l-,s1))*s;
add(l,-s,s2);
add(r+,s,s2);
}
}e[*M];
struct pos{
int x,T,id;
bool operator <(const pos& h)const{return T<h.T;}
void cal(){
add(x,,s1);
ans2[id]=query(x,s2);
}
}q[*M];
void $(int&x){x=lower_bound(xs,xs+xp,x)-xs+;}
int main()
{
int l,r,k,x;
n=read(); m=read();
for(int i=;i<n;i++){
k=read(); x=read();
q[qp++]=(pos){xs[xp++]=x,k,i};
}
for(int i=;i<m;i++){
k=read(); l=read(); r=read(); x=read();
e[ep++]=(Q){l,r,k-x-,i,-};
e[ep++]=(Q){l,r,k+x,i,};
xs[xp++]=l;
xs[xp++]=r;
}
sort(xs,xs+xp);
for(int i=;i<qp;++i)$(q[i].x);
for(int i=;i<ep;++i)$(e[i].l),$(e[i].r);
sort(q,q+qp);
sort(e,e+ep);
for(int i=,j=;i<ep;i++){
while(j<qp&&q[j].T<=e[i].y) q[j++].cal();
e[i].cal();
}
for(int i=;i<n;i++) printf("%d ",ans2[i]); printf("\n");
for(int i=;i<m;i++) printf("%d ",ans1[i]); printf("\n");
return ;
}
汕头市队赛 SRM1X T2 ——扫描线的更多相关文章
- 汕头市队赛 SRM16 T2
		
描述 猫和老鼠,看过吧?猫来了,老鼠要躲进洞里.在一条数轴上,一共有n个洞,位置分别在xi,能容纳vi只老鼠.一共有m只老鼠位置分别在Xi,要躲进洞里,问所有老鼠跑进洞里的距离总和最小是多少. 输入格 ...
 - 汕头市队赛 SRM14 T2 最长上升子序列
		
最长上升子序列 (tree.pas/c/cpp) 128MB 1s 有一个长度为n的序列a[i],其中1到n的整数各自在a[i]中出现恰好一次. 现在已知另一个等长的序列f[i],表示a[i]中以第i ...
 - 汕头市队赛 SRM13 T2
		
这道题很容易想到是二分 但是因为可能会爆LL 所以要加一波特判 #include<cstdio> #include<cstring> #include<algorithm ...
 - 汕头市队赛 SRM1X T1
		
木之本樱 背景 “西瓜是可以种在树上的!”——木之本樱 描述 空地上,一排排的西瓜树拔地而起. 魔法世界里,空地是无限大的.所有的树排成了n条直线,每条直线也是向左右两端无限延伸的. 由于自己姓木(之 ...
 - 汕头市队赛 C KMP codeforces B. Image Preview
		
汕头市队赛题目传送门 codeforces题目传送门 这道题我的做法是 尝试先往左走然后往右走 或者先往右走然后往左走 然后注意一下枚举顺序就okay啦 #include<cstdio> ...
 - 汕头市队赛SRM 20 T2不净的圣杯
		
不净的圣杯 SRM 20 背景 作为一张BUG级别的卡,官方打算把它修改得人畜无害一些…… 虽然名字还没想好,但是能力大概是对敌方所有单位造成d点伤害,d为自己牌组中所有卡的编号的最大公约数.这无疑是 ...
 - 汕头市队赛 yyl杯1 T2
		
B SRM 05 - YYL 杯 R1 背景&&描述 有一个拥有n个城市的国家.这个国家由n-1条边连接起来.有一天国家发生叛乱.叛军已占领了一些城市.如果叛军占领的城市中,存在两个城 ...
 - 汕头市队赛SRM15
		
T1——czl SRM 15 众所周知,czl家养了一只可♂爱的***(已屏蔽),那只东西很贪吃,所以czl家很多零食仓库,然而这些仓库里有很多老鼠. 为了心爱的***,czl决定点燃纯艾条,用烟熏老 ...
 - 汕头市队赛 SRM 07 D 天才麻将少女kpm
		
这道题放了很久还是回来补了 D 天才麻将少女KPM SRM 07 背景&&描述 天才麻将少女KPM立志要在日麻界闯出一番名堂. KPM上周叒打了n场麻将,但她这次又没控分,而且 ...
 
随机推荐
- mysql 自定义不规则排序
			
mysql按id的指定顺序进行排序,以前解决过一次,后来忘了,记录一下 SELECT * FROM `table` WHERE id<6 order by field(id,3,5,1,2,4)
 - python系列3之内置函数和文件操作
			
目录 自定义函数 内置函数 文件的操作 练习题 一. 自定义函数 1. 函数的创建 函数的创建 1.def关键字 2.函数名+() 3.冒号 4.缩进 5. return返回值,可以不写,默认的返回值 ...
 - POJ:3258-River Hopscotch
			
River Hopscotch Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17740 Accepted: 7414 Desc ...
 - DFS:C 小Y的难题(1)
			
解题心得: 1.在明确使用DFS之后一定要找到递归函数的出口.方向,以及递归的点(在某个情况下开始递归)(void 也可以return,但是没有返回值).递归时也要有递归的方向,最后都能够达到递归的出 ...
 - [Bzoj4818]序列计数(矩阵乘法+DP)
			
Description 题目链接 Solution 容斥原理,答案为忽略质数限制的方案数减去不含质数的方案数 然后矩阵乘法优化一下DP即可 Code #include <cstdio> # ...
 - HDFS HA 的 hdfs-site.xml
			
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Licens ...
 - 腾讯课堂之前端开发html5css3javascriptjQueryJS年薪20万
			
第一章 网页制作零基础 第一节 什么是HTML 第二节 HTML基本语法 第三节 HTML结构标签 第四节 HTML常用标签及属性 第五节 HTML无序列表UL标签 第六节 HTML定义列表DL标签 ...
 - Pascal小游戏 俄罗斯方块
			
俄罗斯方块已经成为了和“Hello World”一样的程序了吧? 不要直接复制,可能需要事先 Format. program cube;uses crt,graph,dos;var gd,gm:sma ...
 - Visual Studio使用技巧笔记(引用程序集自动复制dll到引用项目目录)
			
copy /y $(TargetPath) $(SolutionDir)\[您项目引用dll文件的目录]\$(TargetFileName) 例如:copy /y $(TargetPath) $(So ...
 - Pytest+allure生成测试报告
			
1.Allure.zip包的下载地址: https://github.com/allure-framework/allure2 在跳转页面选择一个allure.zip包的版本下载 若以上方法无法下载z ...