Codeforces 976D
题意略。
思路:构造题。

我们把全部的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的更多相关文章
- Degree Set CodeForces - 976D(双指针)
题意: 构造一个无向图,使得无向图里的所有点的度数 所组成的集合 即为给出的几个数 解析: 题中的数是以上升的顺序给出的, 我们对于dn+1个数进行处理,对于当前数i,有两个操作 1.向后边的所有点连 ...
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
- CodeForces - 274B Zero Tree
http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
- CodeForces - 261B Maxim and Restaurant
http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...
- CodeForces - 696B Puzzles
http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...
随机推荐
- sqlserver 2008 无法使用特殊主体‘sa’,错误15405
今天莫名其妙的遇到一个问题,还原了几个数据库到新的服务器上,突然发现sa用户对某几个数据库没有权限(用户映射): 我手工勾选相应数据库的db_owner权限之后,报错:无法使用特殊主体'sa',错误1 ...
- C#开发OPC Client程序
前一段时间写了一个OPC Client程序,现在将简单介绍一下程序开发方法.测试环境最后将我写的程序开源到Github上去. 一.开发方法 我这里用的是一个OPC动态库OPCAutomation.dl ...
- linux初学者-CIFS网络文件系统篇
linux初学者-CIFS网络文件系统篇 CIFS是一种通用网络文件系统,主要用于网络设备之间的文件共享.CIFS可以在linux系统和windows系统之间共享文件,因此这种文件系统主要用于客户端是 ...
- 研究分布式唯一ID生成,看完这篇就够
很多大的互联网公司数据量很大,都采用分库分表,那么分库后就需要统一的唯一ID进行存储.这个ID可以是数字递增的,也可以是UUID类型的. 如果是递增的话,那么拆分了数据库后,可以按照id的hash,均 ...
- 动态规划_Sumsets_POJ-2229
Farmer John commanded his cows to search . Here are the possible sets of numbers that sum to : ) +++ ...
- 读JDK源码集合部分
以前读过一遍JDK源码的集合部分,读完了一段时间后忘了,直到有一次面试简历上还写着读过JDK集合部分的源码,但面试官让我说说,感觉记得不是很清楚了,回答的也模模糊糊的,哎,老了记性越来越差了,所以再回 ...
- UR机器人通信--上位机通信(python)
一.通信socket socket()函数 Python 中,我们用 socket()函数来创建套接字,语法格式如下: socket.socket([family[, type[, proto]]]) ...
- 2、大型项目的接口自动化实践记录--接口测试简介及RequestsLibrary关键字简介
1.接口测试简介 1)先简单介绍下接口测试,那么什么是接口测试呢? 百科的回答:接口测试是测试系统组件间接口的一种测试.接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点. 看起来有 ...
- 利用jQuery中的serialize方法大量获取页面中表单的数据,发送的服务器
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 【错误】【vscode】输出中文是乱码问题