首先旋转坐标系,将范围表示成矩形或者射线

如果范围是一条线,则将灯按y坐标排序,y坐标相同的按x坐标排序,

对于y相同的灯,f[i]=min(i,它前面灯发光时刻的第k[i]小值),

线段树维护,$O(n\log n)$

如果范围是一个矩形,则将灯按x坐标排序,x坐标相同的按y坐标排序,

从左往右、从下到上依次扫描,f[i]=min(i,它左下角灯发光时刻的第k[i]小值),

权值线段树套SBT维护,$O(n\log^2n)$

#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=200010,M=524289;
int n,x1,y1,x2,y2,sig=1,i,j,x,y,f[N],q[N],cnt,flag;
struct P{ll x,y;int id,k;}a[N];
inline void up(int&x,int y){if(x>y)x=y;}
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;
}
namespace Mistake{
int v[M];
inline bool cmp(P a,P b){return a.y==b.y?a.x<b.x:a.y<b.y;}
void clear(int x,int a,int b){if(!v[x])return;v[x]=0;if(a==b)return;int mid=(a+b)>>1;clear(x<<1,a,mid),clear(x<<1|1,mid+1,b);
}
void add(int x,int a,int b,int c){v[x]++;if(a==b)return;int mid=(a+b)>>1;if(c<=mid)add(x<<1,a,mid,c);else add(x<<1|1,mid+1,b,c);
}
inline int kth(int k){if(v[1]<k)return n;int x=1,a=1,b=n,mid,t;while(a<b){mid=(a+b)>>1,t=v[x<<=1];if(k<=t)b=mid;else k-=t,a=mid+1,x++;}return a;
}
void work(){sort(a+1,a+n+1,cmp),a[0].y=a[1].y-1;for(i=1;i<=n;i++){if(a[i].y!=a[i-1].y)clear(1,1,n);up(f[a[i].id],kth(a[i].k)),add(1,1,n,f[a[i].id]);}
}
}
namespace Normal{
ll b[N];int X,Y,K,lim,t;
inline bool cmp(P a,P b){return a.x==b.x?a.y<b.y:a.x<b.x;}
inline int lower(ll x){int l=1,r=n,t,mid;while(l<=r)if(b[mid=(l+r)>>1]<=x)l=(t=mid)+1;else r=mid-1;return t;
}
struct node{int val,sum;node*l,*r;node(){val=sum=0;l=r=NULL;}inline void up(){sum=l->sum+r->sum+1;}
}*blank=new(node),*T[M],pool[4000000],*cur;
inline void Rotatel(node*&x){node*y=x->r;x->r=y->l;x->up();y->l=x;y->up();x=y;}
inline void Rotater(node*&x){node*y=x->l;x->l=y->r;x->up();y->r=x;y->up();x=y;}
void Maintain(node*&x,bool f){if(x==blank)return;if(!f){if(x->l->l->sum>x->r->sum)Rotater(x);else if(x->l->r->sum>x->r->sum)Rotatel(x->l),Rotater(x);else return;}else{if(x->r->r->sum>x->l->sum)Rotatel(x);else if(x->r->l->sum>x->l->sum)Rotater(x->r),Rotatel(x);else return;}Maintain(x->l,0),Maintain(x->r,1),Maintain(x,0),Maintain(x,1);
}
void Ins(node*&x){if(x==blank){x=cur++;x->val=Y;x->l=x->r=blank;x->sum=1;return;}x->sum++;if(Y<x->val)Ins(x->l);else Ins(x->r);Maintain(x,Y>=x->val);
}
inline void Ask(node*x){t=0;while(x!=blank)if(X<x->val)x=x->l;else{t+=x->l->sum+1;if(t>=K)return;x=x->r;}
}
inline void add(){int a=1,b=n,mid,f=1,x=1;while(a<b){if(f)Ins(T[x]);mid=(a+b)>>1;x<<=1;if(f=X<=mid)b=mid;else a=mid+1,x|=1;}Ins(T[x]);
}
inline int kth(){if(Ask(T[1]),t<K)return n;int x=1,a=1,b=n,mid;while(a<b){mid=(a+b)>>1;x<<=1;if(lim<=mid)t=n;else Ask(T[x]);if(K<=t)b=mid;else{K-=t,a=mid+1,x|=1;if(a>=Y)return n;}}return a;
}
void work(){cur=pool;blank->l=blank->r=blank;for(i=1;i<M;i++)T[i]=blank;sort(a+1,a+n+1,cmp);for(i=1;i<=n;i++)b[i]=a[i].y;sort(b+1,b+n+1);for(i=1;i<=n;i++){X=lower(a[i].y),Y=a[i].id,K=a[i].k;if(lim<=1&&(Ask(T[1]),t)>=a[i].k)f[a[i].id]=1;else up(f[a[i].id],kth());Y=X,X=f[a[i].id],add();if(X>lim)lim=X;}
}
}
int main(){read(n),read(x1),read(y1),read(x2),read(y2);if((ll)x1*y2==(ll)x2*y1)x2=-y1,y2=x1,flag=1;if((ll)x1*y2<(ll)x2*y1)sig=-1;for(i=1;i<=n;i++){read(x),read(y);a[i].x=((ll)y2*x-(ll)x2*y)*sig;a[i].y=((ll)x1*y-(ll)y1*x)*sig;a[i].id=f[i]=i;}for(i=1;i<=n;i++)read(a[i].k);if(flag)Mistake::work();else Normal::work();for(i=1;i<n;i++)printf("%d ",f[i]);printf("%d",f[n]);return 0;
}

  

转载于:https://www.cnblogs.com/clrs97/p/4403161.html

BZOJ3833 : [Poi2014]Solar lamps相关推荐

  1. BZOJ3833[Poi2014] Solar lamps

    Task: 有很多盏灯,第ii盏灯在第ii个时刻点亮.如果有至少kik_i盏灯照亮了第ii盏灯,那么这盏灯就将被点亮.每盏灯照亮的范围都是一样角度的一个区域且无限延伸,给定(x1,y1),(x2,y2 ...

  2. POI2014 Solar lamps

    Solar lamps POI2014 题意 1.有n个灯,他们只会朝一个确定的夹角发光 2.每个灯被放在一个固定的地方,并且朝向同一个方向(指如果发光会朝同一个方向) 3.第i盏灯如果被至少K[i] ...

  3. POI2014 Solar Panels

    Solar Panels POI2014 题意 多组询问,每次问x∈[L1,R1],y∈[L2,R2]时,gcd(x, y)的最大值 解 1.设答案为d 那么必须满足 ⌊ L 1 − 1 d ⌋ \l ...

  4. [POI2014]Solar Panels

    题目大意: $T(T\le1000)$组询问,每次给出$A,B,C,D(A,B,C,D\le10^9)$,求满足$A\le x\le B,C\le y\le D$的最大的$\gcd(x,y)$. 思路 ...

  5. BZOJ3834: [Poi2014]Solar Panels

    题目大意:给定A,B,C,D,求满足A≤x≤B&&C≤y≤D的gcd(x,y)的最大值 首先枚举答案n,变成检验 ⌊A−1n⌋ \lfloor\frac{A-1}{n}\rfloor ...

  6. usaco party lamps

    不说什么了这题真的解不出来.看了题解,规律一层套一层,题目越来越难了加油吧. /* ID:jinbo wu PROG:lamps LANG:C++ */ #include<bits/stdc++ ...

  7. 洛谷P3572 [POI2014]PTA-Little Bird

    P3572 [POI2014]PTA-Little Bird 题目描述 In the Byteotian Line Forest there are nn trees in a row. On top ...

  8. P3572 [POI2014]PTA-Little Bird

    P3572 [POI2014]PTA-Little Bird 一只鸟从1跳到n.从1开始,跳到比当前矮的不消耗体力,否则消耗一点体力,每次询问有一个步伐限制k,求每次最少耗费多少体力 很简短的题目哼. ...

  9. [BZOJ3832][Poi2014]Rally

    [BZOJ3832][Poi2014]Rally 试题描述 An annual bicycle rally will soon begin in Byteburg. The bikers of Byt ...

最新文章

  1. 前阿里巴巴产品专家明卿:当下做通用积分还是个好生意吗?
  2. numpy中函数shape的用法
  3. Linux 编译安装内核
  4. BZOJ 3208: 花神的秒题计划Ⅰ
  5. pandas 数据索引与选取
  6. linux 脚本 写更新,用Shell写的游戏客户端更新脚本
  7. 特斯拉工程师当UP主评测自动驾驶,结果被公司开除
  8. android菜单动画,利用 android studio 制作一个菜单动画
  9. App在后台运行时如何保存数据到sqlite数据库
  10. 蓝桥杯2013c++真题:振兴中华
  11. Linux chmod文件授权命令
  12. rtmp中flv和flv文件的区别
  13. android 隐藏鼠标光标,Android7.1下显示/隐藏鼠标
  14. win10解除usb禁用_Windows10系统禁用usb存储设备的方法
  15. Pandas快乐学习之上海机动车牌照拍卖
  16. 计算机二级办公室应用题目,干货|计算机二级备考攻略
  17. 进化从不关心已经完成生殖任务的人
  18. ui设计是干啥的: ui设计师主要是做什么的呢
  19. 3060ti海力士测试
  20. Cesium中的几种坐标和相互转换(2)

热门文章

  1. Tensorflow高级API的进阶--利用tf.contrib.learn建立输入函数
  2. excel几个表合成一张_Excel中怎样把多张表格中的数据合并到一张表格中
  3. cocos2d-x学习资源汇总(持续更新。。。)
  4. html表单所有类型,表单form的type种类
  5. php设计模式在框架中的应用,关于设计模式在实际场景中的应用
  6. linux部署多个jar 会宕机_部署springboot+vue项目文档(若依ruoyi项目部署步骤)
  7. 面向对象、继承、多态、封装、匿名内部类的基本知识点复习总结
  8. formSelects使用
  9. 搭建自己的博客(二十六):优化点赞功能,并添加模态登录框
  10. [CQOI2017]小Q的棋盘