题意:n*m的平面内有K个不安全点,Q个询问位置在(x,y)的人能走到多少个点?走到:(x,y)和(x',y')之间的矩形中不包含不安全点。

标程:

  1. #include<bits/stdc++.h>
  2. #define mid ((l+r)>>1)
  3. using namespace std;
  4. int read()
  5. {
  6. int x=,f=;char ch=getchar();
  7. while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
  8. while (ch>=''&&ch<='') x=(x<<)+(x<<)+ch-'',ch=getchar();
  9. return x*f;
  10. }
  11. const int N=;
  12. typedef long long ll;
  13. int n,m,K,Q,T_Max[N<<],tot,Max;
  14. ll ans[N],T_sum[N<<],T_suml[N<<];
  15. struct node{int x,y,id,ty;node(){} node(int a,int b,int c,int d){x=a;y=b;id=c;ty=d;}}a[N*],dg[N],q[N];
  16. bool cmp(const node &A,const node &B) {return A.x<B.x||A.x==B.x&&A.y<B.y||A.x==B.x&&A.y==B.y&&A.ty<B.ty;}//排序时||不要写成&&!
  17. ll qry_sum(int k,int l,int r,int L,int R,int &mx)//表示当前区间的右边下界为mx时的折线下面积
  18. {
  19. if (L<=l&&r<=R)
  20. {
  21. if (mx>=T_Max[k]) return (ll)mx*(r-l+);
  22. if (l==r) return mx=T_Max[k];
  23. int tt=T_Max[k<<|]; ll res=;
  24. if (mx>=tt)
  25. {
  26. res+=(ll)mx*(r-mid);//mx会被修改,注意统计顺序!
  27. res+=qry_sum(k<<,l,mid,L,R,mx);
  28. }else {
  29. res+=T_suml[k];
  30. res+=qry_sum(k<<|,mid+,r,L,R,mx);
  31. }
  32. mx=T_Max[k]; return res;
  33. }
  34. ll s=;
  35. if (R>mid) s+=qry_sum(k<<|,mid+,r,L,R,mx);//先走右边,更新下界
  36. if (L<=mid) s+=qry_sum(k<<,l,mid,L,R,mx);
  37. return s;
  38. }
  39. void ins(int k,int l,int r,int x,int y)
  40. {
  41. if (l==r)
  42. {
  43. if (y>T_Max[k]) T_Max[k]=T_sum[k]=y;
  44. return;
  45. }
  46. if (x<=mid) ins(k<<,l,mid,x,y);else ins(k<<|,mid+,r,x,y);
  47. int tt=T_Max[k<<|];
  48. T_suml[k]=qry_sum(k<<,l,mid,l,mid,tt);//注意如果直接传入T_Max[k<<1|1]的话,在&下会被修改。
  49. T_Max[k]=max(T_Max[k<<],T_Max[k<<|]);
  50. T_sum[k]=T_suml[k]+T_sum[k<<|];
  51. }
  52. void work()
  53. {
  54. tot=;
  55. for (int i=;i<=K;i++) a[++tot]=node(dg[i].x,dg[i].y,i,);
  56. for (int i=;i<=Q;i++) a[++tot]=node(q[i].x,q[i].y,i,);
  57. sort(a+,a+tot+,cmp);
  58. for (int i=;i<=tot;i++)
  59. {
  60. if (!a[i].ty) ins(,,m,a[i].y,a[i].x);
  61. else {
  62. Max=;ans[a[i].id]+=qry_sum(,,m,,a[i].y,Max);//二维数点
  63. Max=;ans[a[i].id]-=qry_sum(,,m,a[i].y,a[i].y,Max);//减去重复的一条同行/同列轴
  64. }
  65. }
  66. }
  67. int main()
  68. {
  69. int T=read();
  70. while (T--)
  71. {
  72. n=read();m=read();K=read();Q=read();
  73. for (int i=;i<=K;i++) dg[i].x=read(),dg[i].y=read();
  74. for (int i=;i<=Q;i++) q[i].x=read(),q[i].y=read(),ans[i]=;//组测清零
  75. for (int i=;i<;i++)
  76. {
  77. work();
  78. for (int i=;i<=(m<<);i++) T_sum[i]=T_suml[i]=T_Max[i]=;
  79. for (int j=;j<=K;j++) dg[j].x=n-dg[j].x+,swap(dg[j].x,dg[j].y);//90度旋转坐标
  80. for (int j=;j<=Q;j++) q[j].x=n-q[j].x+,swap(q[j].x,q[j].y);
  81. swap(n,m);
  82. }
  83. for (int i=;i<=Q;i++) printf("%lld\n",(ll)n*m-ans[i]);
  84. }
  85. return ;
  86. }

题解:李超树

就是为了此神题才去学习了一下李超树。

以x坐标的移动来看可以到达的点的范围,从起点轴向两边形成不规则菱形。

分四块讨论,以左下角为例,线段树上的点为y坐标,维护递减折线。左区间的高度要大于等于右区间,所以更新的时候要把右区间的高度也维护进左区间。求折线下面积和的时候,维护一个右方高度下界,先统计右区间再统计左区间。

hdu6089 Rikka with Terrorist的更多相关文章

  1. 【hdu 6089】Rikka with Terrorist

    题意 有一个 \(n\times m\) 的二维网格,其中有 \(k\) 个禁止点. 有 \(q\) 组询问,每组询问为给一个点,求有多少个矩形以这个点为一角且不包含禁止点. \(n,m,k,q\le ...

  2. HDU 6089 Rikka with Terrorist (线段树)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6089 题解 这波强行维护搞得我很懵逼... 扫描线,只考虑每个点能走到左上方(不包括正上方,但包括正左 ...

  3. 2016暑假多校联合---Rikka with Sequence (线段树)

    2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...

  4. hdu.5203.Rikka with wood sticks(数学推导:一条长度为L的线段经分割后可以构成几种三角形)

    Rikka with wood sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/O ...

  5. hdu.5202.Rikka with string(贪心)

    Rikka with string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  6. 树形DP 2013多校8(Terrorist’s destroy HDU4679)

    题意: There is a city which is built like a tree.A terrorist wants to destroy the city's roads. But no ...

  7. HDU 5831 Rikka with Parenthesis II(六花与括号II)

    31 Rikka with Parenthesis II (六花与括号II) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536 ...

  8. HUD5423 Rikka with Tree(DFS)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5423 Rikka with Tree Time Limit: 2000/1000 MS (Java/O ...

  9. HDU 5422 Rikka with Graph

    Rikka with Graph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

随机推荐

  1. apach hadoop2.6 集群利用Phoenix 4.6-hbase 批量导入并自动创建索引

    基础环境: 1.安装apach 版本hadoop2.6 2.部署hbase1.0.0 3.下载phoenix-4.6.0-HBase-1.0.下载地址(http://mirror.nus.edu.sg ...

  2. org.apache.hadoop.hbase.master.HMasterCommandLine: Master exiting java.lang.RuntimeException: HMaster Aborted

    前一篇的问题解决了,是 hbase 下面lib 包的jar问题,之前写MR的时候加错了包,替换掉了原来的包后出现另一问题:@ubuntu:/home/hadoop/hbase-0.94.6-cdh4. ...

  3. Alice's Classified Message HDU - 5558 后缀自动机求某个后缀出现的最早位置

    题意: 给定一个长度不超过 10W 的只包含小写字母的字符串,从下标 0 到 n−1.从下标 0 开始操作, 每次对于下标 pos查找下标 pos 开始的子串中最长的在其他地方出现过的长度,其他出现的 ...

  4. SDL系列之 - 用画直线的方法来画正弦曲线

    线段长度无限短后就成为点,所以,现在让我们用画直线的方法来画正弦曲线吧 #include <SDL.h> #include <stdlib.h> #include <st ...

  5. shell脚本输出九九乘法表

    #!/bin/bash#输出九九乘法表 for ((i=1;i<=9;i++)) do for ((j=1;j<=$i;j++)) do echo -n $j'x'$i=$(($i*$j) ...

  6. RHEL5/6/7中常用命令及命令之间的差异

    System basics Task RHEL5 RHEL6 RHEL7 View subscription information /etc/sysconfig/rhn/systemid /etc/ ...

  7. Android 防止切换横屏闪退

    <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="ht ...

  8. Dart编程数字Number

    Dart数字可以分为: int - 任意大小的整数. int 数据类型用于表示整数. double -64位(双精度)浮点数,由IEEE 754标准规定. 在 double 数据类型用于表示小数 in ...

  9. php面向对象深入理解(二)

    一个简单的小程序:   配置 config.ini <?php //项目的根目录 define("ROOT","F:/文件夹的名字/oop/"); //数 ...

  10. javascript中内置函数

    一.基本函数库 split():用于把一个字符串分割成字符串数组 toUpperCase(): substr(): 长度 length() 拼接(两种) + concat():合并多个字符串,并返回合 ...