由于两种线段要交替出现,有解的必要条件即为$h=v$(以下均记为$n$)

进一步的,再假设两种线段依次对应于向量$(a_{i},0)$和$(0,b_{i})$,根据题意要求向量长度为给定值且和为0,那么也即有$|a_{i}|=l_{i},|b_{i}|=p_{i}$且$\sum_{i=1}^{n}a_{i}=\sum_{i=1}^{n}b_{i}=0$

使用背包判定是否存在这样的$a_{i}$和$b_{i}$,若不存在即无解,若存在则再求出任意一组

(可以证明此时一定有解,以下即为构造)

若$a_{i}$中的负数少于$b_{i}$则将两者全部取相反数,再将两者分别从大到小排序(其实只需要保证正数在负数前),最后将$(a_{i},b_{i})$作为一个整体极角排序,并依次选择$(a_{1},0),(0,b_{1}),(a_{2},0),...,(b_{n},0)$即可

(代码实现上通过将两边分别合理排序使得其已经极角排序)

不难发现,以此法最终方案一定是形如下图的形式,即合法

时间复杂度为$o(\frac{nC^{2}}{\omega})$,可以通过

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 1005
4 bitset<N*N>f[N];
5 int t,n,m,a[N],b[N];
6 int calc(int *a){
7 int m=0;
8 for(int i=1;i<=n;i++)m+=a[i];
9 if (m&1)return 0;
10 m>>=1;
11 for(int i=1;i<=n;i++)f[i]=((f[i-1])|(f[i-1]<<a[i]));
12 if (!f[n][m])return 0;
13 for(int i=n;i;i--)
14 if (!f[i-1][m]){
15 m-=a[i];
16 a[i]=-a[i];
17 }
18 return 1;
19 }
20 int main(){
21 f[0][0]=1;
22 scanf("%d",&t);
23 while (t--){
24 scanf("%d",&n);
25 for(int i=1;i<=n;i++)scanf("%d",&a[i]);
26 scanf("%d",&m);
27 for(int i=1;i<=m;i++)scanf("%d",&b[i]);
28 if ((n!=m)||(!calc(a))||(!calc(b))){
29 printf("No\n");
30 continue;
31 }
32 int cnt=0;
33 for(int i=1;i<=n;i++)cnt+=(a[i]<0)-(b[i]<0);
34 if (cnt<0){
35 for(int i=1;i<=n;i++)a[i]=-a[i],b[i]=-b[i];
36 }
37 sort(a+1,a+n+1),reverse(a+1,a+n+1);
38 sort(b+1,b+n+1),reverse(b+1,b+n+1);
39 for(int i=1;i<=n+1;i++)
40 if ((i>n)||(a[i]<0)){
41 reverse(b+1,b+i);
42 break;
43 }
44 for(int i=n;i>=0;i--)
45 if ((!i)||(b[i]>0)){
46 reverse(a+i+1,a+n+1);
47 break;
48 }
49 printf("Yes\n");
50 for(int i=1,x=0,y=0;i<=n;i++){
51 x+=a[i],printf("%d %d\n",x,y);
52 y+=b[i],printf("%d %d\n",x,y);
53 }
54 }
55 return 0;
56 }

[cf1444D]Rectangular Polyline的更多相关文章

  1. CF1444D Rectangular Polyline[题解]

    Rectangular Polyline 题目大意 给定 \(h\) 条长度分别为 \(l_1,l_2,--,l_h\) 的水平线段以及 \(v\) 条长度分别为 \(p_1,p_2,--.p_v\) ...

  2. [svg 翻译教程]Polyline(折线)polygon(多边形)

    原文: http://tutorials.jenkov.com/svg/polygon-element.html Polyline 虽然说这个 元素我没用过,但是还是蛮强大的,也翻译下 示例 < ...

  3. [javascript svg fill stroke stroke-width points polygon属性讲解] svg fill stroke stroke-width points polygon绘制多边形属性并且演示polyline和polygon区别讲解

    <!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title ...

  4. [javascript svg fill stroke stroke-width points polyline 属性讲解] svg fill stroke stroke-width points polyline 绘制折线属性讲解

    <!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title ...

  5. svg学习(八)polyline

    <polyline> 标签用来创建仅包含直线的形状. <?xml version="1.0" standalone="no"?> < ...

  6. point\polyline\polygon的转化(转)

    首先你要明白Polyline是由path对象构成,Polygon是由ring对象构成,因此实现polyline向polygon的转换,思路如下:1.提取polyline中的所有path对象2.将pat ...

  7. ACdream 1429 Rectangular Polygon

    Rectangular Polygon Time Limit: 1000MS   Memory Limit: 256000KB   64bit IO Format: %lld & %llu D ...

  8. UVALive 3959 Rectangular Polygons (排序贪心)

    Rectangular Polygons 题目链接: http://acm.hust.edu.cn/vjudge/contest/129733#problem/G Description In thi ...

  9. 一种将Region转为Polyline的方法

    在AutoCAD.NET二次开发中,如果要将面域转为Polyline主要有以下几种方式: 1.使用Explode将面域炸成Line和Arc,然后再串起来,此方法可用于AutoCAD2007开始的所有版 ...

随机推荐

  1. 使用CEF(四)— 在QT中集成CEF(1):基本集成

    QT作为C++下著名的跨平台软件开发框架,实现了一套代码可以在所有的操作系统.平台和屏幕类型上部署.我们前几篇文章讲解了如何构建一款基于CEF的简单的样例,但这些样例的GUI都是使用的原生的或者是控件 ...

  2. Java基础之(六):变量、运算符与JavaDoc

    变量.常量 一.变量的命名规范 首字母只能以字母(A-Z或者a-z)或者美元符($)或者下划线(_)开头,不能以数字开头,首字母之后只能跟字母(AZ或者az)或者数字,不能跟美元符或者下划线 源码 p ...

  3. Java初步学习——2021.10.09每日总结,第五周周六

    (1)今天做了什么: (2)明天准备做什么? (3)遇到的问题,如何解决? 今天学习了菜鸟教程实例部分 一.字符串 1.字符串比较--compareTo方法 public class Main { p ...

  4. SpringBoot入门01-环境部署

    随笔目录: 环境准备 创建过程 编码试行 环境准备 如果编辑器是还没有配置过相关环境的,在用SpringBoot开发项目的时候,需要先环境,spring boot官网建议的开发工具是: STS或Ide ...

  5. mysql group by语句流程是怎么样的

    group by流程是怎么样的 注意点: select id%10 as m, count(*) as c from t1 group by m; group by是用于对数据进行分组,我们排序用到了 ...

  6. Java(15)面向对象之继承

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201615.html 博客主页:https://www.cnblogs.com/testero ...

  7. MySQL:提高笔记-5

    MySQL:提高笔记-5 学完基础的语法后,进一步对 MySQL 进行学习,前几篇为: MySQL:提高笔记-1 MySQL:提高笔记-2 MySQL:提高笔记-3 MySQL:提高笔记-4 MySQ ...

  8. BUAA软件工程结对项目作业

    BUAA软件工程结对项目 小组成员:16005001,17373192 1.教学班级和项目地址 项目 内容 这个作业属于哪个课程 博客园班级连接 这个作业的要求在哪里 结对项目作业 我在这个课程的目标 ...

  9. 简明教程 | Docker篇 · 其一:基础入门

    了解Docker Docker是什么 Docker是指容器化技术,用于支持创建和使用 Linux 容器,同时Docker也是软件容器平台. 什么是容器(container) 容器是主机上与其他进程隔离 ...

  10. fd定时器--timerfd学习

    定时器 可以用系统定时器信号SIGALARM 最近工作需要于是又发现了一个新玩意timerfd配合epoll使用. man 手册看一下 TIMERFD_CREATE(2) Linux Programm ...