BZOJ2584 : [Wc2012]memory
xy方向分开考虑
用扫描线处理出拓扑序,第二问直接回答拓扑序,
第一问:
将操作倒过来,变成加入线段,用线段树维护区间拓扑序的最值
#include<cstdio>
#include<algorithm>
#include<set>
#define N 100010
using namespace std;
inline void read(int&a){char c;bool f=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;}
struct Point{int x,y;Point(){}Point(int _x,int _y){x=_x,y=_y;}};
struct Line{Point s,t;int id;}a[N];
inline bool operator <(const Line&a,const Line&b){
double x=max(a.s.x,b.s.x),A=(x-a.s.x)/(a.t.x-a.s.x)*(a.t.y-a.s.y)+a.s.y,B=(x-b.s.x)/(b.t.x-b.s.x)*(b.t.y-b.s.y)+b.s.y;
return A<B;
}
set<Line>T;
struct Event{int x,id,type;Event(){}Event(int _x,int _id,int _type){x=_x,id=_id,type=_type;}}b[N<<1];
inline bool operator <(const Event&a,const Event&b){return a.x<b.x||a.x==b.x&&a.type<b.type;}
int n,i,j,m,h,t,q[N],my[N],op[N][2],lx[N],rx[N],rank[N],ans,g[N],nxt[N<<2],v[N<<2],in[N],ed;
inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;in[y]++;}
inline int lower(int x){
int l=1,r=m,mid,t;
while(l<=r)if(b[mid=(l+r)>>1].x>=x)r=(t=mid)-1;else l=mid+1;
return t;
}
int l[N<<2],r[N<<2],vmin[N<<2],vmax[N<<2],tot,tagmin[N<<2],tagmax[N<<2];
void build(int a,int b){
int x=++tot;
vmin[x]=tagmin[x]=m,vmax[x]=tagmax[x]=0;
if(a+1==b)return;
int mid=(a+b)>>1;
l[x]=tot+1;build(a,mid);
r[x]=tot+1;build(mid,b);
}
void ins(int x,int a,int b,int c,int d,int p){
tagmax[x]=max(tagmax[x],p);tagmin[x]=min(tagmin[x],p);
if(c<=a&&b<=d){vmax[x]=max(vmax[x],p);vmin[x]=min(vmin[x],p);return;}
int mid=(a+b)>>1;
if(c<mid)ins(l[x],a,mid,c,d,p);
if(d>mid)ins(r[x],mid,b,c,d,p);
}
int askmin(int x,int a,int b,int c,int d){
if(c<=a&&b<=d)return min(vmin[x],tagmin[x]);
int mid=(a+b)>>1,t=vmin[x];
if(c<mid)t=min(t,askmin(l[x],a,mid,c,d));
if(d>mid)t=min(t,askmin(r[x],mid,b,c,d));
return t;
}
int askmax(int x,int a,int b,int c,int d){
if(c<=a&&b<=d)return max(vmax[x],tagmax[x]);
int mid=(a+b)>>1,t=vmax[x];
if(c<mid)t=max(t,askmax(l[x],a,mid,c,d));
if(d>mid)t=max(t,askmax(r[x],mid,b,c,d));
return t;
}
int judge(int d1,int d2){
for(m=ed=0,i=1;i<=n;i++)b[++m]=Event(a[i].s.x,i,1),b[++m]=Event(a[i].t.x,i,g[i]=in[i]=0);
sort(b+1,b+m+1);
T.clear();
for(i=1;i<=m;)for(j=b[i].x;i<=m&&b[i].x==j;i++){
if(b[i].type)T.insert(a[b[i].id]);
set<Line>::iterator p=T.find(a[b[i].id]),k=p;
++k;
if(k!=T.end())add(p->id,k->id);
k=p;
if(k!=T.begin())add((--k)->id,p->id);
if(!b[i].type)T.erase(p);
}
for(h=i=1,t=0;i<=n;i++)if(!in[i])q[++t]=i;
while(h<=t)for(i=g[q[h++]];i;i=nxt[i])if(!(--in[v[i]]))q[++t]=v[i];
for(i=1;i<=n;i++)lx[i]=lower(a[i].s.x),rx[i]=lower(a[i].t.x),rank[q[i]]=i;
tot=0;build(1,m);
for(i=t=n;i;i--){
if(op[i][1]==d1)if(rank[op[i][0]]<askmax(1,1,m,lx[op[i][0]],rx[op[i][0]]))t=i;
if(op[i][1]==d2)if(rank[op[i][0]]>askmin(1,1,m,lx[op[i][0]],rx[op[i][0]]))t=i;
ins(1,1,m,lx[op[i][0]],rx[op[i][0]],rank[op[i][0]]);
}
return t;
}
int main(){
for(read(n),i=1;i<=n;i++){
read(a[i].s.x),read(a[i].s.y),read(a[i].t.x),read(a[i].t.y),a[i].id=i;
if(a[i].s.x>a[i].t.x)swap(a[i].s,a[i].t);
}
for(i=1;i<=n;i++)read(op[i][0]),read(op[i][1]);
for(ans=judge(i=1,3);i<=n;i++){
my[i]=q[i],swap(a[i].s.x,a[i].s.y),swap(a[i].t.x,a[i].t.y);
if(a[i].s.x>a[i].t.x)swap(a[i].s,a[i].t);
}
for(printf("%d\n",min(ans,judge(2,0))),i=1;i<=n;i++)printf("%d 3\n",my[i]);
return 0;
}
BZOJ2584 : [Wc2012]memory的更多相关文章
- BZOJ 2584: [Wc2012]memory(扫描线+线段树)
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2584 题意:给出平面n个线段,任意两个线段严格不相交,且每个线段不平行于坐标轴.移 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 【NX二次开发】NX内部函数,libugui.dll文件中的内部函数
本文分为两部分:"带参数的函数"和 "带修饰的函数". 浏览这篇博客前请先阅读: [NX二次开发]NX内部函数,查找内部函数的方法 带参数的函数: bool A ...
- bzoj 2659: [Beijing wc2012]算不出的算式
2659: [Beijing wc2012]算不出的算式 Time Limit: 3 Sec Memory Limit: 128 MB Description 算不出的算式背景:曾经有一个老掉牙的游 ...
- BZOJ2661: [BeiJing wc2012]连连看
2661: [BeiJing wc2012]连连看 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 483 Solved: 200[Submit][S ...
- Bzoj 2662: [BeiJing wc2012]冻结 dijkstra,堆,分层图,最短路
2662: [BeiJing wc2012]冻结 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 647 Solved: 348[Submit][Sta ...
- BZOJ2659: [Beijing wc2012]算不出的算式
2659: [Beijing wc2012]算不出的算式 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 668 Solved: 366[Submit] ...
- BZOJ 2662: [BeiJing wc2012]冻结(最短路)
这道题和 BZOJ 2763飞行路线 几乎一模一样..然后飞行路线我是1A,这道题WA了4次,我开始怀疑我的智商了.. ---------------------------------------- ...
- 2659: [Beijing wc2012]算不出的算式
2659: [Beijing wc2012]算不出的算式 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 757 Solved: 425[Submit] ...
随机推荐
- 暑假热身 D. 条形码设计
校ACM队准备筹划向学校批请一个专用机房.但是为了防止它变成公用机房,FL建议采用刷卡进入的办法,她设计了一种条形码,每人都对应一个.这种大小为2*n的条形码由以下三种元素构成:1*2.2*1.2*2 ...
- poj3041 二分图最小顶点覆盖
Asteroids Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17237 td>Accepted: 9375 ...
- TCP/IP协议原理【转载】
前述 各种L2数据网具有不同的通信协议与帧结构,其网络节点设备可以是各种类型的数据交换机(X.25.FR.Ethernet和ATM等分组交换机):而L3数据网(IP网或internet) ...
- 关于C语言的printf输出问题
前端面试的时候老总居然问这个问题,有点震惊…… #include <stdio.h> #include <stdlib.h> void main() { ; printf(&q ...
- overflow-x和overflow-y其中一个设置为visible时的奇怪现象
当overflow-x和overflow-y其中一个设置为visible时,如果另一个不是visible,那么它会被自动重置为auto 看看效果先: 第一次遇到这个问题时,我还以为是chrome的一个 ...
- 隐藏Nginx/Apache版本号的安全性与方法
一.先介绍nginx隐藏版本号的方法. 搭建好nginx或者apache,为了安全起见我们都会隐藏他们的版本号,这边讲的是nginx的版本号,如果你也想隐藏apache的版本号,那请点前面的链接.请看 ...
- 关于ubuntu配置静态IP 无法正常上网的解决方案
在ubuntu中配置静态IP后无法正常上网. 解决: 1.在终端执行 vim /etc/network/interfaces 在文件中加入如下内容,网关要写上,我开始一直无法上网就是因为没有配置网关 ...
- 《ASP.NET MVC4 WEB编程》学习笔记------Model模型绑定
本文转载自haiziguo Asp.net mvc中的模型绑定,或许大家经常用,但是具体说他是怎么一回事,可能还是会有些陌生,那么,本文就带你理解模型绑定.为了理解模型绑定,本文会先给出其定义,然后对 ...
- iOS 使用interface builder 创建太复杂的constrains时容易产生crash
今天写程序,遇到了crash,在界面初始化时不会有,想切换到别的tab页就报错了.主要内容如下: Cannot find an outgoing row head for incoming head ...
- codeforces 471B. MUH and Important Things 解题报告
题目链接:http://codeforces.com/problemset/problem/471/B 题目意思:有 n 个 tasks,编号依次为 1 - n,每个 task 都有一定的难度值来评估 ...