hdu6089 Rikka with Terrorist
题意:n*m的平面内有K个不安全点,Q个询问位置在(x,y)的人能走到多少个点?走到:(x,y)和(x',y')之间的矩形中不包含不安全点。
标程:
- #include<bits/stdc++.h>
- #define mid ((l+r)>>1)
- using namespace std;
- int read()
- {
- int x=,f=;char ch=getchar();
- while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
- while (ch>=''&&ch<='') x=(x<<)+(x<<)+ch-'',ch=getchar();
- return x*f;
- }
- const int N=;
- typedef long long ll;
- int n,m,K,Q,T_Max[N<<],tot,Max;
- ll ans[N],T_sum[N<<],T_suml[N<<];
- 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];
- 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;}//排序时||不要写成&&!
- ll qry_sum(int k,int l,int r,int L,int R,int &mx)//表示当前区间的右边下界为mx时的折线下面积
- {
- if (L<=l&&r<=R)
- {
- if (mx>=T_Max[k]) return (ll)mx*(r-l+);
- if (l==r) return mx=T_Max[k];
- int tt=T_Max[k<<|]; ll res=;
- if (mx>=tt)
- {
- res+=(ll)mx*(r-mid);//mx会被修改,注意统计顺序!
- res+=qry_sum(k<<,l,mid,L,R,mx);
- }else {
- res+=T_suml[k];
- res+=qry_sum(k<<|,mid+,r,L,R,mx);
- }
- mx=T_Max[k]; return res;
- }
- ll s=;
- if (R>mid) s+=qry_sum(k<<|,mid+,r,L,R,mx);//先走右边,更新下界
- if (L<=mid) s+=qry_sum(k<<,l,mid,L,R,mx);
- return s;
- }
- void ins(int k,int l,int r,int x,int y)
- {
- if (l==r)
- {
- if (y>T_Max[k]) T_Max[k]=T_sum[k]=y;
- return;
- }
- if (x<=mid) ins(k<<,l,mid,x,y);else ins(k<<|,mid+,r,x,y);
- int tt=T_Max[k<<|];
- T_suml[k]=qry_sum(k<<,l,mid,l,mid,tt);//注意如果直接传入T_Max[k<<1|1]的话,在&下会被修改。
- T_Max[k]=max(T_Max[k<<],T_Max[k<<|]);
- T_sum[k]=T_suml[k]+T_sum[k<<|];
- }
- void work()
- {
- tot=;
- for (int i=;i<=K;i++) a[++tot]=node(dg[i].x,dg[i].y,i,);
- for (int i=;i<=Q;i++) a[++tot]=node(q[i].x,q[i].y,i,);
- sort(a+,a+tot+,cmp);
- for (int i=;i<=tot;i++)
- {
- if (!a[i].ty) ins(,,m,a[i].y,a[i].x);
- else {
- Max=;ans[a[i].id]+=qry_sum(,,m,,a[i].y,Max);//二维数点
- Max=;ans[a[i].id]-=qry_sum(,,m,a[i].y,a[i].y,Max);//减去重复的一条同行/同列轴
- }
- }
- }
- int main()
- {
- int T=read();
- while (T--)
- {
- n=read();m=read();K=read();Q=read();
- for (int i=;i<=K;i++) dg[i].x=read(),dg[i].y=read();
- for (int i=;i<=Q;i++) q[i].x=read(),q[i].y=read(),ans[i]=;//组测清零
- for (int i=;i<;i++)
- {
- work();
- for (int i=;i<=(m<<);i++) T_sum[i]=T_suml[i]=T_Max[i]=;
- for (int j=;j<=K;j++) dg[j].x=n-dg[j].x+,swap(dg[j].x,dg[j].y);//90度旋转坐标
- for (int j=;j<=Q;j++) q[j].x=n-q[j].x+,swap(q[j].x,q[j].y);
- swap(n,m);
- }
- for (int i=;i<=Q;i++) printf("%lld\n",(ll)n*m-ans[i]);
- }
- return ;
- }
题解:李超树
就是为了此神题才去学习了一下李超树。
以x坐标的移动来看可以到达的点的范围,从起点轴向两边形成不规则菱形。
分四块讨论,以左下角为例,线段树上的点为y坐标,维护递减折线。左区间的高度要大于等于右区间,所以更新的时候要把右区间的高度也维护进左区间。求折线下面积和的时候,维护一个右方高度下界,先统计右区间再统计左区间。
hdu6089 Rikka with Terrorist的更多相关文章
- 【hdu 6089】Rikka with Terrorist
题意 有一个 \(n\times m\) 的二维网格,其中有 \(k\) 个禁止点. 有 \(q\) 组询问,每组询问为给一个点,求有多少个矩形以这个点为一角且不包含禁止点. \(n,m,k,q\le ...
- HDU 6089 Rikka with Terrorist (线段树)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6089 题解 这波强行维护搞得我很懵逼... 扫描线,只考虑每个点能走到左上方(不包括正上方,但包括正左 ...
- 2016暑假多校联合---Rikka with Sequence (线段树)
2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...
- 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 ...
- hdu.5202.Rikka with string(贪心)
Rikka with string Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- 树形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 ...
- HDU 5831 Rikka with Parenthesis II(六花与括号II)
31 Rikka with Parenthesis II (六花与括号II) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536 ...
- HUD5423 Rikka with Tree(DFS)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5423 Rikka with Tree Time Limit: 2000/1000 MS (Java/O ...
- HDU 5422 Rikka with Graph
Rikka with Graph Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
随机推荐
- 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 ...
- 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. ...
- Alice's Classified Message HDU - 5558 后缀自动机求某个后缀出现的最早位置
题意: 给定一个长度不超过 10W 的只包含小写字母的字符串,从下标 0 到 n−1.从下标 0 开始操作, 每次对于下标 pos查找下标 pos 开始的子串中最长的在其他地方出现过的长度,其他出现的 ...
- SDL系列之 - 用画直线的方法来画正弦曲线
线段长度无限短后就成为点,所以,现在让我们用画直线的方法来画正弦曲线吧 #include <SDL.h> #include <stdlib.h> #include <st ...
- shell脚本输出九九乘法表
#!/bin/bash#输出九九乘法表 for ((i=1;i<=9;i++)) do for ((j=1;j<=$i;j++)) do echo -n $j'x'$i=$(($i*$j) ...
- RHEL5/6/7中常用命令及命令之间的差异
System basics Task RHEL5 RHEL6 RHEL7 View subscription information /etc/sysconfig/rhn/systemid /etc/ ...
- Android 防止切换横屏闪退
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="ht ...
- Dart编程数字Number
Dart数字可以分为: int - 任意大小的整数. int 数据类型用于表示整数. double -64位(双精度)浮点数,由IEEE 754标准规定. 在 double 数据类型用于表示小数 in ...
- php面向对象深入理解(二)
一个简单的小程序: 配置 config.ini <?php //项目的根目录 define("ROOT","F:/文件夹的名字/oop/"); //数 ...
- javascript中内置函数
一.基本函数库 split():用于把一个字符串分割成字符串数组 toUpperCase(): substr(): 长度 length() 拼接(两种) + concat():合并多个字符串,并返回合 ...