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) ...
随机推荐
- HBase1.0.0 实现数据增删查
HBase1.0.0 即Hadoop 2.6 采用maven 的方式实现HBase数据简单操作 import java.io.IOException; import java.util.ArrayLi ...
- Rsync 恢复 libselinux.SO.1
libselinux.SO.1 这个文件对 CentOS 7很重要, 误删掉后,会导致很多命令无法使用(比如yum ,rpm 命令),利用rsync这个工具来修复. 服务端执行如下配置:(选取正常 ...
- 第一周 Largest Rectangle in a Histogram
Language: 题目: Largest Rectangle in a Histogram Time Limit: 1000MS Memory Limit: 65536K Total Submi ...
- 调用U9的标准接口
- ARM 寄存器 和 工作模式了解
一. ARM 工作模式 1. ARM7,ARM9,ARM11,处理器有 7 种工作模式:Cortex-A 多了一个监视模式(Monitor) 2. 用户模式:非特权模式,大部分任务执行在这种模式 ...
- 笔记-ubuntu中/home下中文目录改英文
安装ubuntu后,如果选择的语言是中文,那/home下的文件夹会默认中文,在使用命令行的时候很不方便,此文记录切换成英文的方式,以便日后查看. 将目录重命名为英文 可以使用图形化界面,直接重命名 可 ...
- leetcood学习笔记-118-杨辉三角
题目描述: 第一次提交: class Solution: def generate(self, numRows: int): l = [] for i in range(numRows): n = [ ...
- "\r\n"与"</br>"的区别
\n是换行,英文是New line,表示使光标到行首 \r是回车,英文是Carriage return,表示使光标下移一格 \r\n表示回车换行 \\ 反斜杠 \$ 美圆符 \" 双引 ...
- NX二次开发-UFUN获取系统相关信息UF_ask_system_info
NX9+VS2012 #include <uf.h> UF_initialize(); UF_system_info_t Info; UF_ask_system_info(&Inf ...
- NX二次开发-NX11创建表达式组NXOpen::ExpressionGroup
NX11+VS2013 #include <uf.h> #include <uf_modl.h> #include <uf_part.h> #include < ...