题目

题意简述

  给定一个含有 \(n\) 个顶点的凸多边形( \(n\) 是偶数),对于每一对相对的边(即中间有 \(\frac{n}2-1\) 条其它边),延长它们以将平面分割为多块,并把包含原凸包的一块染色(包含边界)。再给出 \(q\) 个询问,询问一个点 \(p\) 所在位置是否被染色。

数据规模

  强制在线,\(n,q\le10^5\)。

题解

题意转化

  首先,考虑某个点“被染色”的条件:存在一对相对边,若两边不平行,则该点在这对边延长所构成的劣角内部;若两边平行,则该点在它们所在两条直线的异侧。下图表现了第一种情况:

  在图中,如果我们把凸多边形(四边形 \(ABCD\))看作障碍物,那么 \(P1\) 看不到 \(AD,BC\) 两边,\(P2\) 亦是如此,而二者都被相对边 \((AD,BC)\) 染色了。相反,对于 \(P3\),它能看到 \(BC\) 这条边,所以没有被这对边染色。

  尝试把这个结论推广,对于任意一点 \(P\),若存在 \(P\) 看不到的一对相对边,\(P\) 就会被染色,反之则不会被染色。所以,对于不会被染色的 \(P\),它至少能看到多边形 \(\frac{n}2\) 条边

算法构建

  第一步,我们要得到判断“一组相对边是否能染色某个点”的方法。还是以上图为例:

  对于 \(E\) 点,我们求出向量 \(\boldsymbol{u}=\vec{DE},\boldsymbol{v}=\vec{EA},\boldsymbol{p}=\vec{CE},\boldsymbol{q}=\vec{EB}\)(注意在这里 \(B,C,D,A\) 四点是按逆时针排列的)。并记 \(a=\boldsymbol{u}\times\boldsymbol{v},b=\boldsymbol{p}\times\boldsymbol{q}\),可以发现,当 \((a=0\lor b=0)\lor(a<0\land b>0)\) 为真时,\(E\) 被这组边染色。


  第二步,还需要判断“一个点能否看到多边形上的某个点”。其实很简单,只需要令第一步中 \(D,C\) 重合,\(A,B\) 分别为多边形上的前驱和后继顶点,如第一步判断能否染色就行啦~


  第三步,如何求 \(P\) 能够看到几条边呢?不难想到二分:先取出一个会被看到的凸多边形上的点,再分别向两侧扩展。但怎么找到这个点呢?

  \(O(n)\) 找肯定是不可取的。我们耍一个小聪明:随便取一个点,设其在凸多边形上的下标为 \(i\),并取出 \((i,i+1),(i+\frac{n}2,i+\frac{n}2+1)\) 这组对边,作第一步的判断。如果判断成功,就直接得出答案啦;否则,\(P\) 就一定能看到这四个点中的两个(某一条边),再用第二步的方法就可以找到我们需要的点了。


  最后,二分即可。

代码

  1. #include <ctime>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <utility>
  5. typedef long long LL;
  6. typedef __int128 LLL;
  7. inline LL rint () {
  8. LL x = 0, f = 1; char s = getchar ();
  9. for ( ; s < '0' || '9' < s; s = getchar () ) f = s == '-' ? -f : f;
  10. for ( ; '0' <= s && s <= '9'; s = getchar () ) x = x * 10 + ( s ^ '0' );
  11. return x * f;
  12. }
  13. const int MAXN = 1e5;
  14. int T, N, Q;
  15. struct Point { LLL x, y; } P[MAXN + 5];
  16. struct Vector {
  17. LLL x, y;
  18. Vector () {}
  19. Vector ( const Point p ): x ( p.x ), y ( p.y ) {}
  20. Vector ( const LLL tx, const LLL ty ): x ( tx ), y ( ty ) {}
  21. Vector ( const Point s, const Point t ): x ( t.x - s.x ), y ( t.y - s.y ) {}
  22. inline LLL operator * ( const Vector t ) const { return x * t.y - y * t.x; }
  23. };
  24. inline bool visible ( const Point s, const int indx ) {
  25. LLL t1 = Vector ( P[indx], s ) * Vector ( s, P[indx % N + 1] );
  26. LLL t2 = Vector ( P[indx], s ) * Vector ( s, P[( indx - 2 + N ) % N + 1] );
  27. bool ret = t1 > 0 || t2 < 0;
  28. return ret;
  29. }
  30. int main () {
  31. srand ( time ( 0 ) ^ 20120712 );
  32. T = rint (), N = rint ();
  33. for ( int i = 1; i <= N; ++ i ) P[i].x = rint (), P[i].y = rint ();
  34. Q = rint ();
  35. int cnt = 0;
  36. for ( Point R; Q --; ) {
  37. R.x = rint (), R.y = rint ();
  38. if ( T ) R.x ^= 1ll * cnt * cnt * cnt, R.y ^= 1ll * cnt * cnt * cnt;
  39. int p = rand () % N + 1, q = ( p + N / 2 - 1 ) % N + 1;
  40. LLL t1 = Vector ( P[p], R ) * Vector ( R, P[p % N + 1] );
  41. LLL t2 = Vector ( P[q % N + 1], R ) * Vector ( R, P[q] );
  42. if ( ! t1 || ! t2 || ( t1 < 0 && t2 > 0 ) ) {
  43. puts ( "DA" ), ++ cnt;
  44. continue;
  45. }
  46. int rpos = visible ( R, p ) ? p : q;
  47. int l = 0, r = N - 1, mid;
  48. while ( l < r ) {
  49. mid = l + r + 1 >> 1;
  50. if ( visible ( R, ( rpos - mid - 1 + N ) % N + 1 ) ) l = mid;
  51. else r = mid - 1;
  52. }
  53. int prelen = l;
  54. l = 0, r = N - 1;
  55. while ( l < r ) {
  56. mid = l + r + 1 >> 1;
  57. if ( visible ( R, ( rpos + mid - 1 ) % N + 1 ) ) l = mid;
  58. else r = mid - 1;
  59. }
  60. int suflen = l;
  61. if ( prelen + suflen >= N >> 1 ) puts ( "NE" );
  62. else puts ( "DA" ), ++ cnt;
  63. }
  64. return 0;
  65. }

Solution -「NOI.AC 省选膜你赛」寄蒜几盒的更多相关文章

  1. Solution -「NOI.AC 省选膜你赛」T2

      这道题就叫 T2 我有什么办法www 题目 题意简述   给定一个字符串 \(s\),其长度为 \(n\),求无序子串对 \((u,v)\) 的个数,其中 \((u,v)\) 满足 \(u,v\) ...

  2. Solution -「NOI.AC 省选膜你赛」array

    题目 题意简述   维护一个长度为 \(n\) 的序列 \(\{a_n\}\),并给出 \(q\) 个操作: 将下标为 \(x\) 的数修改为 \(y\). 给定 \(l,r,k\),求最大的 \(m ...

  3. Solution -「NOI.AC 省选膜你赛」union

    题目 题意简述   给定两颗树 \(A,B\),\(A\) 中的任一结点 \(u\) 与 \(B\) 中的任一结点 \(v\) 都有一个关系值 \(f(u,v)\),初始为 \(0\).再给出 \(q ...

  4. cdcqの省选膜你赛

    cdcqの省选膜你赛 比赛当天因为在杠hnoi2016的大数据结构没有参加,今天补了一下.挺好玩的虽然不看一句话题意的话真的卡读题 此生无悔入东方,来世愿生幻想乡 2651. 新史「新幻想史 -现代史 ...

  5. Solution -「NOI 2021」「洛谷 P7740」机器人游戏

    \(\mathcal{Description}\)   Link.   自己去读题面叭~ \(\mathcal{Solution}\)   首先,参悟[样例解释 #2].一种暴力的思路即为钦定集合 \ ...

  6. Solution -「NOI 2020」「洛谷 P6776」超现实树

    \(\mathcal{Description}\)   Link.   对于非空二叉树 \(T\),定义 \(\operatorname{grow}(T)\) 为所有能通过若干次"替换 \( ...

  7. Solution -「NOI 模拟赛」彩色挂饰

    \(\mathcal{Description}\)   给定一个含 \(n\) 个点 \(m\) 条边的简单无向图,设图中最大点双的大小为 \(s\),则保证 \(s\le6\).你将要用 \(k\) ...

  8. Solution -「NOI 模拟赛」出题人

    \(\mathcal{Description}\)   给定 \(\{a_n\}\),求一个 \(\{b_{n-1}\}\),使得 \(\forall x\in\{a_n\},\exists i,j\ ...

  9. Solution -「NOI 2016」「洛谷 P1587」循环之美

    \(\mathcal{Description}\)   Link.   给定 \(n,m,k\),求 \(x\in [1,n]\cap\mathbb N,y\in [1,m]\cap \mathbb ...

随机推荐

  1. Maven+ajax+SSM实现删除

    转载自:https://www.cnblogs.com/kebibuluan/p/9020381.html 3.尚硅谷_SSM高级整合_使用ajax操作实现删除的功能 点击删除的时候,要删除联系人,这 ...

  2. leetcode 233. 数字 1 的个数

    问题描述 给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数. 示例: 输入: 13 输出: 6 解释: 数字 1 出现在以下数字中: 1, 10, 11, 12, 13 . 问 ...

  3. CMake与OpenMP

    CMake与OpenMP cmake_minimum_required (VERSION 2.6) project (TEST) set (TEST_VERSION 0.1) set(CMAKE_BU ...

  4. vue3代码setup中this为什么无效

    结论:setup并没有通过各种方式去绑定this 在vue2中,我们可以在optionsApi中调用this来指向当前组件的实例,但是在vue3的setup中并不能这样做,因为setup位于组件创建成 ...

  5. Discuz!X V3.4后台任意文件删除

    Discuz!X V3.4后台任意文件删除 简述 该漏洞为后台任意文件删除,需要有管理员的权限,所以说危害非常小 复现环境 docker.vulhub-master 项目地址:https://gite ...

  6. 【vps】教你写一个属于自己的随机图API

    [vps]教你写一个自己的随机图API 前言 刚刚开始使用halo博客的时候,我就发现halo博客系统是可以使用随机图当背景的,所以也是使用了网上一些比较火的随机图API. 在上次发现了各种图片API ...

  7. Java异常理解之Exception in thread “main“ java.lang.ArrayIndexOutOfBoundsException

    这个异常是Java中的数组越界问题 当你使用不合法的索引访问数组是会出现这种错误例如: class Solution { public static int climbStairs(int n) { ...

  8. 猪齿鱼 Choerodon 的数据初始化设计解析

    数智化效能平台猪齿鱼Choerodon 作为一个微服务框架,需要解决微服务数据初始化本身具有的问题和复杂性,同时也需要满足框架本身特有的数据初始化需求,下面为大家介绍一下这方面的设计思想和实现. 微服 ...

  9. VS2017:win32项目与win32控制台应用程序的转换方法

    原文:https://www.cnblogs.com/asuser/articles/12297251.html 刚开始使用VS2017新建项目工程时,有时把应用类型的工程建成控制台类型的工程,在编译 ...

  10. IoC容器-Bean管理XML方式(注入空值和特殊符号)

    Ioc操作Bean管理(xml注入其他类型属性), 字面量 (1)null值 (2)属性值包含特殊符号