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;
}

  

时间: 2024-10-06 12:34:41

BZOJ2652 : 三角板的相关文章

Core Animation学习总结

目录: The Layer Beneath The Layer Tree(图层树) The Backing Image(寄宿层) Layer Geometry(图层几何学) Visual Effects(视觉效果) Transforms(变换) Specialized Layers(专有图层) Setting Things in Motion Implicit Animations(隐式动画) Explicit Animations(显式动画) Layer Time(图层时间) Easing(缓

CorAnimation7-高效绘图、图像IO以及图层性能

高效绘图 软件绘图 术语绘图通常在Core Animation的上下文中指代软件绘图(意即:不由GPU协助的绘图).在iOS中,软件绘图通常是由Core Graphics框架完成来完成.但是,在一些必要的情况下,相比Core Animation和OpenGL,Core Graphics要慢了不少. 软件绘图不仅效率低,还会消耗可观的内存.CALayer只需要一些与自己相关的内存:只有它的寄宿图会消耗一定的内存空间.即使直接赋给contents属性一张图片,也不需要增加额外的照片存储大小.如果相同

CoreAnimation6-基于定时器的动画和性能调优

基于定时器的动画 定时帧 动画看起来是用来显示一段连续的运动过程,但实际上当在固定位置上展示像素的时候并不能做到这一点.一般来说这种显示都无法做到连续的移动,能做的仅仅是足够快地展示一系列静态图片,只是看起来像是做了运动. 我们之前提到过iOS按照每秒60次刷新屏幕,然后CAAnimation计算出需要展示的新的帧,然后在每次屏幕更新的时候同步绘制上去,CAAnimation最机智的地方在于每次刷新需要展示的时候去计算插值和缓冲. 之前,我们解决了如何自定义缓冲函数,然后根据需要展示的帧的数组来

iOS-Core-Animation-Advanced-Techniques(六)(转)

基于定时器的动画和性能调优 基于定时器的动画 我可以指导你,但是你必须按照我说的做. -- 骇客帝国 在第10章“缓冲”中,我们研究了CAMediaTimingFunction,它是一个通过控制动画缓冲来模拟物理效果例如加速或者减速来增强现实感的东西,那么如果想更加真实地模拟 物理交互或者实时根据用户输入修改动画改怎么办呢?在这一章中,我们将继续探索一种能够允许我们精确地控制一帧一帧展示的基于定时器的动画. 定时帧 动画看起来是用来显示一段连续的运动过程,但实际上当在固定位置上展示像素的时候并不

奔驰S级加装单门四门无钥匙进入2015款S400L 4MATIC美车达广州

W新:dawvid 广州美车达奔驰S级2015款S400L 4MATIC加装单门四门无钥匙进入舒适进入系统产品名称:广州美车达奔驰S级2015款S400L 4MATIC加装单门四门无钥匙进入舒适进入系统适合车型:奔驰W222 一.广州美车达奔驰S级2015款S400L 4MATIC加装单门四门无钥匙进入舒适进入系统 无钥匙进入:走近车2米距离时,车锁会自动感应开锁并解除防盗:离开车2米以外距离时,车锁自动锁上并进入防盗.只要你随身携带智能钥匙无需拿出就可以轻松打开车门锁闭车门,无需再担心粗心大意

广州S级奔驰320无钥匙进入改装旋转高音头

weixin:dawvid 奔驰S级2014款S320L商务型豪华型S400LW222加改装柏林之声旋转高音头产品名称:奔驰S级2014款S320L商务型豪华型S400LW222加改装柏林之声旋转高音头适合车型:奔驰W222 一.奔驰S级2014款S320L商务型豪华型S400LW222加改装柏林之声旋转高音头 高音头有旋转与不旋转两种,旋转高音头也是在开机时旋转一下,其他时间不旋转.柏林之声高端3D环绕立体声音响系统的视觉效果同样令人印象深刻:系统启动时,安装在前车门后视镜三角板中的两个高音头

基于定时器的动画和性能调优

摘自:http://www.cocoachina.com/ios/20150106/10839.html 基于定时器的动画 我可以指导你,但是你必须按照我说的做. -- 骇客帝国 在第10章“缓冲”中,我们研究了CAMediaTimingFunction,它是一个通过控制动画缓冲来模拟物理效果例如加速或者减速来增强现实感的东西,那么如果想更加真实地模拟 物理交互或者实时根据用户输入修改动画改怎么办呢?在这一章中,我们将继续探索一种能够允许我们精确地控制一帧一帧展示的基于定时器的动画. 定时帧 动

图像IO

图像IO 潜伏期值得思考 - 凯文 帕萨特 在第13章“高效绘图”中,我们研究了和Core Graphics绘图相关的性能问题,以及如何修复.和绘图性能相关紧密相关的是图像性能.在这一章中,我们将研究如何优化从闪存驱动器或者网络中加载和显示图片. 加载和潜伏 绘图实际消耗的时间通常并不是影响性能的因素.图片消耗很大一部分内存,而且不太可能把需要显示的图片都保留在内存中,所以需要在应用运行的时候周期性地加载和卸载图片. 图片文件加载的速度被CPU和IO(输入/输出)同时影响.iOS设备中的闪存已经

百科知识 画法几何创造性思维训练

一.观察能力训练 1.在图中,能看得见的小立方体共有多少个? 2.两组两面投影图有何不同? 二.空间.平面图形理解能力训练 1.左边平面图形反映实形的投影为A.B.C.D中的哪一个? 2.在题号后的横线上如上例写出物体各有几个面? 三.记忆能力训练 请花2分钟默记下列圆的各投影图,然后再把它们徒手画出来. ? 四.联想.发散思维训练 看下图,你想到了什么?尽可能多地写出. 五.想象.发散思维训练 ????下图为日本创造学家中川先生设计的一张右脑开发训练图--50组由6个点组成的正三角形,又称"中