https://www.nowcoder.com/acm/contest/143/I

vc-dimension

题解:分三种情况,组合数学算一下,其中一种要用树状数组维护

技巧(来自UESTC):1.循环技巧i主j滑

2.树状数组:一个数列从左到右分别维护某个元素左边比它大num的与右边比他大的num时,从上往下扫, 对每个点的x坐标离散化累加1到X轴上,然后就会发现sum(p[i].x-1)就是左边比它大的,i-1-sum(p[i])就是右边比它大的。 注意y相同的点,需要一起更新(我已开始一个一个更新,根本写不出来)

orz太屌了

坑点:我循环写错了+公式里i,j写反了,wa了20发

比赛时x,y轴都看反了orz

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<cmath>
  3. #include<iostream>
  4. #include<stdio.h>
  5. #include<algorithm>
  6. #include<cstring>
  7. #include<stack>
  8. #include<vector>
  9. #include<string.h>
  10. #include<queue>
  11. #include<string>
  12. #include<set>
  13. using namespace std;
  14. #define rep(i,t,n) for(int i =(t);i<=(n);++i)
  15. #define per(i,n,t) for(int i =(n);i>=(t);--i)
  16. #define mmm(a,b) memset(a,b,sizeof(a))
  17. #define eps 1e-6
  18. #define pb push_back
  19. #define lowbit(x) ((x)&(-(x)))
  20. const int maxn = 3e5 + ;
  21. const int inf = 1e7 + ;//0x7fffffff; //无限大
  22. const int MOD = ;
  23. typedef long long ll;
  24. const int mod = ;
  25. int power(int a, int b) {
  26. int c = ; a %= mod;
  27. while (b) {
  28. if (b & ) c = 1ll * c*a%mod;
  29. a = 1ll * a*a%mod; b >>= ;
  30. }
  31. return c;
  32. }
  33.  
  34. struct node {
  35. int x, y;
  36. void sc() { scanf("%d%d", &x, &y); }
  37. }p[maxn];
  38.  
  39. int n;
  40. bool cmp(node a, node b) {
  41. return a.x > b.x;
  42. }
  43.  
  44. bool cmpy(node a, node b) {
  45. return a.y < b.y;
  46. }
  47.  
  48. int f[maxn];
  49. int idx;
  50. void add(int x, int y) { for (; x <= idx; x += lowbit(x)) f[x] += y; }
  51. int sum(int x) { int ans = ; for (; x; x -= lowbit(x)) ans += f[x]; return ans; }
  52.  
  53. int main() {
  54. int div2 = power(, mod - );
  55. cin >> n;
  56. rep(i, , n) {
  57. p[i].sc();
  58. }
  59. int ans = n;
  60. ans += 1ll*n * (n - )%mod*div2 % mod;
  61. if (ans >= mod)ans -= mod; else if (ans < )ans += mod;
  62. sort(p + , p + + n, cmpy);
  63. idx = ;
  64. for (int i = , j; i <= n; i = j + ) {
  65. for (j = i ; j < n&&p[i].y == p[j+].y; j++);
  66. ++idx;
  67. rep(k, i, j)p[k].y = idx;
  68. ans -=1ll* (j - i)*(j - i + )%mod*div2%mod;
  69. if (ans >= mod)ans -= mod; else if (ans < )ans += mod;
  70. }
  71. mmm(f, );
  72. sort(p + , p + + n, cmp);
  73. for (int i = , j; i <= n; i = j + ) {
  74. for (j = i ; j < n&&p[i].x == p[j+].x; j++);
  75. rep(k, i, j) {
  76. int t1 = sum(p[k].y - ); int t2 = i - - sum(p[k].y);
  77. ans += 1ll * t1*t2%mod;
  78. if (ans >= mod)ans -= mod; else if (ans < )ans += mod;
  79. }
  80. rep(k, i, j)add(p[k].y, );
  81. }
  82. cout << ans << endl;
  83. cin >> n;
  84. return ;
  85. }
  86.  
  87. /*
  88.  
  89. */

一开始无脑分别前后维护

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<cmath>
  3. #include<iostream>
  4. #include<stdio.h>
  5. #include<algorithm>
  6. #include<cstring>
  7. #include<stack>
  8. #include<vector>
  9. #include<string.h>
  10. #include<queue>
  11. #include<string>
  12. #include<set>
  13. using namespace std;
  14. #define rep(i,t,n) for(int i =(t);i<=(n);++i)
  15. #define per(i,n,t) for(int i =(n);i>=(t);--i)
  16. #define mmm(a,b) memset(a,b,sizeof(a))
  17. #define eps 1e-6
  18. #define pb push_back
  19. const int maxn = 1e5 + ;
  20. const int inf = 1e7 + ;//0x7fffffff; //无限大
  21. const int MOD = ;
  22. typedef long long ll;
  23. const long long mod = ;
  24. int power(int a,int b){
  25. int c=; a%=mod;
  26. while (b) {
  27. if (b&) c=1ll*c*a%mod;
  28. a=1ll*a*a%mod; b>>=;
  29. }
  30. return c;
  31. }
  32.  
  33. ll div2 = power(, mod - );
  34. struct node {
  35. int x, y;
  36. int id;
  37. void sc() { scanf("%d%d", &x, &y); }
  38. }P[maxn];
  39.  
  40. ll n;
  41. bool cmp(node a, node b) {
  42. if (a.x != b.x)
  43. return a.x < b.x;
  44. else return a.y < b.y;
  45. }
  46. bool cmpx(node a, node b) {
  47. if (a.x != b.x)
  48. return a.x > b.x;
  49. else return a.y < b.y;
  50. }
  51.  
  52. bool cmpy(node a, node b) {
  53. return a.y < b.y;
  54. }
  55. int cnt[maxn];
  56. ll l[maxn], r[maxn];
  57. int d[maxn];
  58. int lowbit(int x) { return x & (-x); }
  59. int fr[maxn], bk[maxn];
  60. void add(int x, int v) {//a[x]+=v;
  61. while (x <= maxn) {
  62. d[x] += v;
  63. x += lowbit(x);
  64. }
  65.  
  66. }
  67. int query(int x) {
  68. int res = ;
  69. while (x) {
  70. res += d[x];
  71. x -= lowbit(x);
  72. }
  73. return res;
  74. }
  75.  
  76. int main() {
  77. cin >> n;
  78. rep(i, , n) {
  79. P[i].sc();
  80. P[i].id = i;
  81. }
  82. sort(P + , P + n + , cmp);
  83.  
  84. int idx = ;
  85. int now = ;
  86. rep(i, , n) {
  87. if (P[i].x != now) {
  88. cnt[++idx]++;
  89. now = P[i].x;
  90. }
  91. else {
  92. cnt[idx]++;
  93. }
  94. }
  95. ll ans = n;
  96. ll tmp = n * (n - ) %mod*div2;
  97. rep(i, , idx)if (cnt[i] > ) { tmp = (tmp - cnt[i] * (cnt[i] - ) % mod *div2) % mod; }
  98. ans = (ans + tmp) % mod;
  99. //维护每个点左右比它高的点
  100. sort(P + , P + n + , cmpy);
  101. idx = ;
  102. now = ;
  103. rep(i, , n) {
  104. if (P[i].y != now) {
  105. P[i].y = ++idx;
  106. now = P[i].y;
  107. }
  108. else {
  109. P[i].y = idx;
  110. }
  111. }
  112. sort(P + , P + n + , cmp);
  113. now = ;
  114. rep(i, , n)
  115. {
  116. if (P[i].x != P[i - ].x)fr[i] =now= i - ;
  117. else fr[i] = now;
  118. }
  119. now = ;
  120. per(i, n, )
  121. {
  122. if (P[i].x != P[i + ].x)bk[i] = now = i + ;
  123. else bk[i] = now;
  124. }
  125. rep(i, , n) {
  126. if(P[i].x!=P[i-].x)l[i] =ll( i--query(P[i].y));
  127. else {
  128. if (P[i].y >= P[fr[i]].y || P[i].y >= P[bk[i]].y)l[i] = ;
  129. else l[i] = l[i - ];
  130. }
  131. add(P[i].y, );
  132. }
  133. mmm(d, );
  134. //sort(P + 1, P + n + 1, cmpx);
  135. int first = ;
  136. per(i, n, ) {
  137. if (P[i].x != P[i + ].x)r[i] = ll(n-i - query(P[i].y)),first=;
  138. else {
  139. if (P[i].y >= P[fr[i]].y || P[i].y >= P[bk[i]].y)r[i] = ;
  140. else {
  141. if (first)
  142. {
  143. first = ;
  144. r[i] = ll(n - i -- query(P[i].y));
  145. }
  146. else r[i] = r[i + ];
  147. }
  148. }
  149. add(P[i].y, );
  150. }
  151. tmp = ;
  152. rep(i, , n) {
  153. tmp = (tmp + l[i] * r[i] % mod) % mod;
  154. }
  155. ans = (ans + tmp) % mod;
  156. cout << ans<<endl;
  157.  
  158. //sort(P + 1, P + n + 1, cmp);
  159. rep(i, , n) {
  160. //cout << l[i] << ' ' << r[i] << endl;
  161. }
  162. cin >> n;
  163. }
  164.  
  165. /*
  166.  
  167. */

【魔改】树状数组 牛客多校第五场I vcd 几何+阅读理解的更多相关文章

  1. 牛客多校第五场 F take

    链接:https://www.nowcoder.com/acm/contest/143/F来源:牛客网 题目描述 Kanade has n boxes , the i-th box has p[i] ...

  2. 2018牛客多校第五场 H.subseq

    题意: 给出a数组的排列.求出字典序第k小的b数组的排列,满足1<=bi<=n,bi<bi+1,a[b[i]]<a[b[i+1]],m>0. 题解: 用树状数组倒着求出以 ...

  3. 牛客多校第五场 F take 期望转化成单独事件概率(模板) 树状数组

    链接:https://www.nowcoder.com/acm/contest/143/F来源:牛客网 Kanade has n boxes , the i-th box has p[i] proba ...

  4. 牛客多校第五场-D-inv

    链接:https://www.nowcoder.com/acm/contest/143/D来源:牛客网 题目描述 Kanade has an even number n and a permutati ...

  5. 牛客多校第五场 J:Plan

    链接:https://www.nowcoder.com/acm/contest/143/J 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

  6. 牛客多校第五场 E room 二分图匹配 KM算法模板

    链接:https://www.nowcoder.com/acm/contest/143/E来源:牛客网 Nowcoder University has 4n students and n dormit ...

  7. 2019牛客多校第五场 F maximum clique 1 状压dp+最大独立集

    maximum clique 1 题意 给出一个集合s,求每个子集的最大独立集的权值和(权值是独立集的点个数) 分析 n比较小,一股浓浓的暴力枚举每一个子集的感觉,但是暴力枚举模拟肯定会T,那么想一想 ...

  8. 2019牛客多校第五场H - subsequence 2 拓扑

    H - subsequence 2 题意 要你使用前\(m\)个小写字母构造一个长度为\(n\)的字符串 有\(m*(m-1)/2\)个限制条件: \(c_{1} .c_{2}. len\):表示除去 ...

  9. 牛客多校第七场H Pair 数位dp理解

    Pair 题意 给出A B C,问x取值[1,A]和y取值[1,B]存在多少组pair<x,y>满足以下最小一种条件,\(x \& y >c\),\(x\) xor \(y& ...

随机推荐

  1. Socketserver 笔记

    引入Socketserver的背景: 我们之前使用socket编程的时候,Server端创建一个连接循环(建立连接)+一个通信循环(基于一次连接建立通信循环),(这里的黏包问题我们的实现方式是:我们在 ...

  2. Vue(九):样式绑定v-bind示例

    Vue.js class class 与 style 是 HTML 元素的属性,用于设置元素的样式,我们可以用 v-bind 来设置样式属性. Vue.js v-bind 在处理 class 和 st ...

  3. Linux系统命令缩写

    命令缩写:(转) ls:list(列出目录内容) cd:Change Directory(改变目录) su:switch user 切换用户 rpm:redhat package manager 红帽 ...

  4. Linux好用的工具命令 - nl/du

    nl 添加行号后打印输出文本内容,以下例子演示了cat 和nl 输出nlDemo文档的区别. [root@ptarmiganantelope:~]# cat nlDemo root:x:0:0:roo ...

  5. 【Android】开源项目UniversalImageLoader及开源框架ImageLoader

    UniversalImageLoader 简单来说就是用于加载图片的一个开源项目,在其项目介绍中是这么写的 支持多线程图片加载 提供丰富的细节配置,比如线程池大小,HTPP请求项,内存和磁盘缓存,图片 ...

  6. 【iCore1S 双核心板_FPGA】例程五:Signal Tapll 实验——逻辑分析仪

    核心代码: //--------------------Module_Signal_TapII-------------------// module Signal_TapII( input CLK_ ...

  7. 能ping通外网的域名,浏览器不能上网的解决办法

    1,依次尝试了关闭防火墙,关闭杀毒软件,手动设置DNS都没有用. 2,最后通过这个cmd命令搞定,特此记录一下,重置初始化网络环境. netsh winsock reset 补充,上面的命令,重启电脑 ...

  8. [备份]EntityFramework

    本视频和分步演练介绍通过 Code First 开发建立新数据库.这个方案包括建立不存在的数据库(Code First 创建)或者空数据库(Code First 向它添加新表).借助 Code Fir ...

  9. PHP最全笔记(四)(值得收藏,不时翻看一下)

    // 序列化(串行化) # 数据传输均是字符串类型 # 除了资源类型,均可序列化 # 序列化在存放数据时,存放数据本身,也存放数据类型 1.在网络传输数据时:2.为了将数组或对象放在磁盘时 # 序列化 ...

  10. 如何把光盘制作成ISO镜像文件

    如何把一张光盘转换成为ISO的镜像文件呢,这需要借助软件的力量. 下面来简单的介绍下吧. 工具/原料 UltraISO软碟通软件. 光驱 方法/步骤 下载并安装UltraISO软碟通软件. 插入要做的 ...