题解

有什么LNOI啊,最后都是JLOI罢了

一道非常……懵逼的统计题

当然是容斥,所有的方案 - 至少有一个点坏掉的正方形 + 至少有两个点坏掉的正方形 - 至少有三个点坏掉的正方形 + 至少有四个点坏掉的正方形

总共的方案就是

\(\sum_{i}^{min(n,m)}i \* (n - i + 1) \* (m - i + 1)\)

至少有一个点坏掉的怎么统计,我们考虑这个点在底边,左边有l个坐标右边有r个坐标,上面有h个坐标

设\(z = min(l + r,h)\)

如果高度大于左右两边,那么总共的是\(\frac{z(z + 1)}{2} + z\)

如果有超出的部分,即\(z > l\),或\(z > r\)设差值为n,则多出去的就是\(\frac{n(n + 1)}{2}\)

然后两两枚举点对,最后统计出来的3个点要除3,统计出来4个点的要除6

代码

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <iostream>
  5. #include <map>
  6. #define MAXN 100005
  7. #define pii pair<int,int>
  8. #define fi first
  9. #define se second
  10. //#define ivorysi
  11. using namespace std;
  12. typedef long long int64;
  13. int N,M,K;
  14. pii P[2005];
  15. map<pii,bool> mmm;
  16. const int MOD = 100000007;
  17. int64 ans,cnt2,cnt3,cnt4;
  18. void sub(int l,int r,int h) {
  19. int z = min(l + r,h);
  20. ans -= 1LL * z * (z + 3) / 2;
  21. if(z > l) ans += 1LL * (z - l) * (z - l + 1) / 2;
  22. if(z > r) ans += 1LL * (z - r) * (z - r + 1) / 2;
  23. ans = (ans % MOD + MOD) % MOD;
  24. }
  25. bool in_range(int x,int l,int r) {
  26. if(x >= l && x <= r) return 1;
  27. return 0;
  28. }
  29. void check(pii A,pii B) {
  30. if(!in_range(A.fi,0,N) || !in_range(A.se,0,M) || !in_range(B.fi,0,N) || !in_range(B.se,0,M)) return;
  31. ++cnt2;
  32. int t = mmm.count(A) + mmm.count(B);
  33. if(t >= 1) ++cnt3;
  34. if(t >= 2) ++cnt4,++cnt3;
  35. }
  36. void Solve() {
  37. scanf("%d%d%d",&N,&M,&K);
  38. for(int i = 1 ; i <= K ; ++i) {
  39. scanf("%d%d",&P[i].fi,&P[i].se);
  40. mmm[P[i]] = 1;
  41. }
  42. for(int i = 1 ; i <= min(N,M) ; ++i) {
  43. ans += 1LL * i * (N - i + 1) % MOD * (M - i + 1) % MOD;
  44. ans %= MOD;
  45. }
  46. for(int i = 1 ; i <= K ; ++i) {
  47. sub(P[i].fi,N - P[i].fi,P[i].se);
  48. sub(P[i].fi,N - P[i].fi,M - P[i].se);
  49. sub(P[i].se,M - P[i].se,P[i].fi);
  50. sub(P[i].se,M - P[i].se,N - P[i].fi);
  51. ans += min(P[i].fi,P[i].se);
  52. ans += min(P[i].fi,M - P[i].se);
  53. ans += min(N - P[i].fi,P[i].se);
  54. ans += min(N - P[i].fi,M - P[i].se);
  55. ans %= MOD;
  56. }
  57. for(int i = 1 ; i <= K ; ++i) {
  58. for(int j = i + 1 ; j <= K ; ++j) {
  59. int dx = P[i].fi - P[j].fi,dy = P[i].se - P[j].se;
  60. check(make_pair(P[i].fi - dy,P[i].se + dx),make_pair(P[j].fi - dy,P[j].se + dx));
  61. check(make_pair(P[i].fi + dy,P[i].se - dx),make_pair(P[j].fi + dy,P[j].se - dx));
  62. if(abs(dx) + abs(dy) & 1) continue;
  63. int x = (dx - dy) >> 1,y = (dx + dy) >> 1;
  64. check(make_pair(P[i].fi - x,P[i].se - y),make_pair(P[j].fi + x,P[j].se + y));
  65. }
  66. }
  67. ans += cnt2 - cnt3 / 3 + cnt4 / 6;
  68. ans = (ans % MOD + MOD) % MOD;
  69. printf("%lld\n",ans);
  70. }
  71. int main() {
  72. #ifdef ivorysi
  73. freopen("f1.in","r",stdin);
  74. #endif
  75. Solve();
  76. }

【LOJ】 #2025. 「JLOI / SHOI2016」方的更多相关文章

  1. loj #2025. 「JLOI / SHOI2016」方

    #2025. 「JLOI / SHOI2016」方   题目描述 上帝说,不要圆,要方,于是便有了这道题. 由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形.上帝把我们派到了一个有 NNN ...

  2. loj #2024. 「JLOI / SHOI2016」侦查守卫

    #2024. 「JLOI / SHOI2016」侦查守卫   题目描述 小 R 和 B 神正在玩一款游戏.这款游戏的地图由 nnn 个点和 n−1n - 1n−1 条无向边组成,每条无向边连接两个点, ...

  3. loj #2026. 「JLOI / SHOI2016」成绩比较

    #2026. 「JLOI / SHOI2016」成绩比较   题目描述 THU 的 G 系中有许许多多的大牛,比如小 R 的室友 B 神.B 神已经厌倦了与其他的同学比较 GPA(Grade Poin ...

  4. LOJ #2026「JLOI / SHOI2016」成绩比较

    很好的锻炼推柿子能力的题目 LOJ #2026 题意 有$n$个人$ m$门学科,第$ i$门的分数为不大于$U_i$的一个正整数 定义A「打爆」B当且仅当A的每门学科的分数都不低于B的该门学科的分数 ...

  5. 【LOJ】#2026. 「JLOI / SHOI2016」成绩比较

    题解 用\(f[i][j]\)表示考虑了前i个排名有j个人被碾压 \(f[i][j] = f[i - 1][k] \* C[k][j] \* C[N - k - 1][N - r[i] - j] \* ...

  6. 【LOJ】#2024. 「JLOI / SHOI2016」侦查守卫

    题解 童年的回忆! 想当初,这是我考的第一次省选,我当时初二,我什么都不会,然后看着这个东西,是不是能用我一个月前才会的求lca,光这个lca我就调了一个多小时= =,然后整场五个小时,我觉得其他题不 ...

  7. loj2026 「JLOI / SHOI2016」成绩比较

    orz #include <iostream> #include <cstdio> using namespace std; typedef long long ll; int ...

  8. loj2024「JLOI / SHOI2016」侦查守卫

    too hard #include <iostream> #include <cstdio> using namespace std; int n, d, m, uu, vv, ...

  9. Loj #2495. 「AHOI / HNOI2018」转盘

    Loj #2495. 「AHOI / HNOI2018」转盘 题目描述 一次小 G 和小 H 原本准备去聚餐,但由于太麻烦了于是题面简化如下: 一个转盘上有摆成一圈的 \(n\) 个物品(编号 \(1 ...

随机推荐

  1. 转:NSString / NSData / char* 类型之间的转换

    1. NSString转化为UNICODE String: (NSString*)fname = @“Test”; char fnameStr[10]; memcpy(fnameStr, [fname ...

  2. VS2010 中更改项目名称

    Time.vcxproj修改项目名称,主要是通过以下几个步骤就能完成: 修改解决方案的名称. 修改解决项目名称. 修改项目的程序集名称和默认命名空间 替换整个项目或解决方案中的出现该名称的地方. 修改 ...

  3. bzoj千题计划125:bzoj1037: [ZJOI2008]生日聚会Party

    http://www.lydsy.com/JudgeOnline/problem.php?id=1037 一个区间是否满足 任意连续的一段,男孩与女孩的数目之差不超过k, 取决于男孩与女孩数目之差的最 ...

  4. MAC 下用 Common Lisp 调试 OpenGL 程序

    MAC 下用 Common Lisp 调试 OpenGL 程序 环境搭建 运行环境: OSX 10.11.3 EI Capitan Common Lisp: SBCL 使用 SBCL, 首先要安装这几 ...

  5. Java SSM框架之MyBatis3(三)Mybatis分页插件PageHelper

    引言 对于使用Mybatis时,最头痛的就是写分页,需要先写一个查询count的select语句,然后再写一个真正分页查询的语句,当查询条件多了之后,会发现真不想花双倍的时间写count和select ...

  6. c++刷题(24/100)正则匹配与位运算

    题目1:正则表达式匹配 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字 ...

  7. spring断言使用

    断言就是断定某一个实际的值为自己预期想得到的,如果不一样就抛出异常. Assert经常用于: 1.判断method的参数是否属于正常值.2.juit中使用. import org.springfram ...

  8. 配置多个ssh-key

    搞了三天没搞出来,还在男朋友面前哭了一场,真心觉得我只该吃屎,我好没用.哎.. 首先在上一篇记录了如何生成ssh-key,并使本地可以通过ssh的方式克隆和推送项目.但如果你有个github账号,有个 ...

  9. 浏览器断点调试js

    说了一些 Chrome 开发者工具的技巧,其实并没有涉及到开发者工具最核心的功能之一:断点调试.断点可以让程序运行到某一行的时候,把程序的整个运行状态进行冻结.你可以清晰地看到到这一行的所有的作用域变 ...

  10. 单调栈(G - Sliding Window POJ - 2823 )

    题目链接:https://cn.vjudge.net/contest/276251#problem/G 题目大意:给你n和m,然后问你对于(m,n)这中间的每一个数,(i-m+1,i)这个区间的最小值 ...