汕头市队赛 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场麻将,但她这次又没控分,而且 ...
随机推荐
- js匿名函数运行的方法
Javascript中定义函数的方式有多种,函数直接量就是其中一种.如var fun = function(){},这里function如果不赋值给fun那么它就是一个匿名函数.好,看看匿名函数的如何 ...
- 【js】【读书笔记】廖雪峰的js教程读书笔记
最近在看廖雪峰的js教程,重温了下js基础,记下一些笔记,好记性不如烂笔头嘛 编写代码尽量使用严格模式 use strict JavaScript引擎是一个事件驱动的执行引擎,代码总是以单线程执行 执 ...
- [BZOJ4196]软件包管理器(树链剖分)
[BZOJ4196] install x-> 询问根节点到x路径上0的个数,然后全变1 uninstall x-> 询问x子树(包括x)中1的个数,然后全边0 Code #include ...
- python正则表达式01--贪心算法和非贪心算法findall()
import re st = 'asdfasxxixxdafqewxxlovexxsadawexxyouxxas' # . #点匹配除换行符外的任意字符 a0 = re.findall('xx.',s ...
- 笔记-scrapy-辅助功能
笔记-scrapy-辅助功能 1. scrapy爬虫管理 爬虫主体写完了,要部署运行,还有一些工程性问题: 限频 爬取深度限制 按条件停止,例如爬取次数,错误次数: 资源使用限制,例如内存限 ...
- selenium+PhantomJS 抓取淘宝搜索商品
最近项目有些需求,抓取淘宝的搜索商品,抓取的品类还多.直接用selenium+PhantomJS 抓取淘宝搜索商品,快速完成. #-*- coding:utf-8 -*-__author__ =''i ...
- 9 Django 模型层(2) --多表操作
创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关系( ...
- Android 人脸识别
Android人脸识别技术,可以参考下面的网站. http://www.faceplusplus.com.cn/ 本项目使用的就是该网站的api. 项目具体使用的技术代码 /** * 用来压缩图片的方 ...
- json对象和java对象的相互转换方法(json-lib、jackson、fastjson、gson)
一 使用json-lib包下的JSONObject和JSONArray转换 代码如下: package com.test.test; import java.util.ArrayList; impor ...
- MySQL数据库基础总结
来源: 实验楼 链接: https://www.shiyanlou.com/courses/9 一.开发准备 # 打开 MySQL 服务 sudo service mysql start #使用 ro ...