题目描述

Linköping有一个相当复杂的水资源运输系统。在Linköping周围的出水点有一些水井。这些水通过管道输送到其它地点。每条管道是从某一个水井到城市的某个位置的直线管道。
所有管道在地下的深度相同。因此,无论何时,两个管道相交时,它们会形成交点。幸运的是,管道系统正好是以满足两个管道有交点的方式建造。井不计入交点。任何数量的管道(包括零个与超过两个)都可以来源于每一个水井。
 
这些交点导致了一个问题,因为污垢(石灰和其它东西的混合物)往往会卡住交点,导致管道崩溃和坍塌,导致大型水槽孔的形成。这样的水槽孔对Linköping的学生有吸引的效果,使他们荒废学业,不受教育,这从长远来看将不只是导致管道系统的崩溃,还有社会的结构。因此,当务之急是管道定期清理。北欧提水再分配公司(NWERC) -负责Linköping的水管的 – 拥有充足的机器人车队才可以完成此任务。一个机器人可以在一条管道的开始位置被插入。然后,机器人通过管道一直到结束,并清除沿途所有交点。到达终点后,机器人转身并返回它开始的井。为了防止机器人互相碰撞,政府法规规定每当两个管相交,它们中的至多一个可以包含一个机器人。
 
由于整个水系统在被清洁时必须关闭(另一政府法规),则NWERC想迅速完成清洗,使用一批次清洁机器人,都必须在同一时间开始。
你的任务是验证是否可以做到这一点 - 即,是否能够把机器人同时插入管道中的一些,在不会有两个机器人相撞的危险下清洁所有交点。

输入格式

输入包括:
第一行两个整数w(1<=w<=1000)和p(1<=p<=1000),分别表示井的数量和管道的数量。
接下来w行,每行两个整数xi和yi(-10000<=x,y<=10000),表示i号井的位置(井从1到w编号)。
接下来p行,每行3个整数s(1<=s<=w)表示管道从s号井开始,x和y(-10000<=x,y<=10000)表示管道在位置为x,y的点结束。
每条管道都有一个井,就是它开始的那个。被两个或多个管道共享的点是一口井。任两条管道至多会有一个交点。两条管道的公共点可以是他们其中之一或两者的端点。所有管道的长度为正数。

输出格式

If it is possible to clean all intersections as described above, output “possible”. Otherwise, output “impossible”.
如果在上述情况下可以清理所有交点,输出“possible”,否则输出“impossible”。

  • 题解:

    • 题目意思一些射线,端点不算交点,相交的射线只能放一个机器人,问是否有方案让每一个交点都被机器人经过;
    • 如果A和B有交点,那么A放B不放,A不放B一定放,(多个交于一点也是符合题意的),转化成2-sat求解;
    • 翻阅了官解,发现如果有交点A和B连边,二分图判定(因为合法的方案对应了二分图的某一边的点集);
    •  #include<bits/stdc++.h>
      #define ll long long
      using namespace std;
      const int N=;
      int n,m,tot,id[N][],o=,hd[N<<],dfn[N<<],low[N<<],idx,st[N<<],top,bl[N<<],del[N<<],cnt;
      struct Edge{int v,nt;}E[N*N*];
      struct point{
      int x,y;
      point(int _x=,int _y=):x(_x),y(_y){};
      point operator +(const point&A)const{return point(x+A.x,y+A.y);}
      point operator -(const point&A)const{return point(x-A.x,y-A.y);}
      bool operator ==(const point&A)const{return x==A.x&&y==A.y;}
      int operator *(const point&A)const{return x*A.x+y*A.y;}
      int operator ^(const point&A)const{return x*A.y-y*A.x;}
      }p[N];
      struct line{point a,b;}l[N];
      void Adde(int u,int v){E[o]=(Edge){v,hd[u]};hd[u]=o++;}
      void tarjan(int u){
      dfn[st[++top]=u]=low[u]=++idx;
      for(int i=hd[u];i;i=E[i].nt){
      int v=E[i].v;
      if(!dfn[v])tarjan(v),low[u]=min(low[u],low[v]);
      else if(!del[v])low[u]=min(low[u],dfn[v]);
      }
      if(dfn[u]==low[u]){
      int v;cnt++;
      do{
      bl[v=st[top--]]=cnt;
      del[v]=;
      }while(v!=u);
      }
      }
      bool judge(int i,int j){
      if(l[i].a==l[j].a)return false;
      point a=l[j].a-l[i].a,b=l[j].b-l[i].a,c=l[i].b-l[i].a;
      if((ll)(c^a)*(c^b)>)return false;
      b=l[j].a-l[i].b,c=l[j].b-l[j].a;
      if((ll)(c^a)*(c^b)>)return false;
      return true;
      }
      int main(){
      #ifndef ONLINE_JUDGE
      freopen("bzoj4427.in","r",stdin);
      freopen("bzoj4427.out","w",stdout);
      #endif
      scanf("%d%d",&n,&m);
      for(int i=;i<=n;i++)scanf("%d%d",&p[i].x,&p[i].y);
      for(int i=,x;i<=m;i++){
      scanf("%d",&x);l[i].a=p[x];
      scanf("%d%d",&l[i].b.x,&l[i].b.y);
      id[i][]=++tot;id[i][]=++tot;
      }
      for(int i=;i<=m;i++)
      for(int j=i+;j<=m;j++)if(i!=j&&judge(i,j)){
      Adde(id[i][],id[j][]);
      Adde(id[i][],id[j][]);
      Adde(id[j][],id[i][]);
      Adde(id[j][],id[i][]);
      }
      for(int i=;i<=tot;i++)if(!dfn[i])tarjan(i);
      int fg=;for(int i=;i<=m;i++)if(bl[id[i][]]==bl[id[i][]]){fg=;break;}
      puts(fg?"impossible":"possible");
      return ;
      }

      bzoj4427

 

bzoj4427【Nwerc2015】Cleaning Pipes清理管道的更多相关文章

  1. BZOJ1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚

    1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 414  Solved: ...

  2. BZOJ 1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚

    题目 1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚 Time Limit: 5 Sec  Memory Limit: 64 MB Description Farm ...

  3. BZOJ_1672_[Usaco2005 Dec]Cleaning Shifts 清理牛棚_动态规划+线段树

    BZOJ_1672_[Usaco2005 Dec]Cleaning Shifts 清理牛棚_动态规划+线段树 题意:  约翰的奶牛们从小娇生惯养,她们无法容忍牛棚里的任何脏东西.约翰发现,如果要使这群 ...

  4. P4644 [Usaco2005 Dec]Cleaning Shifts 清理牛棚

    P4644 [Usaco2005 Dec]Cleaning Shifts 清理牛棚 你有一段区间需要被覆盖(长度 <= 86,399) 现有 \(n \leq 10000\) 段小线段, 每段可 ...

  5. [Usaco2005 Dec]Cleaning Shifts 清理牛棚 (DP优化/线段树)

    [Usaco2005 Dec] Cleaning Shifts 清理牛棚 题目描述 Farmer John's cows, pampered since birth, have reached new ...

  6. 【bzoj1672】[USACO2005 Dec]Cleaning Shifts 清理牛棚

    题目描述 Farmer John's cows, pampered since birth, have reached new heights of fastidiousness. They now ...

  7. 【BZOJ1672】[Usaco2005 Dec]Cleaning Shifts 清理牛棚 动态规划

    [BZOJ1672][Usaco2005 Dec]Cleaning Shifts Description Farmer John's cows, pampered since birth, have ...

  8. 洛谷P4644 [USACO2005 Dec]Cleaning Shifts 清理牛棚 [DP,数据结构优化]

    题目传送门 清理牛棚 题目描述 Farmer John's cows, pampered since birth, have reached new heights of fastidiousness ...

  9. 【BZOJ】1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚(dp/线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1672 dp很好想,但是是n^2的..但是可以水过..(5s啊..) 按左端点排序后 f[i]表示取第 ...

随机推荐

  1. 三羊献瑞:dfs / next_permutation()

    三羊献瑞 观察下面的加法算式: 祥 瑞 生 辉  +   三 羊 献 瑞-------------------   三 羊 生 瑞 气 (如果有对齐问题,可以参看[图1.jpg]) 其中,相同的汉字代 ...

  2. PHP处理表单数据的一个安全回顾(记录教训)

    曾经看过一个安全文章中写过这么一条 表单输入数据要做 htmlspecialchars_decode 表单输出数据要做htmlspecialchars 当时还不是很理解为什么,自己也没遇到问题,所以就 ...

  3. LeetCode 657. Robot Return to Origin (C++)

    题目: There is a robot starting at position (0, 0), the origin, on a 2D plane. Given a sequence of its ...

  4. TeamWork#3,Week5,Scrum Meeting 11.14

    根据最近项目出现的问题,我们明确了需要补充的工作,添加了几项任务. 成员 已完成 待完成 彭林江 由于网站信息更新,正在调整爬虫程序结构 更换爬虫结构 郝倩 由于网站信息更新,正在调整爬虫程序结构 更 ...

  5. Daily Scrumming* 2015.11.1(Day 13)

    一.今明两天任务表 Member Today’s Task Tomorrow’s Task 江昊 实现API小的更改 实现前后端整合 杨墨犁 实现首页 修改首页 付帅 实现创建编辑登录登出 测试修改 ...

  6. 《UML大战需求分析》-读后感三

    用例图是用来描述什么角色通过某某系统能做什么的图,用例图关注的是系统的外在表示想爱你.系统与人的交互系统与其他系统的交互,小人执行者就是角色,角色 是对系统使用者的抽象,一个角色可以代表多个具体的人而 ...

  7. Spring笔记③--spring的命名空间

    p:命名空间: xmlns:p="http://www.springframework.org/schema/p" 作用:简化在xml配置bean的属性 在<bean> ...

  8. git 提交本地文件,删除文件夹,修改文件等

    1. 下载git工具包 链接: https://git-scm.com/download/win 2. 右键打开git bash 登陆到自己的github账户 $ git config --globa ...

  9. ubuntu下编译ffmpeg+SDL+ffplay提取motion vector

    编译ffmpeg: 第一步: 从官网http://ffmpeg.org/下载最新版本. 解压tar -xjvf ffmpeg-3.3.1.tar.bz2 进入目录cd ffmpeg-3.3.1 第二步 ...

  10. 【Coursera】主成分分析

    一.问题 主方向的概念是什么?为什么降低维度的方法是使方差最大化? 假设某两个特征之间成线性关系,在二维平面上的表示就是数据点呈线性分布,那么可以通过将数据在主方向上进行投影,得到一个一维的数据,这个 ...