学习了一下平面图剖分的姿势,orz cbh

每次只要随便选择一条边,然后不停尽量向左转就行

  1. #include <bits/stdc++.h>
  2. #define N 1300000
  3. #define M 5000013
  4. #define LL long long
  5. #define pb push_back
  6. using namespace std;
  7. LL n, m, k;
  8. struct point
  9. {
  10. LL x, y;
  11. } S[N];
  12. vector <LL> bi[N];
  13. vector <LL> re[N], vis[N], s1[N], s2[N];
  14. vector <LL> bt[N], ca[N], cb[N];
  15. LL tot_are;
  16. LL siz[N], sum1[N], sum2[N], tot[N];
  17. LL nwc;
  18. LL comp(LL a, LL b)
  19. {
  20. return atan2(S[a].y - S[nwc].y, S[a].x - S[nwc].x) > atan2(S[b].y - S[nwc].y, S[b].x - S[nwc].x);
  21. }
  22. LL getsiz(point a, point b, point c)
  23. {
  24. return (b.x - a.x) * (c.y - a.y) - (c.x - a.x) * (b.y - a.y);
  25. }
  26.  
  27. namespace addr
  28. {
  29. LL hs[M]; LL dt[M];
  30. LL get(LL a, LL b)
  31. {
  32. return 1ll * a * + b;
  33. }
  34. LL & find(LL a, LL b)
  35. {
  36. LL p = get(a, b); LL q = p % M;
  37. while (hs[q] && hs[q] != p) q = (q + ) % M;
  38. hs[q] = p; return dt[q];
  39. }
  40. }
  41. LL tvis[N], fa[N];
  42. void dfs(LL t)
  43. {
  44. //cout << t << "\n";
  45.  
  46. tvis[t] = ;
  47. sum1[t] = siz[t] * siz[t];
  48. sum2[t] = siz[t] * ;
  49. for (LL i = ; i < bt[t].size(); ++ i)
  50. if (!tvis[bt[t][i]])
  51. {
  52. dfs(bt[t][i]); fa[bt[t][i]] = t;
  53. sum1[t] += sum1[bt[t][i]];
  54. sum2[t] += sum2[bt[t][i]];
  55. s1[ca[t][i]][addr :: find(ca[t][i], cb[t][i])] = sum1[bt[t][i]];
  56. s2[ca[t][i]][addr :: find(ca[t][i], cb[t][i])] = sum2[bt[t][i]];
  57. s1[cb[t][i]][addr :: find(cb[t][i], ca[t][i])] = -sum1[bt[t][i]];
  58. s2[cb[t][i]][addr :: find(cb[t][i], ca[t][i])] = -sum2[bt[t][i]];
  59. }
  60. }
  61. LL read()
  62. {
  63. LL x=,f=;char ch=getchar();
  64. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  65. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  66. return x*f;
  67. }
  68. LL c = ;
  69. int main()
  70. {
  71. //freopen("mine2.in", "r", stdin);
  72. n = read(); m = read(); k = read();
  73. for (LL i = ; i <= n; ++ i) S[i].x = read(), S[i].y = read();
  74. for (LL i = ; i <= m; ++ i)
  75. {
  76. LL a, b;
  77. a = read(); b = read();
  78. bi[a].push_back(b);
  79. bi[b].push_back(a);
  80. }
  81. for (LL i = ; i <= n; ++ i) re[i].resize(bi[i].size()), s1[i] = s2[i] = vis[i] = re[i];
  82. for (LL i = ; i <= n; ++ i) nwc = i, sort(bi[i].begin(), bi[i].end(), comp);
  83. for (LL i = ; i <= n; ++ i)
  84. for (LL j = ; j < bi[i].size(); ++ j)
  85. addr :: find(i, bi[i][j]) = j;
  86. for (LL i = ; i <= n; ++ i)
  87. for (LL j = ; j < bi[i].size(); ++ j)
  88. re[i][j] = addr :: find(bi[i][j], i);
  89.  
  90. for (LL i = ; i <= n; ++ i)
  91. for (LL j = ; j < bi[i].size(); ++ j)
  92. if (!vis[i][j])
  93. {
  94. tot_are ++;
  95. for (LL k = i, p = j; !vis[k][p]; )
  96. {
  97. siz[tot_are] += getsiz(S[i], S[k], S[bi[k][p]]);
  98. vis[k][p] = tot_are;
  99. LL np = (re[k][p] + ) % bi[bi[k][p]].size();
  100. k = bi[k][p];
  101. p = np;
  102. }
  103. if (siz[tot_are] < ) c = tot_are;
  104. }
  105. for (LL i = ; i <= n; ++ i)
  106. for (LL j = ; j < bi[i].size(); ++ j)
  107. bt[vis[i][j]].push_back(vis[bi[i][j]][re[i][j]]),
  108. ca[vis[i][j]].push_back(i),
  109. cb[vis[i][j]].push_back(bi[i][j]);
  110. dfs(c);
  111. for (LL i = , last = ; i <= k; ++ i)
  112. {
  113. LL d, ns1 = , ns2 = ;
  114. d = read(); d = (d + last) % n + ;
  115. LL fs, ls, nw;
  116. fs = read(); fs = (fs + last) % n + ; ls = fs;
  117. for (LL j = ; j <= d; ++ j, ls = nw)
  118. {
  119. nw = read(); nw = (nw + last) % n + ;
  120. ns1 += s1[ls][addr :: find(ls, nw)];
  121. ns2 += s2[ls][addr :: find(ls, nw)];
  122. }
  123. ns1 += s1[ls][addr :: find(ls, fs)];
  124. ns2 += s2[ls][addr :: find(ls, fs)];
  125. LL g = __gcd(ns1, ns2);
  126. cout << ns1 / g << " " << ns2 / g << "\n";
  127. last = ns1 / g;
  128. }
  129. }

放在class里的东西还会爆栈QAQ,以后不敢用了

4541: [Hnoi2016]矿区的更多相关文章

  1. BZOJ 4541: [Hnoi2016]矿区 平面图转对偶图+DFS树

    4541: [Hnoi2016]矿区 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 433  Solved: 182[Submit][Status][ ...

  2. ●BZOJ 4541 [Hnoi2016]矿区

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4541 题解: 平面图的对偶图,dfs树 平面图的对偶图的求法: 把所有双向边拆为两条互为反向 ...

  3. bzoj 4541: [Hnoi2016]矿区【平面图转对偶图+生成树】

    首先平面图转对偶图,大概思路是每条边存正反,每个点存出边按极角排序,然后找每条边在它到达点的出边中极角排序的下一个,这样一定是这条边所属最小多边形的临边,然后根据next边找出所有多边形,用三角剖分计 ...

  4. [HNOI2016]矿区

    [HNOI2016]矿区 平面图转对偶图 方法: 1.分成正反两个单向边,每个边属于一个面 2.每个点按照极角序sort出边 3.枚举每一个边,这个边的nxt就是反边的前一个(这样找到的是面的边逆时针 ...

  5. 【LG3249】[HNOI2016]矿区

    [LG3249][HNOI2016]矿区 题面 洛谷 题解 先平面图转对偶图, 建好了对偶图之后随意拿出一个生成树,以无边界的范围为根. 无边界的范围很好求,用叉积算出有向面积时,算出来是负数的就是无 ...

  6. BZOJ4541 [Hnoi2016]矿区

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  7. 【bzoj4541】 Hnoi2016—矿区

    http://www.lydsy.com/JudgeOnline/problem.php?id=4541 (题目链接) 题意 给出一个平面图,若干询问,每次询问一个凸多边形内小多边形面积的平方和与面积 ...

  8. BZOJ4541 HNOI2016矿区(平面图转对偶图)

    考虑先将平面图转化为对偶图.具体地,将无向边拆成两条有向边.每次考虑找到包围一个区域的所有边.对当前考虑的边,找到该边的反向边在该边终点的出边集中,按极角序排序的后继,这条后继边也是包围该区域的边.这 ...

  9. [BZOJ4541][HNOI2016]矿区(平面图转对偶图)

    https://www.cnblogs.com/ljh2000-jump/p/6423399.html #include<cmath> #include<vector> #in ...

随机推荐

  1. [LeetCode] First Unique Character in a String 字符串第一个不同字符

    Given a string, find the first non-repeating character in it and return it's index. If it doesn't ex ...

  2. [LeetCode] Word Search 词语搜索

    Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from l ...

  3. ServerSocket的介绍

    导语 仅仅只有Socket类是不足以编写服务器的.要创建一个Socket,你需要知道希望连接哪个Internet主机.编写服务器程序时,无法预先了解哪个主机会联系你,即使确实知道,你也不清楚那个主机希 ...

  4. 记录rewrite url我之前不知道的地方

    大部分url重写的需求是伪静态,当然有很多第三方开源组件,但是这种需求的核心方法其实就是context.rewritePath() 要是系统像ARR那样,用重写做代理和反向代理,一般的重写就不行了,c ...

  5. ubuntu下的apt-get内网本地源的搭建

    APT本地源的搭建(可用于局域网apt-get源搭建或者本地源) 本文档介绍使用apt-mirror软件搭建apt本地源 需求:内网开发环境由于其特定原因不能上外网,所以需要本地环境下的内网源来方便开 ...

  6. 【BZOJ 1005】【HNOI 2008】明明的烦恼

    http://www.lydsy.com/JudgeOnline/problem.php?id=1005 答案是\[\frac{(n-2)!}{(n-2-sum)!×\prod_{i=1}^{cnt} ...

  7. PAT Basic Level 1001

    大纲考察内容 数据存储结构:数组.链 基础算法:递归.排序.计算时间复杂度.空间复杂度.分析算法稳定性 1001.害死人不偿命的(3n+1)猜想 (15) https://www.patest.cn/ ...

  8. Java开发实践 集合框架 全面分析

    http://www.open-open.com/lib/view/open1474167415464.html

  9. Python OOP(面向对象编程)

    一OOP的作用 在Python中,类是面向对象设计(OOP)的主要工具.通过使用类这种工具,OOP可以: 1.分解代码,最小化代码的冗余. 2.通过定制现有的代码,来编写新的程序,而不用在原处进行修改 ...

  10. bootstrap学习笔记--bootstrap排版类的使用

    标题 Bootstrap 中定义了所有的 HTML 标题(h1 到 h6)的样式,这个和一般的html没啥区别.请看下面的实例: <h1>测试1 h1</h1> <h2& ...