题意

二维平面,屏幕是 (0, 1)–(0, m) 的线段
有 n 行 m 列座位在屏幕前面,是坐标范围 1 ≤ x ≤ n, 1 ≤ y ≤ m 的整点
有 k 个座位已经有人,求出到屏幕的视线不被任何人挡住的座位数量
q 次询问,每次修改一个人的坐标后求出答

题解
对于 y = 1 或 y = m 的列,每个人只会挡住自己正右方的人。特殊处理
一下。
而对于 y = 2, 3, . . . , m − 1,每个人挡住的区域是 (0, 1) 和 (0, m) 到这个
点的两条射线之间的区域。两条射线的方向都是 x 坐标增大,y 坐标一个增
大一个减小。最后不合法的区域就是这些区域的并集。
整个区域实际上构成一个折线图。对于每个 y,会有一个分界线 t,在这
一列上,x ∈ [1, t) 的点是满足条件的,而 x ∈ [t, n] 的点会被挡住。
折线图由 2k 个线段构成。这 2k 条线段有比较明显的性质,就是延长线
都经过 (0, 1) 或 (0, m)。可以把它们分成两类。
那么实际上可以对于延长线经过这两个点的线段分别维护一下斜率。
首先对每个 y,如果这一列有多个人,那么肯定考虑 x 最小的人,因为
小的会完全覆盖大的。
然后对于 (0, 1) 和 (0, m) 分开考虑。
以 (0, 1) 为例,所有线段都是从某个点往右上方走。
如果按 y 从小到大加入线段,不难发现斜率大的线段一旦加入,就一直
会覆盖斜率小的线段。对于某个 y,要找到最小的合法 x,那么肯定取的是
前面所有线段中斜率最大的线段。所以对 y 正着扫一遍,在扫的同时维护一
下最大的斜率,即可得出每一列只考虑经过 (0, 1) 的线段的答案。
(0, m) 同理,倒着扫一遍维护斜率最小(绝对值最大)的线段即可。每
个 y 在两种情况取 min 就是答案。

#include <algorithm>
#include <iostream>
#include <cmath>
#include <vector>
#include <stack>
#include <cstring>
#include <cstdio>
#include <queue>
#include <map>
#include <unordered_map>
#include <iomanip> //保留小数setprecision
#define endl '\n'
#define PI acos(-1.0) // 3.1415
#define Buff std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define mem(a, b) memset(a, b, sizeof(a))
#define lowbit(x) x & -x
#define ll long long
#define ull unsigned long long
#define eps 1e-10
#define int long long
//#pragma GCC optimize(2)
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 2e5 + 7, M = 5e5 + 7;
const int mod = 1e9 + 7;int n, m, k, q;
int h[N], X[N], Y[N], MIN[N];struct node
{int a, b;bool operator<(const node &x) const //按照斜率从大到小排序,斜率是b/a,不等式转移就是下面的式子,这个式子从小到大对应斜率从大到小。{return a * x.b < x.a * b;}
};inline void work()
{fill(h + 1, h + m + 1, n);fill(MIN + 1, MIN + m + 1, n + 1);for (int i = 1; i <= k; i++) //求每行有人的座位求最小的x;MIN[Y[i]] = min(MIN[Y[i]], X[i]);node L = {INF, 1LL};for (int i = 2; i <= m; i++){if (L.a != INF){int x = L.a, y = L.b;//(x * (i - 1)) / y是找到维护的最大斜率在这一行的交点//将直线的式子写出来就可以很容易理解了// y=(b/a)x+c,这里c=1.if (x * (i - 1) % y == 0) //如果交点刚好为整数(及刚好在点上),那就-1h[i] = min(h[i], (x * (i - 1)) / y - 1);elseh[i] = min(h[i], (x * (i - 1)) / y);}L = min(L, {MIN[i], i - 1}); //求最大的斜率}node R = {INF, 1LL};for (int i = m - 1; i >= 1; i--){if (R.a != INF){int x = R.a, y = R.b;// h[i] = min(h[i], (x * (m - i) - 1) / y);if (x * (m - i) % y == 0)h[i] = min(h[i], (x * (m - i)) / y - 1);elseh[i] = min(h[i], (x * (m - i)) / y);}R = min(R, {MIN[i], m - i});}int res = 0;for (int i = 1; i <= m; i++){h[i] = min(h[i], MIN[i] - 1);res += h[i];}cout << res << endl;return;
}inline void solve()
{cin >> n >> m >> k >> q;for (int i = 1; i <= k; i++){cin >> X[i] >> Y[i];}while (q--){int p, x, y;cin >> p >> x >> y;X[p] = x, Y[p] = y;work();}return;
}
signed main()
{int _ = 1;// cin>> _;while (_--)solve();return 0;
}
/***  ┏┓   ┏┓+ +* ┏┛┻━━━┛┻┓ + +* ┃       ┃* ┃   ━   ┃ ++ + + +*  ████━████+*  ◥██◤ ◥██◤ +* ┃   ┻   ┃* ┃       ┃ + +* ┗━┓   ┏━┛*   ┃   ┃ + + + +Code is far away from bug with the animal protecting*   ┃   ┃ +                     神兽保佑,代码无bug *   ┃    ┗━━━┓*   ┃        ┣┓*    ┃        ┏┛*     ┗┓┓┏━┳┓┏┛ + + + +*    ┃┫┫ ┃┫┫*    ┗┻┛ ┗┻┛+ + + +*/

2022牛客多校 C Grab the Seat!相关推荐

  1. 2022牛客多校(十)

    2022牛客多校(十) 一.比赛小结 比赛链接:"蔚来杯"2022牛客暑期多校训练营10 二.题目分析及解法(基础题) F.Shannon Switching Game? 题目链接 ...

  2. 2022牛客多校十 E-Reviewer Assignment(匈牙利算法)

    题目链接:登录-专业IT笔试面试备考平台_牛客网 题目: 样例输入: 5 3 010 010 101 011 100 样例输出: 2 2 1 3 1 题意:给定n个人和m篇文章,然后给出一个n*m的矩 ...

  3. (2022牛客多校五)H-Cutting Papers(签到)

    样例输入: 2022 样例输出: 3649785.912339927 题意:求|x|+|y|+|x+y|<=n所在的区域和x*x+y*y=(n/2)*(n/2)所在区域的面积并. 这道题就是一个 ...

  4. [manacher][hash]Magic Spells 2022牛客多校第9场 G

    题目描述 One day in the magic world, the young wizard RoundDog was learning the compatibility of spells. ...

  5. 2022牛客多校联赛第九场 题解

    比赛传送门 作者: fn 目录 签到题 A题 Car Show / 车展 基本题 B题 Two Frogs / 两只青蛙 进阶题 G题 Magic Spells / 魔法咒语 签到题 A题 Car S ...

  6. [构造]Array 2022牛客多校第6场 A

    题目描述 Ranran has a sequence aaa of nnn integers a1,a2,⋯ ,ana_1, a_2, \cdots, a_na1​,a2​,⋯,an​ which s ...

  7. 2022牛客多校2题解报告(同步自语雀)

    一.赛后总结 总结就是缺乏清晰的大脑,当然一切的一切归因于实力不足. 开局看K,半个小时推出DP式子,交了就WA.差错没查出来,写了暴力对拍,就去看D了.后来拍了3个小时也没出问题...可能是数据生成 ...

  8. 2022牛客多校第一场A、C、D、G、I、J

    A- Villages: Landlines 题意: 在一条横轴上给定nnn个点横坐标xsx_sxs​和半径rsr_srs​,可以在横轴上任意两点连线,问连接这nnn个点形成的圆的连线最小长度为多少. ...

  9. 【2022牛客多校第六场 Z题 Game on grid】dp

    题目描述 输入描述 2 3 3 -B -B BB. 1 3 - 输出描述 no no yes no yes no 题意 有一个n*m的棋盘,Alice和Bob轮流进行操作,每操作一步都是从当前点到右边 ...

最新文章

  1. php在线炒河粉,在线炒河粉表情包
  2. NOIP2011聪明的质监员题解
  3. bartender的安全策略不允许指定的用户执行此操作_MongoDB用户和角色解释系列(上)...
  4. 只等你来!OpenAtom XuperChain 开发者夏季论坛来啦
  5. JNDI配置DataResource代替JDBC连接数据库
  6. 原!操作 excel 03/07
  7. JavaScript、Ajax与jQuery的关系
  8. 华为鸿蒙内置,内置鸿蒙系统,华为生态产品海雀智能摄像头Pro体验
  9. 余额宝好日子到头,以后不能随存随取了!
  10. 90%的人都不会做的一道笔试题
  11. java解析excel文件处理数字成像_Java处理Excel工具,POI解析,使用InputStream读取文件...
  12. (28)XIlinx FPGA 原语简介(FPGA不积跬步101)
  13. 高晓松卸任北京阿里巴巴音乐科技有限公司董事长
  14. springboot显示信息并且修改_Spring Boot小结-03--增.删.改.查
  15. Linux系统 查看系统版本、CPU、内存、主频等信息
  16. thymeleaf 语法——th:text默认值、字符串连接、th:attr、th:href 传参、th:include传参、th:inline 内联、th:each循环、th:with、th:if
  17. Qt进阶--Item Views详解(基础,原创,超级详细)
  18. Spring cloud alibaba--Feign微服务调用组件
  19. 宝塔面板可以建立静态网站吗?如何部署一个静态页面?
  20. Unity3d vector3.forward和transform.forward的区别!

热门文章

  1. 在使用DingDing内网穿透时遇到的坑
  2. corex9服务器组装攻略,ROG M7H+ GTX980+Tt Core X9怪兽级主机攒机记
  3. Git忽略文件.gitignore详解
  4. Jetpack(五)—— Navigation
  5. Python的egg包
  6. Paper Reading - Model系列 - LiteHRNet
  7. Excel的Python开发插件-- 完全替代陈旧的VBA
  8. vue+axios 实现Excel下载,并解析文件流
  9. 【从0到1搭建LoRa物联网】16、LoRa连接到腾讯云物联网平台
  10. maven中的一些依赖