绵津见-终 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扫一波然后进行区间求和 因为点和矩阵相互影响是对称的

所以询问和求和是相反的 这样就可以直接维护一波答案了

代码简短但是略复杂 还是要花时间慢慢体会的

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. const int M=1e5+;
  6. int read(){
  7. int ans=,f=,c=getchar();
  8. while(c<''||c>''){if(c=='-') f=-; c=getchar();}
  9. while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
  10. return ans*f;
  11. }
  12. int n,m;
  13. int xs[M*],xp;
  14. int qp,ep;
  15. int s1[*M],s2[*M],ans1[M],ans2[M];
  16. int lowbit(int x){return x&-x;}
  17. void add(int x,int v,int s[]){
  18. while(x<=xp){
  19. s[x]+=v;
  20. x+=lowbit(x);
  21. }
  22. }
  23. int query(int x,int s[]){
  24. int ans=;
  25. while(x){ans+=s[x]; x-=lowbit(x);}
  26. return ans;
  27. }
  28. struct Q{
  29. int l,r,y,id,s;
  30. bool operator <(const Q& h)const{return y<h.y;}
  31. void cal(){
  32. ans1[id]+=(query(r,s1)-query(l-,s1))*s;
  33. add(l,-s,s2);
  34. add(r+,s,s2);
  35. }
  36. }e[*M];
  37. struct pos{
  38. int x,T,id;
  39. bool operator <(const pos& h)const{return T<h.T;}
  40. void cal(){
  41. add(x,,s1);
  42. ans2[id]=query(x,s2);
  43. }
  44. }q[*M];
  45. void $(int&x){x=lower_bound(xs,xs+xp,x)-xs+;}
  46. int main()
  47. {
  48. int l,r,k,x;
  49. n=read(); m=read();
  50. for(int i=;i<n;i++){
  51. k=read(); x=read();
  52. q[qp++]=(pos){xs[xp++]=x,k,i};
  53. }
  54. for(int i=;i<m;i++){
  55. k=read(); l=read(); r=read(); x=read();
  56. e[ep++]=(Q){l,r,k-x-,i,-};
  57. e[ep++]=(Q){l,r,k+x,i,};
  58. xs[xp++]=l;
  59. xs[xp++]=r;
  60. }
  61. sort(xs,xs+xp);
  62. for(int i=;i<qp;++i)$(q[i].x);
  63. for(int i=;i<ep;++i)$(e[i].l),$(e[i].r);
  64. sort(q,q+qp);
  65. sort(e,e+ep);
  66. for(int i=,j=;i<ep;i++){
  67. while(j<qp&&q[j].T<=e[i].y) q[j++].cal();
  68. e[i].cal();
  69. }
  70. for(int i=;i<n;i++) printf("%d ",ans2[i]); printf("\n");
  71. for(int i=;i<m;i++) printf("%d ",ans1[i]); printf("\n");
  72. return ;
  73. }

汕头市队赛 SRM1X T2 ——扫描线的更多相关文章

  1. 汕头市队赛 SRM16 T2

    描述 猫和老鼠,看过吧?猫来了,老鼠要躲进洞里.在一条数轴上,一共有n个洞,位置分别在xi,能容纳vi只老鼠.一共有m只老鼠位置分别在Xi,要躲进洞里,问所有老鼠跑进洞里的距离总和最小是多少. 输入格 ...

  2. 汕头市队赛 SRM14 T2 最长上升子序列

    最长上升子序列 (tree.pas/c/cpp) 128MB 1s 有一个长度为n的序列a[i],其中1到n的整数各自在a[i]中出现恰好一次. 现在已知另一个等长的序列f[i],表示a[i]中以第i ...

  3. 汕头市队赛 SRM13 T2

    这道题很容易想到是二分 但是因为可能会爆LL 所以要加一波特判 #include<cstdio> #include<cstring> #include<algorithm ...

  4. 汕头市队赛 SRM1X T1

    木之本樱 背景 “西瓜是可以种在树上的!”——木之本樱 描述 空地上,一排排的西瓜树拔地而起. 魔法世界里,空地是无限大的.所有的树排成了n条直线,每条直线也是向左右两端无限延伸的. 由于自己姓木(之 ...

  5. 汕头市队赛 C KMP codeforces B. Image Preview

    汕头市队赛题目传送门 codeforces题目传送门 这道题我的做法是 尝试先往左走然后往右走 或者先往右走然后往左走 然后注意一下枚举顺序就okay啦 #include<cstdio> ...

  6. 汕头市队赛SRM 20 T2不净的圣杯

    不净的圣杯 SRM 20 背景 作为一张BUG级别的卡,官方打算把它修改得人畜无害一些…… 虽然名字还没想好,但是能力大概是对敌方所有单位造成d点伤害,d为自己牌组中所有卡的编号的最大公约数.这无疑是 ...

  7. 汕头市队赛 yyl杯1 T2

    B SRM 05 - YYL 杯 R1 背景&&描述 有一个拥有n个城市的国家.这个国家由n-1条边连接起来.有一天国家发生叛乱.叛军已占领了一些城市.如果叛军占领的城市中,存在两个城 ...

  8. 汕头市队赛SRM15

    T1——czl SRM 15 众所周知,czl家养了一只可♂爱的***(已屏蔽),那只东西很贪吃,所以czl家很多零食仓库,然而这些仓库里有很多老鼠. 为了心爱的***,czl决定点燃纯艾条,用烟熏老 ...

  9. 汕头市队赛 SRM 07 D 天才麻将少女kpm

    这道题放了很久还是回来补了 D 天才麻将少女KPM SRM 07 背景&&描述 天才麻将少女KPM立志要在日麻界闯出一番名堂.     KPM上周叒打了n场麻将,但她这次又没控分,而且 ...

随机推荐

  1. js匿名函数运行的方法

    Javascript中定义函数的方式有多种,函数直接量就是其中一种.如var fun = function(){},这里function如果不赋值给fun那么它就是一个匿名函数.好,看看匿名函数的如何 ...

  2. 【js】【读书笔记】廖雪峰的js教程读书笔记

    最近在看廖雪峰的js教程,重温了下js基础,记下一些笔记,好记性不如烂笔头嘛 编写代码尽量使用严格模式 use strict JavaScript引擎是一个事件驱动的执行引擎,代码总是以单线程执行 执 ...

  3. [BZOJ4196]软件包管理器(树链剖分)

    [BZOJ4196] install x-> 询问根节点到x路径上0的个数,然后全变1 uninstall x-> 询问x子树(包括x)中1的个数,然后全边0 Code #include ...

  4. python正则表达式01--贪心算法和非贪心算法findall()

    import re st = 'asdfasxxixxdafqewxxlovexxsadawexxyouxxas' # . #点匹配除换行符外的任意字符 a0 = re.findall('xx.',s ...

  5. 笔记-scrapy-辅助功能

    笔记-scrapy-辅助功能 1.      scrapy爬虫管理 爬虫主体写完了,要部署运行,还有一些工程性问题: 限频 爬取深度限制 按条件停止,例如爬取次数,错误次数: 资源使用限制,例如内存限 ...

  6. selenium+PhantomJS 抓取淘宝搜索商品

    最近项目有些需求,抓取淘宝的搜索商品,抓取的品类还多.直接用selenium+PhantomJS 抓取淘宝搜索商品,快速完成. #-*- coding:utf-8 -*-__author__ =''i ...

  7. 9 Django 模型层(2) --多表操作

    创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关系( ...

  8. Android 人脸识别

    Android人脸识别技术,可以参考下面的网站. http://www.faceplusplus.com.cn/ 本项目使用的就是该网站的api. 项目具体使用的技术代码 /** * 用来压缩图片的方 ...

  9. json对象和java对象的相互转换方法(json-lib、jackson、fastjson、gson)

    一 使用json-lib包下的JSONObject和JSONArray转换 代码如下: package com.test.test; import java.util.ArrayList; impor ...

  10. MySQL数据库基础总结

    来源: 实验楼 链接: https://www.shiyanlou.com/courses/9 一.开发准备 # 打开 MySQL 服务 sudo service mysql start #使用 ro ...