BZOJ2652 : 三角板
首先旋转坐标系,假设$(x,y)$被$(X,Y)$遮挡等价于$X\leq x$且$Y\leq y$。
对于每种坐标系建立两棵线段树:
第一棵按$x$维护已经加入的点的$y$的最小值;
第二棵按$x$维护看得见的点的$y$的最大值。
对于一块三角板,通过第一棵线段树查询即可知道是否可以放下,然后在第二棵线段树中不断找到被遮挡的点并删除。
时间复杂度$O(n\log n)$。
#include<cstdio>
#include<algorithm>
typedef long long ll;
using namespace std;
typedef pair<ll,int>P;
const int N=100010,M=262150;
const ll inf=1LL<<60;
int n,i,x,y,ans;char ch[5],f[N];ll a[N];
inline bool cmp(int x,int y){return a[x]<a[y];}
struct DS{
ll a[N],b[N],A,B,C,D,mi[M];P ma[M];
int c[N],rk[N],st[N],en[N],pos[N];
void init(ll _A,ll _B,ll _C,ll _D){A=_A,B=_B,C=_C,D=_D;}
inline void build(int x,int a,int b){
mi[x]=inf,ma[x]=P(-inf,0);
if(a==b){pos[a]=x;return;}
int mid=(a+b)>>1;
build(x<<1,a,mid),build(x<<1|1,mid+1,b);
}
inline void changemi(int x,ll a){for(x=pos[x];x;x>>=1)mi[x]=min(mi[x],a);}
inline void changema(int x,P b){
ma[x=pos[x]]=b;
for(x>>=1;x;x>>=1)ma[x]=max(ma[x<<1],ma[x<<1|1]);
}
ll askmi(int x,int a,int b,int c,int d){
if(c<=a&&b<=d)return mi[x];
int mid=(a+b)>>1;ll t=inf;
if(c<=mid)t=askmi(x<<1,a,mid,c,d);
if(d>mid)t=min(t,askmi(x<<1|1,mid+1,b,c,d));
return t;
}
P askma(int x,int a,int b,int c,int d){
if(c<=a&&b<=d)return ma[x];
int mid=(a+b)>>1;P t=P(-inf,0);
if(c<=mid)t=askma(x<<1,a,mid,c,d);
if(d>mid)t=max(t,askma(x<<1|1,mid+1,b,c,d));
return t;
}
inline void set(int i,int x,int y){
a[i]=A*x+B*y;
b[i]=C*x+D*y;
c[i]=i;
}
void pre(){
int i,j,k;
for(i=1;i<=n;i++)::a[i]=a[i];
sort(c+1,c+n+1,cmp);
for(i=1;i<=n;i++)rk[c[i]]=i;
for(i=1;i<=n;i=j){
for(j=i;j<=n&&a[c[i]]==a[c[j]];j++);
for(k=i;k<j;k++)st[c[k]]=i,en[c[k]]=j-1;
}
build(1,1,n);
}
inline bool check(int i){return askmi(1,1,n,1,en[i])>b[i];}
}T[2];
inline void del(int o,int x){
while(1){
P t=T[o].askma(1,1,n,T[o].st[x],n);
if(t.first<T[o].b[i])return;
ans--;
T[0].changema(T[0].rk[t.second],P(-inf,0));
T[1].changema(T[1].rk[t.second],P(-inf,0));
}
}
inline void read(int&a){
char c;bool f=0;a=0;
while(!((((c=getchar())>='0')&&(c<='9'))||(c=='-')));
if(c!='-')a=c-'0';else f=1;
while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';
if(f)a=-a;
}
int main(){
T[0].init(2,-1,-2,-1);
T[1].init(1,-1,-1,-1);
read(n);
for(i=1;i<=n;i++){
read(x),read(y);
scanf("%s",ch);
f[i]=ch[0]=='W';
T[0].set(i,x,y);
T[1].set(i,x,y);
}
T[0].pre();
T[1].pre();
for(i=1;i<=n;i++)if(T[0].check(i)&&T[1].check(i)){
del(f[i],i);
T[f[i]].changemi(T[f[i]].rk[i],T[f[i]].b[i]);
T[0].changema(T[0].rk[i],P(T[0].b[i],i));
T[1].changema(T[1].rk[i],P(T[1].b[i],i));
ans++;
printf("%d\n",ans);
}else puts("FAIL");
return 0;
}
BZOJ2652 : 三角板的更多相关文章
- iOS——Core Animation 知识摘抄(四)
原文地址http://www.cocoachina.com/ios/20150106/10840.html 延迟解压 一旦图片文件被加载就必须要进行解码,解码过程是一个相当复杂的任务,需要消耗非常长的 ...
- 在word中做复选框打对勾钩
在word中做复选框打对勾钩 现在终于搞明白正确的操作方法 一.你在word里输入2610,按alt+X就能出 空checkbox 你在word里输入2611,按alt+X就能出 打了勾的checkb ...
- CorAnimation7-高效绘图、图像IO以及图层性能
高效绘图 软件绘图 术语绘图通常在Core Animation的上下文中指代软件绘图(意即:不由GPU协助的绘图).在iOS中,软件绘图通常是由Core Graphics框架完成来完成.但是,在一些必 ...
- CoreAnimation6-基于定时器的动画和性能调优
基于定时器的动画 定时帧 动画看起来是用来显示一段连续的运动过程,但实际上当在固定位置上展示像素的时候并不能做到这一点.一般来说这种显示都无法做到连续的移动,能做的仅仅是足够快地展示一系列静态图片,只 ...
- 【转】iOS-Core-Animation-Advanced-Techniques(六)
原文:http://www.cocoachina.com/ios/20150106/10839.html 基于定时器的动画和性能调优 基于定时器的动画 我可以指导你,但是你必须按照我说的做. -- 骇 ...
- 【转】 iOS-Core-Animation-Advanced-Techniques(七)
高效绘图.图像IO以及图层性能 高效绘图 原文:http://www.cocoachina.com/ios/20150106/10840.html 不必要的效率考虑往往是性能问题的万恶之源. ——Wi ...
- 同事的Excel中的图片突然不能选择
今天上午,同事突然说自己用的Excel不能编辑了,发来一看原来是其中做的图片不能编辑,鼠标放上去后显示个圆圈选不中. 在“视图”中调出“控件工具箱”工具栏,上面有一个三角板与直尺样子的按钮叫“设计模式 ...
- [iOS Animation]-CALayer 图像IO
图像IO 潜伏期值得思考 - 凯文 帕萨特 在第13章“高效绘图”中,我们研究了和Core Graphics绘图相关的性能问题,以及如何修复.和绘图性能相关紧密相关的是图像性能.在这一章中,我们将研究 ...
- [iOS Animation]-CALayer 性能优化
性能优化 代码应该运行的尽量快,而不是更快 - 理查德 在第一和第二部分,我们了解了Core Animation提供的关于绘制和动画的一些特性.Core Animation功能和性能都非常强大,但如果 ...
随机推荐
- DB2 SQL Mixed data in character strings
Mixed character data and graphic data are always allowed for Unicode, but for EBCDIC and ASCII, the ...
- php基础面试题1
问题1:谈谈你对的PHP的基本认识. 回答:PHP是Hypertext Preprocessor(超文本预处理器)的简称,是一种用来开发动态网站的服务器端脚本语言. 问题2:什么是MVC? 回答:MV ...
- Pyqt清空Win回收站
Pyqt清空回收站其实的调用Python的第三方库,通过第三方库调用windows的api删除回收站的数据 一. 准备工作 先下载第三方库winshell 下载地址: https://github.c ...
- 【PHP的异常处理【完整】】
PHP的异常处理机制大多数和java的很相似,但是没有finally,而且还可以自定义顶级异常处理器:捕捉到异常信息后,会跳出try-catch块,如果catch中没有跳转的动作,则会继续执行下一条语 ...
- GitHub 中国区前 100 名到底是什么样的人?
本文根据Github公开API,抓取了地址显示China的用户,根据粉丝关注做了一个排名,分析前一百名的用户属性,剖析这些活跃在技术社区的牛人到底是何许人也!后续会根据我的一些经验出品<技术人员 ...
- 查看Linux分区格式
第一种方法: 使用mount [root@ol6-121-rac1 ~]# mount /dev/mapper/vg_ol6121rac1-lv_root on / type ext4 (rw) ...
- 1-02 启动和停止Sql Sever的服务
启动Sql Sever服务的三种方式 1:后台启动服务. 2:Sql Sever配置管理员启动服务. 3:在运行窗口中使用命令启动和停止服务: 启动:net start mssqlsever. 停止 ...
- Sublime Text 3 安装Go语言相关插件gosublime
1.打开Sublime Text,使用快捷键 ctrl+` (左上角Tab键上方,Esc键下方)或者使用菜单 View > Show Console menu,此时将出现Sublime Text ...
- 在Salesforce中创建Web Service供外部系统调用
在Salesforce中可以创建Web Service供外部系统调用,并且可以以SOAP或者REST方式向外提供调用接口,接下来的内容将详细讲述一下用SOAP的方式创建Web Service并且用As ...
- Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构
分享两篇Win 10应用开发的XML文档结构:Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构. Win 10 开发中Adapt ...