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

如果范围是一条线,则将灯按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;
}

  

BZOJ3833 : [Poi2014]Solar lamps的更多相关文章

  1. bzoj 3834 [Poi2014]Solar Panels 数论分块

    3834: [Poi2014]Solar Panels Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 367  Solved: 285[Submit] ...

  2. 【BZOJ3834】[Poi2014]Solar Panels 分块好题

    [BZOJ3834][Poi2014]Solar Panels Description Having decided to invest in renewable energy, Byteasar s ...

  3. BZOJ3834[Poi2014]Solar Panels——分块

    题目描述 Having decided to invest in renewable energy, Byteasar started a solar panels factory. It appea ...

  4. 【bzoj3834】[Poi2014]Solar Panels 数论

    题目描述 Having decided to invest in renewable energy, Byteasar started a solar panels factory. It appea ...

  5. 【BZOJ】3834: [Poi2014]Solar Panels

    http://www.lydsy.com/JudgeOnline/problem.php?id=3834 题意:求$max\{(i,j)\}, smin<=i<=smax, wmin< ...

  6. BZOJ3834 : [Poi2014]Solar Panels

    问题相当于找到一个最大的k满足在$[x_1,x_2]$,$[y_1,y_2]$中都有k的倍数 等价于$\frac{x_2}{k}>\frac{x_1-1}{k}$且$\frac{y_2}{k}& ...

  7. BZOJ3834 [Poi2014]Solar Panels 【数论】

    题目链接 BZOJ3834 题解 容易想到对于\(gcd(x,y) = D\),\(d\)的倍数一定存在于两个区间中 换言之 \[\lfloor \frac{a - 1}{D} \rfloor < ...

  8. [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)$. 思路 ...

  9. POI2014题解

    POI2014题解 [BZOJ3521][Poi2014]Salad Bar 把p当作\(1\),把j当作\(-1\),然后做一遍前缀和. 一个合法区间\([l,r]\)要满足条件就需要满足所有前缀和 ...

随机推荐

  1. linux下vim命令详解 转自: zhanglong0426

      高级一些的编辑器,都会包含宏功能,vim当然不能缺少了,在vim中使用宏是非常方便的: :qx     开始记录宏,并将结果存入寄存器xq     退出记录模式@x     播放记录在x寄存器中的 ...

  2. MySQL之扩展(触发器,存储过程等)

    视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. SELECT * FROM ( SEL ...

  3. 《linux备份与恢复之二》3.19 dump(文件系统备份)

    <Linux指令从初学到精通>第3章文件管理,本章介绍了许多常用命令,如cp.ln.chmod.chown.diff.tar.mv等,因为这些都与文件管理相关,在日常的使用中经常用到,因此 ...

  4. Bulls and Cows

    You are playing the following Bulls and Cows game with your friend: You write down a number and ask ...

  5. JavaScript toFixed()使用的注意事项

    以下是w3school的定义: 定义和用法 toFixed() 方法可把 Number 四舍五入为指定小数位数的数字. 语法 NumberObject.toFixed(num) 参数 描述 num 必 ...

  6. 64. 海明距离(Hamming Distance)

    [本文链接] http://www.cnblogs.com/hellogiser/p/hamming-distance.html [介绍] 在信息领域,两个长度相等的字符串的海明距离是在相同位置上不同 ...

  7. php中重写和final关键字的使用

    为什么把重写和final放在一起,原因就是一条:final的意思是不可更改的,也就是说final定义的东西是不可改变的,下面具体来说一下. 来看一段简单的代码: class BaseClass { f ...

  8. Spring MVC程序中得到静态资源文件css,js,图片

    转载自:http://www.blogjava.net/fiele/archive/2014/08/24/417283.html 用 Spring MVC 开发应用程序,对于初学者有一个很头疼的问题, ...

  9. Java性能优化权威指南-读书笔记(五)-JVM性能调优-吞吐量

    吞吐量是指,应用程序的TPS: 每秒多少次事务,QPS: 每秒多少次查询等性能指标. 吞吐量调优就是减少垃圾收集器消耗的CPU周期数,从而将更多的CPU周期用于执行应用程序. CMS吞吐调优 CMS包 ...

  10. 线段覆盖4(codevs 3012)

    题目描述 Description 数轴上有n条线段,线段的两端都是整数坐标,坐标范围在0~1000000,每条线段有一个价值,请从n条线段中挑出若干条线段,使得这些线段两两不覆盖(端点可以重合)且线段 ...