首页 > 其他分享 >qbxt刷题营day1

qbxt刷题营day1

时间:2022-11-16 23:44:31浏览次数:63  
标签:ch int day1 qbxt maxn way dis 节点 刷题

qbxt刷题营day1

长春花


通过暴力,我们可以发现答案通常很小。通过对范围内所有的p 进行验证,答案的最大值为 31。因此,我们首先维护出 v[i]表示是否存在 x满足x^2三i(modp) 。随后,我们直接暴力枚举a 的值并 check 即可。时间复杂度为O(ans*p) ,其中在p<=10^5时ans<=31 。

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
	while(ch<='9'&&ch>='0'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
int v[100005],g[100005];
int ans=0;
signed main(){
	int p=read();
	memset(v,-1,sizeof(v));
	for(int i=0;i<p;i++){
		if(v[(i*i)%p]==-1){
			
			v[(i*i)%p]=i;	
			
		}
	}
	for(int i=0;i<p;i++){
		for(int j=0;j<p;j++){
			if(v[(((i-j*j)%p)+p)%p]!=-1){
				ans=max(ans,j);
				break;
			}
		}
	}
	cout<<ans<<endl;
}


紫罗兰


统计无项不带权图中的最小环个数。

考虑BFS,以每一个点为起点,第一次访问到某个节点时更新对应的最短路,如果是第二次访问,那么dis[u]+dis[v]+1一定是一个环。

对于一个无向图的BFS生成树,我们可以发现在搜索时找到的边只有以下两种:横插边和前向边。

当前搜索到的节点如果已经被搜索过,那么该节点在BFS生成树上的深度一定和当前节点相等或比当前节点大一,(其实也有小1的情况,只是这种情况下这条边一定已经被遍历过了。当然,等于的情况也有可能已经被遍历过,所以奇数环的个数要额外/2)因为BFS生成树上除了队列中的节点以外的节点的邻边一定已经被搜索完毕,所以搜到的节点要么从未搜到,要么在队列中还未搜索。

如果搜到的节点v的深度比当前节点u大一,那么v的最短路径条数加上u的最短路径条数。

所以当我们找到v时,我们找到的不只是一个环,而是way[u]*way[v]个。

找到的也有可能不是一个简单环,而是一个有公共部分的环...不过它的简单环部分一定会被计数,而其本身也不是最小环,所以可以不考虑。(也可以通过记录由原点的某一个邻边扩展而来来避免此类问题)

对于计数部分,可以注意到:

​ 1.以环上任意一点均会将环统计一次,所以答案要/len;

​ 2.奇数环的每条边被重复计数两次,要额外/2;

#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
	while(ch<='9'&&ch>='0'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
const int maxn=1e6+10;
int ans=0x3f3f3f3f,cnt=0;
int head[maxn],nxt[maxn],to[maxn],tot;
int vis[maxn],way[maxn];
int dis[maxn];
queue<int>q;
void add(int u,int v){
	nxt[++tot]=head[u],to[head[u]=tot]=v;
}
int main(){
	int n=read(),m=read();
	for(int i=1;i<=m;i++){
		int u=read(),v=read();
		add(u,v);
		add(v,u);
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			dis[j]=0x3f3f3f3f;
			way[j]=0;
		}
	//	for(int j=1;j<=tot;j++)vis[j]=0;
		dis[i]=0;
		way[i]=1;
		q.push(i);
		while(!q.empty()){
			int u=q.front();
			q.pop();
			for(int k=head[u];k;k=nxt[k]){
				int v=to[k];
				//cout<<v<<" "<<dis[v]<<endl;
				if(dis[u]+1==dis[v]||dis[u]==dis[v]){
					int len=dis[u]+dis[v]+1;
					if(len<ans){
						ans=len;
						cnt=way[u]*way[v];
					}
					else if(len==ans){
						cnt+=way[u]*way[v];
					}
				}
				if(dis[v]>dis[u]+1) {
					
					way[v]=way[u];
					dis[v]=dis[u]+1;
					q.push(v);
				}
				else if(dis[v]==dis[u]+1){
					way[v]+=way[u];
				}
			}
				
			
		}
		
	}printf("%d\n",ans%2?cnt/ans/2:cnt/ans);
}

天竺葵


当n=m-1 时,问题转化成有 m个变量,第i变量的取值为 [li,ri],且任意两个变量不相等,构造 一组方案。我们可以将所有区间按照左端点排序,随后扫 li时贪心的选择 ri最小的来放置。

当m>n-1 时,每条非树边会有额外的限制:非树边(u,v) 的边权必须严格大于路径u->v 的边权 最小值。因此,对于一条非树边,我们只有在这条路径上所有的边均被赋值后,才可以赋非树边的值。 因此我们仍然按照 Li排序,但在合并两个联通块时,更新这一轮所联通的非树边,如果一个非树边的两 端点联通,则将其加入堆中即可。

具体的实现我们可以把u到v的边分别挂在这两个端点上,然后在合并两个集合时找到两个集合重合的边,然后合并两个集合。

具体可以用set启发式合并实现。

标签:ch,int,day1,qbxt,maxn,way,dis,节点,刷题
From: https://www.cnblogs.com/Hushizhi/p/16897977.html

相关文章

  • day19
    【0027.移除元素】classSolution{public:intremoveElement(vector<int>&nums,intval){intfast=0;intslow=0;for(intfa......
  • 剑指offer——Day10动态规划(中等)
    Day102022.11.16动态规划(中等)46.把数字翻译成字符串自己实现想到每种数字组成会很复杂,就放弃了,其实题目已经说了是两位数的组合,就还好。题解动态规划。首先,动态规划......
  • Day13:方法重载的理解
    方法的重载方法重载的定义方法的重载是指在类里面定义多个同名的方法,功能相似,但参数列表(个数、类型、顺序)不一样。规则:方法名必须相同方法参数必须不同(个数、类型、......
  • Day13.1:命令行传参的操作
    命令行传参我们可以在程序运行时利用Dos命令行给主方法main传递参数来得到一些反馈信息。publicclassdemo{publicstaticvoidmain(String[]args){//m......
  • javascript-代码随想录训练营day1
    704.二分查找力扣题目链接:https://leetcode.cn/problems/binary-search/题目描述:给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums......
  • CF刷题计划?(upd:11.15)
    CF刷题计划?CF1285F太nb了这个题暴力一点的做法是二分后直接莫反,但是不够快考虑枚举一个\(\gcd\),令其为\(d\)然后从大到小枚举数,然后把\(\gcd(\frac{x}{d},\frac{y}{d}......
  • day1
    001.输出//ConsoleApplication1.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。//c++是不在乎空格的#include<iostream>intmain()//程序的启动键......
  • day18
    【0459.重复的子字符串】classSolution{public:boolrepeatedSubstringPattern(strings){for(inti=0;i<s.size()/2;i++){int......
  • LeetCode刷题记录.Day15
    反转字符串中的单词151.反转字符串中的单词-力扣(LeetCode)classSolution{public:voidreverse(string&s,intstart,intend){//反转单词字符串,写法为左闭......
  • Day11.2:标签的使用
    标签的使用当我们在嵌套语句中,例如当我们在for的嵌套循环语句中,想要终止或重新开始当前循环以外的循环的时候,单独仅靠break和continue和还不够,需要在我们想要作用的循环语......