题意: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的更多相关文章

  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. JUC源码分析-集合篇:并发类容器介绍

    JUC源码分析-集合篇:并发类容器介绍 同步类容器是 线程安全 的,如 Vector.HashTable 等容器的同步功能都是由 Collections.synchronizedMap 等工厂方法去创 ...

  2. CM 安装cdh 版本及出现问题

    添加节点: 安装完cdh 后jps出现:process information unavailable 解决办法:

  3. 一分钟开启Tomcat https支持

    1.修改配置文件 打开tomcat/conf/server.xml配置文件,把下面这段配置注释取消掉,keystorePass为证书密钥需要手动添加,创建证书时指定的. <Connector p ...

  4. string中的stringstream

    博客: 加速:ios::sync_with_stdio(false); 举个例子: 題目:输入的第一行有一个数字 N 代表接下來有 N 行资料,每一行资料里有不固定个数的整数(最多20个,每行最大20 ...

  5. JS 将对象转换成字符 字符串转换成json对象

    //js对象 var user = { "name": "张学友", "address": "中国香港" }; //将对 ...

  6. springboot + zipkin(brave-okhttp实现)

    一.前提 1.zipkin基本知识:附8 zipkin 2.启动zipkin server: 2.1.在官网下载服务jar,http://zipkin.io/pages/quickstart.html ...

  7. CSS标准的书写顺序

  8. H5新增input表单、表单属性

    新增表单 email,Email类型 url , Url类型 date,日期类型 time,时间类型 month,月类型 week,周类型 number,数字类型 tel,电话类型 search,搜索 ...

  9. tomcat之redis

    Nginx服务器:[root@nginx ~]# vim /usr/local/nginx/conf/nginx.confupstream tomcat_pool { server 192.168.2 ...

  10. tf.matmul() 和tf.multiply() 的区别

    1.tf.multiply()两个矩阵中对应元素各自相乘 格式: tf.multiply(x, y, name=None) 参数: x: 一个类型为:half, float32, float64, u ...