首页 > 其他分享 >P6342 [CCO2017] Vera 与道路建设 题解

P6342 [CCO2017] Vera 与道路建设 题解

时间:2024-05-30 21:25:05浏览次数:17  
标签:cnt now CCO2017 题解 ans Vera int 完美 include

题目大意

对于一个图 w 一共有 v 个点点的编号为 1 , 2 , ... , v ,对于点 a 与点 b 如果满足 $ a \to b $ 且 $ b \to a $ 使得每一条道路都只走过一次,那么我们称 $ a,b $ 为完美点对,当一个联通图只有 $ k $ 个完美点对时,称这个联通图为美丽公路网,要求求出一个美丽公路网。

思路

首先我们画一个有 $ n $ 个点的圆,假设 $ n = 4 $,那么我们可以得到此图:

在此图中我们可以得知:

对 $ 1 $ 来说他跟 $ 4 - 1 $ 个有没有被统计点有完美点对,对 $ 2 $ 来说他跟 $ 4 - 2 $ 个有没有被统计点有完美点对,对于 $ 3 $ 来说他跟 $ 4 - 3 $ 个点有没有被统计过的被统计点有完美点对,对于 $ 4 $ 来说跟他有关的完美点对已经统计完了,二完美点对的数量为 $ 6 $,根据统计的过程我们得知一个圆的完美点对为 $ \frac{(n - 1) \times n}{2} $ 这个弄懂了相当于弄懂了代码的 $ 80% $ 了。

接下来我们只需要写一个二分函数 check 来计算,我们将 $ l \gets 2,r \gets \sqrt{n} + 1 $ 一直二分下去找到圆最多的点数找到了之后,写一个函数标记一下就行了。二分一次就把 $ k - (l-1) \times (l-2) $ 直至 $ k $ 为零。

执行一次的时间复杂度为 $ \Omicron(\sqrt{n}) $ 所以最坏的时间复杂度为 $ \Omicron(n \times \sqrt{n}) $ 这个时间复杂度对于这道题来说完全够 AC 了。

Code:

#include <algorithm>
#include <iostream>
#include <math.h>
#include <string.h>
#include <queue>
#include <set>
#include <stdio.h>
#define ll long long
#define prt printf
#define sc(ppt) scanf("%d" , &ppt)
using namespace std;

int k , cnt = 0; 
set<pair<int , int > > ans;

int check(int n){
	int l = 2 , r = (int)sqrt(n * 2) + 1; // 圆至少有两个点 , 至于后面那个 +1 是为了避免卡二分循环  
	while(l <= r){
		int mid = (l + r) >> 1;
		if(mid * (mid - 1) <= n * 2) l = mid + 1;
		else r = mid - 1;
	}
	return l - 1;
}

void Lable(int num){
	for(int i=cnt+1 ; i<cnt+num ; i++) ans.insert(pair<int , int >(i , i + 1)); // 造圆  
	ans.insert(pair<int , int >(cnt + num , cnt + 1)) ; // 连接两个圆
	if(cnt) ans.insert(pair<int , int >(1 , cnt + 1)) ; // 保证连通性避免偶然错误 
}

signed main(){
	sc(k) ;
	while(k){
		int now = check(k) ; Lable(now) ; cnt += now; // now 为这个圆,点的数量 
		k -= (now * (now - 1) / 2); 
	}
	prt("%d %d\n" , cnt , (int)ans.size());
	for(auto v : ans){
		prt("%d %d\n" , v.first , v.second);
	}
	return 0;
}
// 对于我这种小蒟蒻一次 AC 哈哈哈哈哈哈,太高兴了

标签:cnt,now,CCO2017,题解,ans,Vera,int,完美,include
From: https://www.cnblogs.com/CaoSheng-blog/p/18223235

相关文章

  • Nikita and LCM题解
    题目大意给你一个数组$a$,令$t$为$a$的子序列且$t$中所有数的最小公倍数$\notina$求$t$数组中最多有多少个数。思路非常明显这是一道数学题,对于数组$a$我们首先从小到大拍一个序,然后我们可以求出$a$中所有数的最大公倍数,如果这个公倍数$\not=......
  • MITIT 2024 Spring Invitational Qualification 简要题解
    这个比赛没有找到题解,有点难绷,所以来写篇。(实际上是无聊时写的就是了)题面:https://codeforces.com/gym/105125/。目测难度是绿绿黄紫紫。A有点诈骗。其实策略是只保留\(\le3\)个数,然后就随便维护一下。\(O(n\logn)\)。Code#include<bits/stdc++.h>usingnamespaces......
  • Gym-100520A Andrew Stankevich Contest 45 A 题解
    AnalogousSetsGym-100520ASol1.集合生成函数将可重集合\(M\)映射为生成函数:\[F(M)=\sum_{m\inM}(\#m)\cdotx^m\]如果\(M\)的元素在\(\mathbbN\)上取值,那么,\(F(M)\)是多项式。2.\(\theta\)算子\[\theta(F)=x\cdotF'\]其中\(F'=\frac{dF}{dx}\)......
  • Springboot报class path resource [xxxxx.json] cannot be resolved to URL because i
    当Springboot解析resources文件下的json文件时,在本地环境好用,部署到服务器上找不到文件内容报错classpathresource[xxxxx.json]cannotberesolvedtoURLbecauseitdosenotexist问题排查(1)pom.xml文件配置<build><resources><resource><d......
  • 洛谷 P8725 [蓝桥杯 2020 省 AB3] 画中漂流 的题解
    题目大意传送门思路考虑使用时空复杂度为O(tm)O(tm)......
  • 洛谷 P8614 [蓝桥杯 2014 省 A] 波动数列 的题解
    题目大意求满足和为sss且ti=......
  • 列队春游|概率期望|题解
    题面解析前言,此处所述为\(O(n^2)\)算法,暂时未推出\(O(n)\)的算法,后续可能会更新。题意非常明白,不多赘述。我们去考虑单个位置的概率,维护每个人放在该位置对该位置期望的贡献。以这个思想作为切入点,我们思考,对于一个序列来说,如果它的长度是定的。设总人数为n,当前我们考虑......
  • 【23NOIP提高组】题解
    T1:词典 #include<bits/stdc++.h>usingnamespacestd;inlineintread(){ intx=0,f=1;charch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9�......
  • P10528 [XJTUPC2024] 崩坏:星穹铁道 题解
    头图无语了,猜猜WA哪了不要真头图崩坏:星穹铁道题链这么简单做不对不许玩崩铁!题目大意给你行动的总次数\(n\)和初始战技点数量\(k\),以及编队里四名角色的行动类型,求不同行动方式的方案数。类型如下:思路先考虑dp,分角色类型讨论。设\(f_{i,k}\)表示第\(i......
  • DockerDesktop中启动jenkins容器时提示:Can not write to /var/jenkins_home/copy_ref
    场景Windows10(家庭版)中DockerDesktop(docker)的配置、安装、修改镜像源、使用:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/139264096按照以上教程搭建之后想要运行jenkins容器,所以执行如下指令dockerrun-d--namejenkins-p18088:8080-v/jenkinshome:......