题面传送门

好题。

主要思路和另一位巨佬差不多,详细讲一下判断的部分。

解决思路:

首先考虑本题与拓扑排序有和关系。可以想到,某些棍子的先后移动顺序是有限制的。比如:

这里红色的必须比蓝色的先移动,因为它们在 \(x\) 轴的投影有重叠,蓝色在上,会被红色卡住。

所以,棍子两两之间可能存在限制关系,这就符合拓扑排序的条件了。考虑根据每一对限制关系建边。若 \(u\) 必须比 \(v\) 先移动,就从 \(u\) 向 \(v\) 连边,这样就转化为求拓扑序问题了。


其次,也是较麻烦的一部分,就是如何根据两线段的坐标判断其移动先后限制。

为了方便,在读入时判断并交换好,用 \(x1,y1\) 表示左边端点,\(x2,y2\) 表示左边端点。

\(\text {check}\) 函数,分以下几种情况讨论:

  1. 没有限制关系,返回 \(0\)。
  2. \(u\) 比 \(v\) 要先移动,返回 \(-1\)。
  3. \(v\) 比 \(u\) 要先移动,返回 \(1\)。

为了方便,设 \(u\) 为靠左的线段,若不是,在开始判断前将交换一下,并需要把 \(op\)(返回值)取反。

首先看 \(op=0\),即两线段在 \(x\) 轴上投影不重合:

肉眼可见,\(u.x2<v.x1\),注意等号不可以取到(照提交意思来看...)。

然后看一般情况。多画几个图,可以发现,只需要比较 \(u\) 上 \(x=v.x1\) 时 \(u.y'\) 的值与 \(v.y1\) 的大小 即可(或 \(v\) 上 \(x=u.x2\) 时 \(v.y'\) 的值与 \(u.y2\) 的大小)。在下的先移,在上的后移。

至于如何求函数值。。上过初中数学都会。具体可以看程序,变量名都遵从 \(y=kx+b\) 的基本形式了。

然鹅,这样写获得了 \(95\) 分的高分。哪里出问题了?

还有一种比较坑的情况,就是 \(u\) 是竖直的!

这时候函数 \(u\) 的 \(k\) 是无限大的,不是一次函数,无法求出值。所以需要特判,算出 \(x=u.x1\) 时 \(v\) 的函数值再比较。


Code:

#include<bits/stdc++.h>
using namespace std;
int n,m,in[5005];
struct node{
int x1,x2,y1,y2;
}b[5005];
vector<int> a[5005];
queue<int> q;
int check(node u,node v){ //0:无关,-1:先移u,1:先移v
int op=1;
if(u.x1>v.x1) swap(u,v),op=-op;
if(u.x2<v.x1) return 0;
double K,B,tmp;
if(!(u.x2-u.x1)){
K=1.0*(v.y2-v.y1)/(v.x2-v.x1);
B=(double)v.y1-K*v.x1;
tmp=K*u.x1+B;
if(u.y1>tmp) return op;
return -op;
}
K=1.0*(u.y2-u.y1)/(u.x2-u.x1);
B=(double)u.y1-K*u.x1;
tmp=K*v.x1+B; //求函数
if(tmp>v.y1) return op;
return -op;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d%d%d",&b[i].x1,&b[i].y1,&b[i].x2,&b[i].y2);
if(b[i].x1>b[i].x2) swap(b[i].x1,b[i].x2),swap(b[i].y1,b[i].y2);
}
for(int i=1;i<n;i++){
for(int j=i+1;j<=n;j++){
int op=check(b[i],b[j]);
if(op==-1) a[i].push_back(j),in[j]++;
if(op==1) a[j].push_back(i),in[i]++; //连边
}
}
for(int i=1;i<=n;i++) if(!in[i]) q.push(i),printf("%d ",i);
while(q.size()){ //拓扑
int k=q.front();
q.pop();
for(int i=0;i<a[k].size();i++){
int tmp=a[k][i];
in[tmp]--;
if(!in[tmp]) q.push(tmp),printf("%d ",tmp);
}
}
return 0;
}

【题解】P7860 [COCI2015-2016#2] ARTUR的更多相关文章

  1. [COCI]coci2015/2016 nekameleoni

    题意: 初始数列,每个数都在1~k以内 支持两种操作:1.修改一个数,修改后的数在1~k内                           2.查询一个最短包含1~k的序列的长度 查询100000 ...

  2. 题解 「JOISC 2016 Day 3」电报

    题目传送门 题目大意 给出一个\(n\)个点\(n\)条边的图,每个点有且仅有一个出边,改变每条边都会有对应的花费.求最小的花费使得整个图强连通. 思路 很显然,最后的图就是一个环.那我们要求的答案实 ...

  3. 【BZOJ4554】游戏(二分图匹配,网络流)

    [BZOJ4554]游戏(二分图匹配,网络流) 题解 Description 在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂.简单的说,这个游戏就是在一张地图上放上若干个炸弹,看 是否能炸到对手, ...

  4. HEOI2016解题报告

    树 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均无标记 ...

  5. bzoj 3165: [Heoi2013]Segment 线段树

    题目: Description 要求在平面直角坐标系下维护两个操作: 在平面上加入一条线段.记第i条被插入的线段的标号为i. 给定一个数k,询问与直线 x = k相交的线段中,交点最靠上的线段的编号. ...

  6. 2016 ACM/ICPC Asia Regional Qingdao Online(2016ACM青岛网络赛部分题解)

    2016 ACM/ICPC Asia Regional Qingdao Online(部分题解) 5878---I Count Two Three http://acm.hdu.edu.cn/show ...

  7. 2016年蓝桥杯B组C/C++决赛题解

    2016年第七届蓝桥杯B组C/C++决赛题解 2016年蓝桥杯B组C/C++决赛题目(不含答案) 1.一步之遥 枚举解方程,或者套模板解线性方程 #include<bits/stdc++.h&g ...

  8. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  9. COGS 2416.[HZOI 2016]公路修建 & COGS 2419.[HZOI 2016]公路修建2 题解

    大意: [HZOI 2016]公路修建 给定一个有n个点和m-1组边的无向连通图,其中每组边都包含一条一级边和一条二级边(连接的顶点相同),同一组边中的一级边权值一定大于等于二级边,另外给出一个数k( ...

随机推荐

  1. 新一代网络请求库:python-httpx库

    目录 httpx库 一. 概述 1. 简介 2. 命令行模式 3. 快速开始 3.1 get请求 3.2 post请求 3.2.1 表单 3.2.2 文件 3.2.3 JSON 3.2.4 二进制 3 ...

  2. GreatSQL vs MySQL性能测试来了,速围观~

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. GreatSQL是MySQL的国产分支版本,使用上与MySQL一致. 1.结论先行 无论ibp(innodb_buffer ...

  3. Java 中HashMap 详解

    本篇重点: 1.HashMap的存储结构 2.HashMap的put和get操作过程 3.HashMap的扩容 4.关于transient关键字 HashMap的存储结构 1. HashMap 总体是 ...

  4. Windows 10无法显示无线网络连接

    最近刚刚升级了一下操作系统,升级到了1903版本.正好又有一个HP的打印机安装了一下.结果,发现居然无法管理无线网络了.如果看不到图,请点我. 右击选择连接,也无法显示SSID. 驱动是从这个官网下载 ...

  5. 记录一下对jdk8后的接口的一些理解

    对于jdk8后的接口,接口中加入了可以定义默认方法和静态方法. 为什么要这样设计呢? 是为了在给接口扩展方法的时候,不会影响已经实现了该接口的类 加入默认方法可以解决:在添加方法的同时,不影响现有的实 ...

  6. GitLab 之 Git LFS 大文件存储的配置

    转载自:https://cloud.tencent.com/developer/article/1010589 1.Git LFS 介绍 Git 大文件存储(Large File Storage,简称 ...

  7. 论文解读(FedGAT)《Federated Graph Attention Network for Rumor Detection》

    论文信息 论文标题:Federated Graph Attention Network for Rumor Detection论文作者:Huidong Wang, Chuanzheng Bai, Ji ...

  8. PAT (Basic Level) Practice 1002 写出这个数 分数 20

    读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式: 每个测试输入包含 1 个测试用例,即给出自然数 n 的值.这里保证 n 小于 10100. 输出格式: 在一行内输出 ...

  9. Module Federation 模块联邦 在Vue3中使用Vue2搭建的微服务

    前言: 备注:本文基于对webpack Module Federation有一定了解的情况下 一般情况下使用模块联邦都是会使用相同的版本,如Vue2的组件时在Vue2中使用,但我为什么会在Vue3项目 ...

  10. SpringBoot课程学习(三)

    一.YAML格式的基本语法 (1)格式: 大小写敏感 数据值前边必须有空格,作为分隔符 使用缩进表示层级关系 缩进时不允许使用Tab键,只允许使用空格(各个系统 Tab对应的 空格数目可能不同,导致层 ...