题意略。

思路:构造题。

我们把全部的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在数组中的下标起始。

详见代码:

  1. #include<bits/stdc++.h>
  2. #define maxn 350
  3. #define maxn1 1050
  4. using namespace std;
  5.  
  6. int di[maxn],rst,n,cnt;
  7. vector<int> graph[maxn1];
  8.  
  9. void dfs(int l,int r){
  10. if(l > r){
  11. rst = ;
  12. return;
  13. }
  14. if(l == r){
  15. for(int i = ;i <= di[l] + ;++i){
  16. for(int j = i + ;j <= di[l] + ;++j){
  17. graph[i].push_back(j);
  18. ++cnt;
  19. }
  20. }
  21. rst = di[l] + ;
  22. return;
  23. }
  24. int p1 = di[r] - di[r - ],p2 = di[l];
  25. for(int i = l + ;i <= r - ;++i) di[i] -= di[l];
  26. dfs(l + ,r - );
  27. for(int i = ;i <= rst;++i){
  28. for(int j = rst + p1 + ;j <= rst + p1 + p2;++j){
  29. graph[i].push_back(j);
  30. ++cnt;
  31. }
  32. }
  33. for(int i = rst + ;i <= rst + p1;++i){
  34. for(int j = rst + p1 + ;j <= rst + p1 + p2;++j){
  35. graph[i].push_back(j);
  36. ++cnt;
  37. }
  38. }
  39. for(int i = rst + p1 + ;i <= rst + p1 + p2;++i){
  40. for(int j = i + ;j <= rst + p1 + p2;++j){
  41. graph[i].push_back(j);
  42. ++cnt;
  43. }
  44. }
  45. rst += (p1 + p2);
  46. for(int i = l + ;i <= r - ;++i) di[i] += di[l];
  47. return;
  48. }
  49.  
  50. int main(){
  51. scanf("%d",&n);
  52. for(int i = ;i <= n;++i){
  53. scanf("%d",&di[i]);
  54. }
  55. dfs(,n);
  56. printf("%d\n",cnt);
  57. for(int i = ;i <= di[n];++i){
  58. for(int j = ;j < graph[i].size();++j){
  59. printf("%d %d\n",i,graph[i][j]);
  60. }
  61. }
  62. return ;
  63. }

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. 你真的熟练使用webpack吗?

    https://www.webpackjs.com/ 官网地址 当自己在简历中写着熟练使用webpack的时候,殊不知自己只是在vue脚手架,react脚手架的路上走着比较轻松而已. 当面试官问你这几 ...

  2. Codeforces Round #554 (Div. 2) C. Neko does Maths (数论 GCD(a,b) = GCD(a,b-a))

    传送门 •题意 给出两个正整数 a,b: 求解 k ,使得 LCM(a+k,b+k) 最小,如果有多个 k 使得 LCM() 最小,输出最小的k: •思路 时隔很久,又重新做这个题 温故果然可以知新❤ ...

  3. 15. Java异常处理

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  4. 并发编程之Java内存模型

    在介绍Java内存模型之前,先来了解一下为什么要有内存模型,以及内存模型是什么.然后我们基于对内存模型的了解,学习Java内存模型以及并发编程的三大特性. 为什么要有内存模型 在计算机中,所有的运算操 ...

  5. windows上使用pip下载东西时报编码错误问题解决方法

    原因是pip安装python包会加载我的用户目录,我的用户目录恰好是中文的,ascii不能编码.解决办法是: python目录 Python27\Lib\site-packages 建一个文件site ...

  6. How to check all timestamps of a file

    A friend of mine she asked me how to check all timestamps of a file on an NTFS volume. She did not h ...

  7. cogs 264. 数列操作 单点修改 区间查询

    http://cogs.pro:8080/cogs/problem/problem.php?pid=pyNimmVeq 264. 数列操作 ★☆   输入文件:shulie.in   输出文件:shu ...

  8. awk文本处理

    一.前言 (一).awk简介 awk是一种编程语言,用于在linux/unix下对文本和数据进行处理,数据可以来自标准输入.一个或多个文件,或其它命令的输出,它支持用户自定义函数和动态正则表达式等先进 ...

  9. Dialog 使用详解

    极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...

  10. 【React踩坑记一】React项目中禁用浏览器双击选中文字的功能

    常规项目,我们只需要给标签加一个onselectstart事件,return false就可以 例: <div onselectstart="return false;" & ...