题意略。

思路:构造题。

我们把全部的d[n]+1个点分作3部分来构造。

首先我们把原问题归约成构造d1、dn、和{d2 - d1,d3 - d1,.....,d[n-1] - d1}这样的问题,其中第三部分的构造相当于是原问题的子问题。

1.由本部向P2中每一个点都连接一条边,这样可以补上第三部分中每个元素都缺少的d1,现在相当于构造出了{d2,d3,....,d[n - 1]},还差d1和dn没构造出来。

2.用剩下的dn - d[n-1]来凑d1,P1向P2中每个点都连一条边,可以凑出d1。

3.现在P2内的点的度为dn - d[n-1] + d[n-1] - d1 + 1 = dn - (d1 - 1)。如果将P2内的点连成一个完全图,可以补上(d1 - 1),从而得到dn的值。

递归时的边界条件为l > r,或l == r。

1.l > r时,rst = 1,什么都不做就行。

2.l == r时,rst = d[l] + 1,将它连成一个完全图即符合题意。

rst表示当前问题的本部部分有多少个点,从而确定P1和P2在数组中的下标起始。

详见代码:

#include<bits/stdc++.h>
#define maxn 350
#define maxn1 1050
using namespace std; int di[maxn],rst,n,cnt;
vector<int> graph[maxn1]; void dfs(int l,int r){
if(l > r){
rst = ;
return;
}
if(l == r){
for(int i = ;i <= di[l] + ;++i){
for(int j = i + ;j <= di[l] + ;++j){
graph[i].push_back(j);
++cnt;
}
}
rst = di[l] + ;
return;
}
int p1 = di[r] - di[r - ],p2 = di[l];
for(int i = l + ;i <= r - ;++i) di[i] -= di[l];
dfs(l + ,r - );
for(int i = ;i <= rst;++i){
for(int j = rst + p1 + ;j <= rst + p1 + p2;++j){
graph[i].push_back(j);
++cnt;
}
}
for(int i = rst + ;i <= rst + p1;++i){
for(int j = rst + p1 + ;j <= rst + p1 + p2;++j){
graph[i].push_back(j);
++cnt;
}
}
for(int i = rst + p1 + ;i <= rst + p1 + p2;++i){
for(int j = i + ;j <= rst + p1 + p2;++j){
graph[i].push_back(j);
++cnt;
}
}
rst += (p1 + p2);
for(int i = l + ;i <= r - ;++i) di[i] += di[l];
return;
} int main(){
scanf("%d",&n);
for(int i = ;i <= n;++i){
scanf("%d",&di[i]);
}
dfs(,n);
printf("%d\n",cnt);
for(int i = ;i <= di[n];++i){
for(int j = ;j < graph[i].size();++j){
printf("%d %d\n",i,graph[i][j]);
}
}
return ;
}

Codeforces 976D的更多相关文章

  1. Degree Set CodeForces - 976D(双指针)

    题意: 构造一个无向图,使得无向图里的所有点的度数 所组成的集合 即为给出的几个数 解析: 题中的数是以上升的顺序给出的, 我们对于dn+1个数进行处理,对于当前数i,有两个操作 1.向后边的所有点连 ...

  2. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  3. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  4. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  5. 【Codeforces 738A】Interview with Oleg

    http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...

  6. CodeForces - 662A Gambling Nim

    http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...

  7. CodeForces - 274B Zero Tree

    http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...

  8. CodeForces - 261B Maxim and Restaurant

    http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...

  9. CodeForces - 696B Puzzles

    http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...

随机推荐

  1. python基础-python解释器多版本共存-变量-常量

    一.编程语言的发展史 机器语言-->汇编语言-->高级语言,学习难度及执行效率由高到低,开发效率由低到高 机器语言:二进制编程,0101 汇编语言:用英文字符来代替0101编程 高级语言: ...

  2. Uploadify.js引用导致浏览器宽度计算错误,布局混乱

    首先,本人新手,高手勿喷,请忽略.谢谢. 今天在写代码的时候遇到一个奇葩问题,我再在页面加载完成以后,动态计算DIV宽度,将整个层铺满浏览器.一切正常.单当我引入jquery.uploadify.js ...

  3. 深入理解Java中的锁(三)

    ReadWriteLock接口 读写锁维护一对关联锁,一个只用于读操作,一个只用于写操作.读锁可以由多个线程同时持有,又称共享锁.写锁同一时间只能由一个线程持有,又称互斥锁.同一时间,两把锁不能被不同 ...

  4. web设计_6_图片/标题/说明文字布局

    这个web中常见的单元布局,最好的布局方式就是利用float布局. 其中有个很关键的问题是需要清浮动.子集浮动是无法撑开父级的高度. 目前较完善的清浮动解决方案:在浮动的父级上添加.clear,达到清 ...

  5. kubernetes CRD 开发指南

    扩展kubernetes两个最常用最需要掌握的东西:自定义资源CRD 和 adminsion webhook, 本文教你如何十分钟掌握CRD开发. kubernetes允许用户自定义自己的资源对象,就 ...

  6. Linux中bash shell环境变量

    别名 别名是命令的快捷方式.为那些需要经常执行,但需要很长时间输入的长命令创建快捷方式很有用.语法是: alias ppp='ping www.baidu.com' 它们并不总是用来缩短长命令.重要的 ...

  7. ArchSummit分享 | 高德地图App架构演化与实践

    讲师介绍 郝仁杰,高德地图无线开发专家.在7月13日落幕的2019年ArchSummit峰会上就高德地图近几年的App架构演化和实践进行了分享. 背景概述 高德是国内领先的数字地图内容.导航和位置服务 ...

  8. 理解SVG中的 viewport,viewBox, preserveAspectRatio

    _ 阅读目录 一:理解viewport 二:理解viewBox 三:理解 preserveAspectRatio 回到顶部 一:理解viewport 该属性表示的是SVG可见区域的大小.或者也可以叫画 ...

  9. codeforces 371A K-Periodic Array

    很简单,就是找第i位.i+k位.i+2*k位...........i+m*k位有多少个数字,计算出每个数出现的次数,找到出现最多的数,那么K-Periodic的第K位数肯定是这个了.这样的话需要替换的 ...

  10. Java线程池的增长过程

    通过ThreadPoolExecutor的方式创建线程池 ThreadPoolExecutor 构造方法: public ThreadPoolExecutor(int corePoolSize, in ...