【题目大意】

给出平面上$n$个点$(x_i, y_i)$,请选择一个不在这$n$个点之内的点$(X, Y)$,定义$(X, Y)$的价值为往上下左右四个方向射出去直线,经过$n$个点中的数量的最小值。

Task 1: 求价值最大的点

Task 2: 求价值最大的点的个数

保证Task 1和Task 2各占50pts。

对于30%的数据,$n \leq 200$;

对于60%的数据,$n \leq 5000$;

对于100%的数据,$n \leq 300000$。

每档数据中,50%保证$1 \leq x_i, y_i \leq n$;50%保证$1 \leq x_i, y_i \leq 10^9$。

【题解】

考场写了60分暴力。。签到题不会打系列。

回家路上认真想了想,离散后把每个位置用vector存起来。

二分答案$x$,那么得到的就是若干合法区间(有横的也有竖的),那么一个点只要被一横一竖两个区间同时经过,就有1的贡献,先不考虑$(X, Y)$在$n$个点中的情况,那么这样就能用扫描线+BIT解决了。

预处理出来对于关键点的贡献,统计的时候减去即可。

复杂度$O(nlog^2n)$。

Orz YangPKU

  1. # include <vector>
  2. # include <stdio.h>
  3. # include <assert.h>
  4. # include <string.h>
  5. # include <iostream>
  6. # include <algorithm>
  7. // # include <bits/stdc++.h>
  8.  
  9. using namespace std;
  10.  
  11. typedef long long ll;
  12. typedef long double ld;
  13. typedef unsigned long long ull;
  14. const int M = 3e5 + ;
  15. const int mod = 1e9+;
  16.  
  17. inline int getint() {
  18. int x = ; char ch = getchar();
  19. while(!isdigit(ch)) ch = getchar();
  20. while(isdigit(ch)) x = (x<<) + (x<<) + ch - '', ch = getchar();
  21. return x;
  22. }
  23.  
  24. int n, x[M], y[M], X, Y, ori[M];
  25. vector<int> psa, psb;
  26. vector<int> vx[M], vy[M]; int xlen[M], ylen[M];
  27.  
  28. struct option {
  29. int op, x, yl, yr, del;
  30. option() {}
  31. option(int op, int x, int yl, int yr, int del = ) : op(op), x(x), yl(yl), yr(yr), del(del) {}
  32. friend bool operator < (option a, option b) {
  33. return a.x < b.x || (a.x == b.x && a.op < b.op);
  34. }
  35. }o[M * ]; int on;
  36.  
  37. struct BIT {
  38. # define lb(x) (x&(-x))
  39. ll c[M]; int n;
  40. inline void set(int _n) {
  41. n = _n; memset(c, , sizeof c);
  42. }
  43. inline void edt(int x, int d) {
  44. for (; x<=n; x+=lb(x)) c[x] += d;
  45. }
  46. inline ll sum(int x) {
  47. ll ret = ;
  48. for (; x; x-=lb(x)) ret += c[x];
  49. return ret;
  50. }
  51. inline ll sum(int x, int y) {
  52. if(x > y) return ;
  53. return sum(y) - sum(x-);
  54. }
  55. # undef lb
  56. }T;
  57.  
  58. inline ll chk(int x) {
  59. ll ans = ;
  60. on = ;
  61. for (int i=, l, r; i<=X; ++i) {
  62. if(xlen[i] >= x + x) {
  63. l = vx[i][x-] + , r = vx[i][xlen[i]-x] - ;
  64. o[++on] = option(, i, l, r);
  65. }
  66. }
  67. for (int i=, l, r; i<=Y; ++i) {
  68. if(ylen[i] >= x + x) {
  69. l = vy[i][x-] + , r = vy[i][ylen[i]-x] - ;
  70. o[++on] = option(, l, i, i, );
  71. o[++on] = option(, r+, i, i, -);
  72. }
  73. }
  74. sort(o+, o+on+);
  75. for (int i=; i<=on; ++i) {
  76. if(o[i].op == ) T.edt(o[i].yl, o[i].del);
  77. else ans += T.sum(o[i].yl, o[i].yr);
  78. }
  79. for (int i=; i<=n; ++i) ans -= (ori[i] >= x);
  80. return ans;
  81. }
  82.  
  83. int main() {
  84. int type;
  85. n = getint(); type = getint();
  86. for (int i=; i<=n; ++i) psa.push_back(x[i] = getint()), psb.push_back(y[i] = getint());
  87. sort(psa.begin(), psa.end()); psa.erase(unique(psa.begin(), psa.end()), psa.end()); X = psa.size();
  88. sort(psb.begin(), psb.end()); psb.erase(unique(psb.begin(), psb.end()), psb.end()); Y = psb.size();
  89. for (int i=; i<=n; ++i) x[i] = lower_bound(psa.begin(), psa.end(), x[i]) - psa.begin() + , y[i] = lower_bound(psb.begin(), psb.end(), y[i]) - psb.begin() + ;
  90. for (int i=; i<=n; ++i) vx[x[i]].push_back(y[i]), vy[y[i]].push_back(x[i]);
  91. for (int i=; i<=X; ++i) {
  92. sort(vx[i].begin(), vx[i].end());
  93. xlen[i] = vx[i].size();
  94. }
  95. for (int i=; i<=Y; ++i) {
  96. sort(vy[i].begin(), vy[i].end());
  97. ylen[i] = vy[i].size();
  98. }
  99. for (int i=, xid, yid; i<=n; ++i) {
  100. xid = lower_bound(vy[y[i]].begin(), vy[y[i]].end(), x[i]) - vy[y[i]].begin();
  101. yid = lower_bound(vx[x[i]].begin(), vx[x[i]].end(), y[i]) - vx[x[i]].begin();
  102. ori[i] = min(min(xid, ylen[y[i]]-xid-), min(yid, xlen[x[i]]-yid-));
  103. }
  104. int l = , r = n/, mid, ans = -; T.set(Y); ll t;
  105. while() {
  106. if(r - l <= ) {
  107. for (int i=r; i>=l; --i) {
  108. if(t = chk(i)) {
  109. ans = i;
  110. break;
  111. }
  112. }
  113. break;
  114. }
  115. mid = l+r>>;
  116. if(chk(mid)) l = mid;
  117. else r = mid;
  118. }
  119. assert(ans != -);
  120. if(type == ) printf("%d\n", ans);
  121. else printf("%lld\n", t);
  122. return ;
  123. }

省队集训 Day3 杨北大的更多相关文章

  1. 省队集训Day3 light

    [问题描述] “若是万一琪露诺(俗称 rhl)进行攻击,什么都好,冷静地回答她的问题来吸引她.对方表现出兴趣的话,那就慢慢地反问.在她考虑答案的时候,趁机逃吧.就算是很简单的问题,她一定也答不上来.” ...

  2. 省队集训Day3 tree

    [题目描述] RHL 有一天看到 lmc 在玩一个游戏. “愚蠢的人类哟,what are you doing”,RHL 说. “我在玩一个游戏.现在这里有一个有 n 个结点的有根树,其中有 m 个叶 ...

  3. bzoj4171 or 省队集训day3 chess: Rhl的游戏

    [题目描述] RHL最近迷上一个小游戏:Flip it.游戏的规则很简单,在一个N*M的格子上,有一些格子是黑色,有一些是白色.每选择一个格子按一次,格子以及周围边相邻的格子都会翻转颜色(边相邻指至少 ...

  4. FJ省队集训DAY3 T2

    思路:如果一个DAG要的路径上只要一条边去切掉,那么要怎么求?很容易就想到最小割,但是如果直接做最小割会走出重复的部分,那我们就这样:反向边设为inf,这样最小割的时候就不会割到了,判断无解我们直接用 ...

  5. FJ省队集训DAY3 T1

    思路:我们考虑如果取掉一个部分,那么能影响到最优解的只有离它最近的那两个部分. 因此我们考虑堆维护最小的部分,离散化离散掉区间,然后用线段树维护区间有没有雪,最后用平衡树在线段的左右端点上面维护最小的 ...

  6. 省队集训 Day3 吴清华

    [题目大意] 给网格图,共有$n * n$个关键节点,横向.纵向距离均为$d$,那么网格总长度和宽度均为$(n+1) * d + 1$,最外围一圈除了四角是终止节点.要求每个关键节点都要通过线连向终止 ...

  7. 省队集训 Day3 陈姚班

    [题目大意] 给一张网格图,上往下有流量限制,下往上没有,左往右有流量限制. $n * m \leq 2.5 * 10^6$ [题解] 考场直接上最大流,50分.竟然傻逼没看出狼抓兔子. 平面图转对偶 ...

  8. JS省队集训记

    不知不觉省队集训已经结束,离noi也越来越近了呢 论考前实战训练的重要性,让我随便总结一下这几天的考试 Day 1 T1 唉,感觉跟xj测试很像啊?meet in middle,不过这种题不多测是什么 ...

  9. HN2018省队集训

    HN2018省队集训 Day1 今天的题目来自于雅礼的高二学长\(dy0607\). 压缩包下载 密码: 27n7 流水账 震惊!穿着该校校服竟然在四大名校畅通无阻?霸主地位已定? \(7:10\)从 ...

随机推荐

  1. 【IdentityServer4文档】- 贡献

    贡献 我们非常乐于接受社区贡献,但您应遵循一些指导原则,以便我们可以很方便的解决这个问题. 如何贡献? 最简单的方法是打开一个问题并开始讨论.然后,我们可以决定如何实现一个特性或一个变更.如果您即将提 ...

  2. python模拟SQL语句操作文件

    1.需求 在文本界面输入SQL语句,查询相应的数据,例如输入下面的语句 print(''' 支持大小写的SQL语句查询,大写或者小写都可以 1. select * from db1.emp 2. se ...

  3. JavaScript数组自定义属性

    我们可以以json键值对的形式自定义属性. 首先定义一个JS数组JSarray. 然后按json键值对的形式进行赋值. 最后在控制台显示结果. 代码如下: var JSarray = new Arra ...

  4. mini2440 Nor Flash工作原理分析

    我的mini2440上是只接了一块Nor Flash,型号是S29AL016M90TAI02,这是一块2M Byte,16位宽度的Nor Flash,用于引导扇区的闪存.原理图里面关键的引脚是: 地址 ...

  5. Vue脚手架开发使用sass

    vue默认采用的是原生的css,如果想要使用css预编译工具,比如sass,需要下载对应的scss的loader, 具体是 npm install --save-dev sass-loader npm ...

  6. Android 多屏幕适配 dp和px的关系 最好用dp

    Android 多屏幕适配 dp和px的关系 一直以来别人经常问我,android的多屏幕适配到底是怎么弄,我也不知道如何讲解清楚,或许自己也是挺迷糊. 以下得出的结论主要是结合官方文档进行分析的ht ...

  7. Windows 8.1 SecureBoot未正确配置的解决方法

    使用联想Y510P,安装win8.1后破解 ,屏幕右下角老是显示 SecureBoot未正确配置的解决方法,以下是解决方案 步骤1:在机器重启至“Lenovo字样的屏幕”时,不停敲击“F2”键或“Fn ...

  8. BZOJ 1263 整数划分(数学+高精度)

    我们不妨考虑可以划分为实数的情况,设划分为x份实数,使得总乘积最大. 易得当每一份都相等时乘积最大.即 ans=(n/x)^x. 现在只需要求出这个函数取得最大值的时候x的取值了. 两边取对数,则有l ...

  9. javascript中检测一个变量的类型

    /** * 怎么检测一个变量的类型? * 在js中检测对象类型主要有三种:typeof, instanceof, constructor, 这几种都可以检测对象的类型. * 另外还可以适应jQuery ...

  10. Jquery常用正则验证

    常用校验的正则表达式var rulesConfig = { /** * str.replace(/^\s+|\s+$/g, '') 解析: str:要替换的字符串 \s : 表示 space ,空格 ...