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

  

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

BZOJ2584 : [Wc2012]memory相关推荐

  1. 【BZOJ2584】memory,扫描线+拓扑图+骗

    传送门 思路: 神题 总结--写了一个错误做法,然后A了 想+写+调搞了将近一个星期 一开始想的是把斜着的线段转化成竖着的线段和横着的线段,然后分别做 但是好不容易打完以后,发现轻易就有反例(?) 然 ...

  2. 2659: [Beijing wc2012]算不出的算式

    2659: [Beijing wc2012]算不出的算式 Time Limit: 3 Sec  Memory Limit: 128 MB Submit: 757  Solved: 425 [Submi ...

  3. BZOJ 2662: [BeiJing wc2012]冻结(最短路)

    这道题和 BZOJ 2763飞行路线 几乎一模一样..然后飞行路线我是1A,这道题WA了4次,我开始怀疑我的智商了.. ---------------------------------------- ...

  4. BZOJ2659: [Beijing wc2012]算不出的算式

    2659: [Beijing wc2012]算不出的算式 Time Limit: 3 Sec  Memory Limit: 128 MB Submit: 1489  Solved: 891 [Subm ...

  5. Bzoj 2662: [BeiJing wc2012]冻结 dijkstra,堆,分层图,最短路

    2662: [BeiJing wc2012]冻结 Time Limit: 3 Sec  Memory Limit: 128 MB Submit: 647  Solved: 348 [Submit][S ...

  6. 2661: [BeiJing wc2012]连连看

    2661: [BeiJing wc2012]连连看 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1288 Solved: 536 [Submit][ ...

  7. Cache Memory技术示例

    Cache Memory技术示例 为什么需要cache?如何判断一个数据在cache中是否命中?cache的种类有哪些,区别是什么? 为什么需要cache memory 先思考第一个问题:程序是如何运 ...

  8. TensorFlow XLA优化与Memory

    TensorFlow XLA优化与Memory XLA概述 XLA(加速线性代数)是用于优化TensorFlow计算的线性代数的域特定编译器.结果是在服务器与移动平台上的速度,内存使用率与可移植性得到 ...

  9. Cache 与Memory架构及数据交互

    Cache 与Memory架构及数据交互

最新文章

  1. 稳压管,TVS管,压敏电阻,气体放电管等电涌保护器器件比较------amoBBS
  2. s2 devMode cmdshell
  3. muduo之ThreadLocal
  4. python-全栈开发-前方高能-内置函数
  5. 信息学奥赛一本通(1134:合法C标识符查)
  6. Linux的 ACL策略的作用
  7. 菜鸟也玩系统安装盘的集成(图文教程)
  8. ADSL密码查看器绿色版
  9. Windows10彻底关闭安全中心
  10. 14年第五届蓝桥杯C/C++大学B组真题———史丰收算法
  11. system/app 下 精简程序
  12. RocketMQ如何维持心跳
  13. C#针式打印机自定义纸张连续打印爬坑过程
  14. Web前端和Web后端的区分
  15. 360WiFi之愚见
  16. 迭代法求解贝尔曼期望方程的数学证明
  17. 无聊写着玩:解二阶线性微分方程
  18. while循环练习题-检测输入数据中奇数和偶数的个数
  19. 【网络通信三】研华网关Modbus服务设置
  20. C++:C++编程语言学习之数学运算运算符及其优先级的简介、案例应用之详细攻略

热门文章

  1. [命令技巧]chmod Set-User-ID Set-Group-ID
  2. 杀毒软件为什么不能启动、运行
  3. linux安装vi 插件,Ubuntu上Vim安装NERDTree插件的详细操作步骤
  4. mysql+1.6安装,CentOS 7.0编译安装Nginx1.6.0+MySQL5.6.19+PHP5.5.14方法
  5. CCS编译出错:缺少头文件的解决办法
  6. ASSERT(断言)的用法
  7. 王者荣耀服务器维护啥意思,王者荣耀
  8. python导入自定义模块和路径问题
  9. WCF 4.0 进阶系列 – 第十二章 实现单向操作和异步操作(下)
  10. Postgresql在Windows下的解压安装