题意:

给你n个点,m个横着的线段。你能够横移这些线段,可是这些线段的相对位置不能改变。假设一个点,在它的正上方和和正下方都有线段(包含线段的终点)。则这个点被视为被“屏蔽”。问通过随意平移我们能够遮住最多的点的数量。



解题思路:



首先把全部的点向右平移1000000个单位。然后那些线段位置不变,我们開始平移这些点,这样我们保证点向左移动的距离肯定是一个正数,方便处理。

这样我们仅仅要求出每一个点向左移动的距离后能够满足题目条件的集合W。然后在求出某个距离值在全部的集合中出现最多次数的就可以,这个次数即是答案。



而我们重点就是求这个集合W。假设暴力的寻找。题目数据范围为1000000,点数1000,两者相乘的复杂度显然不可行,这里我们就要运用扫描线的思想了。

我们把条线段看成是两个点:入点 和 出点

比方一条(x1,y) - (x2,y)的线段。我们在(x1,y)的位置上标记一个1。在(x2+1,y)的位置上标记一个-1,然后依照横坐标从左到右的顺序扫过这些点,事实上就是扫描线的思想了。然后在可行的范围内我们的P数组位置上+1。然后找出P中的最大值就可以。

这里在更新P数组的时候我们也不能够直接暴力更新,比方我们要更新区间[l,r]区间都+1。我们仅仅要在P[l]位置上+1,在P[r+1]的位置上-1,然后最后一起更新就可以。

代码例如以下:

#include <bits/stdc++.h>

using namespace std;

int N, M;
pair<int, int> A[1000]; //储存点的坐标 struct event { //储存线段转化后的点,tp = 1 表示入点,tp = -1 表示出点
int x, y, tp;
bool operator< (const event& other) const {
return x < other.x;
}
}; event B[2015];
int P[2000016]; //维护答案的数组 int main() {
//freopen("in.in", "r", stdin);
//freopen("out.out", "w", stdout);
scanf("%d%d", &N, &M);
for (int i = 0; i < N; i++) {
scanf("%d%d", &A[i].second, &A[i].first); //题目好坑啊,是依照y,x的顺序给的坐标
A[i].first += 1000000;
}
int y, x1, x2;
for (int i = 0; i < M; i++) {
scanf("%d%d%d", &y, &x1, &x2);
B[i * 2] = (event) {x1, y, 1};
B[i * 2 + 1] = (event) {x2 + 1, y, -1};
}
sort(B, B + 2 * M); //扫描前要先对线段转化的点依照横坐标进行排序
multiset<int> s; s.clear(); //s储存现在区间全部线段的纵坐标的集合
for (int i = 0; i < N; i++) {
int last = -1;
for (int j = 0, k; j < 2 * M; j = k) {
for (k = j; k < 2 * M && B[k].x == B[j].x; k++) {
if (B[k].tp == -1)
s.erase(s.find(B[k].y));
else
s.insert(B[k].y);
}
if (last != -1) P[A[i].first - B[j].x + 1]++, P[A[i].first - last + 1]--; //O(1)更新P数组 if (s.empty() || *s.begin() > A[i].second || *s.rbegin() < A[i].second) //表示现在横坐标下第i个点不能满足题意
last = -1;
else
last = B[j].x; //记录上次满足的横坐标
}
}
int ans = 0;
for (int i = 1; i <= 2000015; i++)
ans = max(ans, P[i] += P[i - 1]); //利用更新的信息同一时候寻找答案,即最大值
printf("%d\n", ans);
return 0;
}

Gym 100733J Summer Wars 题解:灵活运用扫描线的思想的更多相关文章

  1. Codeforces Gym 100733J Summer Wars 线段树,区间更新,区间求最大值,离散化,区间求并

    Summer WarsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.a ...

  2. Gym - 100781G Goblin Garden Guards (扫描线)

    题意: n 只哥布林,每只哥布林都有一个位置坐标. m 个炮台,每个炮台都有一个位置坐标和一个攻击半径. 如果一个哥布林在任何一个炮台的攻击范围内,都会被杀死. 求最后没有被杀死的哥布林的数量. 这题 ...

  3. Gym 100431E Word Cover 题解:KMP上跑dp

    题意: 给你一个串,问你他的每个前缀的最小重复单元,其中单元是可以重叠的,最后按顺序输出即可.比如样例中abaabaa的最小重复单元为abaa,所以相应输出为4. 样例: input : abaaba ...

  4. [CERC2017]Intrinsic Interval——扫描线+转化思想+线段树

    [CERC2017]Intrinsic Interval https://www.luogu.org/blog/ywycasm/solution-p4747# 这种“好的区间”,见得还是比较多的了. ...

  5. scau 1144 数星星 bit + 扫描线的思想

    这题如果用二维树状数组,则会直接爆内存. 那么可以运用扫描线的思路. 就是,它同时被x和y限制了,那么可以在查询的时候,确保x先满足了,(把x按小到大排序) 然后就相当于是关于y的一个一维bit了, ...

  6. PAT甲级1004题解——并查集思想改

    题目分析:本题开始一直在考虑如何将每一个节点通过一种合适的数据结构存储起来(一对多的关系),最后发现借助并查集的思想可以用一个数组p,p[i]存放i节点的父节点,每次查询编号为i的节点属于第几层且判断 ...

  7. UVALive 4221 Walk in the Park 扫描线

    Walk in the Park 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemi ...

  8. uva 11983 Weird Advertisement 扫描线

    Weird Advertisement Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/probl ...

  9. bzoj3051[WC2013]平面图(树上倍增+平面图转对偶图+扫描线)

    简要题意:二维平面上n个点,点之间有一些连线,连线不在点之外的地方相交,将平面分为若干个区域.给出一些询问点对,问从这个点所在的区域走到另一个点所在的区域的最小代价. 题解:这道题首先可以把平面图转对 ...

随机推荐

  1. cocos2dx项目创建

    射击类游戏文档 作者:浙江传媒学院  新媒体  张勇 1>编译环境 首先我们先去cocos2dx官网上下载cocos2dx最新版本号 http://www.cocos2d-x.org/ 我下载的 ...

  2. EOJ 3 玩具谜题

    小南有一套可爱的玩具小人,它们各有不同的职业. 有一天,这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外.如下图: 这时 singer 告诉小南一个谜题 ...

  3. Java-杂项:Java数组Array和集合List、Set、Map

    ylbtech-Java-杂项:Java数组Array和集合List.Set.Map 1.返回顶部 1. 之前一直分不清楚java中的array,list.同时对set,map,list的用法彻底迷糊 ...

  4. TP5异常处理

    TP5异常处理 标签(空格分隔): php, thinkphp5 自定义异常处理 namespace app\common\exception; use think\Exception; class ...

  5. POJ 2923 DP

    题意: 两辆车去运一堆货物,货物数量小于等于10,问最少需要几趟能把货物全部运到目的地. 思路: 思路很简单,就是状态压缩成二进制.判断一下每个状态能不能运输.再进行一下DP. 设s[]数组里记录所有 ...

  6. Java基础——环境变量(PATH)和类变量(CLASSPATH)

    一.环境变量(PATH) 科普下,环境变量不是java的知识,是windows系统的环境变量. 下面请看怎么查看和修改windows的环境变量 在“我的电脑”右键属性进入后 点击“高级系统设置”(如下 ...

  7. ZOJ 3019 Puzzle

    解题思路:给出两个数列an,bn,其中an,bn中元素的顺序可以任意改变,求an,bn的LCS 因为数列中的元素可以按任意顺序排列,所以只需要求出an,bn中的元素有多少个是相同的即可. 反思:一开始 ...

  8. Unity中 Animator 与Animation 区别

    ①Animation和Animator 虽然都是控制动画的播放,但是它们的用法和相关语法都是大有不同的.Animation 控制一个动画的播放,而Animator是多个动画之间相互切换,并且Anima ...

  9. ZBrush软件中Brush特性

    在ZBrush里给用户提供了上百种用于雕刻的笔刷,每种笔刷的显示模式是以红色的两个圆圈,外面的圆圈表示笔刷在进行绘制和雕刻实际影响的范围,而内圆是表示笔刷强度到外圆的衰减的起始位置,可以在Focal ...

  10. 使用Eclipse将项目上传至远程GitLab

    一.先将项目提交至本地仓库 1.  右击项目——Team——Share Project… 2.在弹出框中,选择Git——Next 3.在弹出框中进行如下步骤操作 4.至此,我们已经成功创建了本地GIT ...