题意: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. Spring-boot整合Redis,遇到的问题

    1.通过set进redis中的数据,get不到 String cityKey ="city_"+id; ValueOperations<String,City> ope ...

  2. (Struts2学习系列五)Struts2默认action

    当我们访问项目下一个不存在的Action的时候,页面就会报错,404找不到资源,这样对用户来说是非常不友好的,所以我们设置一个默认的Action,当找不到对应Action的时候,就会跳转到默认Acti ...

  3. WordTEX

    https://www.andrew.cmu.edu/user/twildenh/wordtex/

  4. 杭电多校第一场-B-Operation

    题目描述 There is an integer sequence a of length n and there are two kinds of operations:0 l r: select ...

  5. boost asio acceptor 构造

    boost::asio::io_service io_svc; boost::asio::ip::address_v4 lis_ip; // 默认监听本机所有IP boost::asio::ip::t ...

  6. vue之自定义指令

    1.自定义指令的作用 除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令.注意,在 Vue2.0 中,代码复用和抽象的主要形式是组件.然而,有的情况下,你仍 ...

  7. selenium提取不了标签文本

    1.举个例子:selenium使用driver.find_element_by_xpath().text 提取不到标签文本?? 如果我们提取的元素文本为空时,而不是我们想要的文本时,这时可能就是因为你 ...

  8. 打开桌面上的图标就会弹出"打开些文件可能会对您的计算机有害"解决方案

    问题截图 方案步骤 运行 gpedit.msc 用户配置--管理模板--windows组件--附件管理器 找到中等危险文件类型抱含列表后右键-编辑 在指定中等风险扩展名中加入你文件的扩展名 应用, 确 ...

  9. Jmeter-【beanshell处理器】-获取时间

    一.通过操作变量

  10. Java分页查询工具类

    public class PageList<T> { private int totalpage; //总页数 private int totalcount; //总记录数 private ...