首页 > 其他分享 >Codeforces Round 875 (Div

Codeforces Round 875 (Div

时间:2023-05-29 20:57:29浏览次数:62  
标签:int 875 Codeforces 枚举 edge using Div 节点

Codeforces Round 875 (Div. 2) C-D题解

C

Problem - C - Codeforces

我们发现题述所形成的父亲节点一定比子节点先画出,并且如果子节点顺序在父节点后面,则父,子节点为同一个周期加入。反之,则子节点的周期为父节点+1。所以做法考虑树上dp,维护第i个节点加入树的周期。转移方程如下:

\[f[x]=f[u]+(e[u]>i) \]

其中u为父节点,x为子节点,e[u]为父节点的加入顺序,i为子节点加入顺序。

#include <bits/stdc++.h>
using namespace std;
using i64 = long long;

void solve(){
	int n;
	cin>>n;
	vector<pair<int,int>> edge[n+1];
	for(int i=1;i<n;i++){
		int u,v;
		cin>>u>>v;
		edge[u].push_back({v,i});  //双向存图,因为可能从两边连边
		edge[v].push_back({u,i});	
	}
	edge[0].push_back({1,n});

	vector<int> e(n+1),f(n+1);  //e[x]为加入x点的顺序,可以在dfs的过程中维护
	e[0]=n;
	function<void(int,int)> dfs=[&](int u,int p){
		for(auto [x,i]:edge[u]){
			if(x!=p){
				e[x]=i;
				f[x]=f[u]+(e[u]>e[x]);
				dfs(x,u);
			}
		}
	};
	dfs(0,-1);
	int ans=0;
	for(int i=1;i<=n;i++){
		ans=max(ans,f[i]);
	}
	cout<<ans<<'\n';
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);

	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

D

Problem - D - Codeforces

这种题考虑研究数的性质,考虑如何更好地暴力枚举。

我们发现a,b均小于n,然后我们发现\(s=a_i*a_j=b_i+b_j\)必然小于\(2n\),则发现\(a_i和a_j\)较小的(其实就是\(a_i\))一定小于\(sqrt(2n)\),考虑我们第一维枚举较小的\(a_i\) ,第二位枚举所有的\(a,b数对\),然后可以算出对应的\(b[i]\),这时我们需要知道了\(b[i]\)的个数,我们可以在第二维遍历时就更新\(b[i]\)个数,因为更新时\(s=a[i]\)所以一定是在满足条件前枚举。考虑到我们只枚举了\(a[i]<a[j]\)的情况,其实这已经是所以的情况,因为考虑位置的关系,所以情况要除2。注意时间复杂度\(O(nsqrt(2n))\)

#include <bits/stdc++.h>
using namespace std;
using i64 = long long;

void solve(){
	int n;
	cin>>n;
	vector<pair<i64,i64>> c(n+1);
	for(int i=1;i<=n;i++){
		cin>>c[i].first;
	}
	for(int i=1;i<=n;i++){
		cin>>c[i].second;
	}
	sort(c.begin(),c.end());
	i64 ans=0;
	vector<i64> cnt(n+1);
	for(int s=1;s*s<=2*n;s++){
		cnt.assign(n+1,0);
		for(auto [a,b]:c){
			int v=1LL*s*a-b;
			if(v>=1&&v<=n){
				ans+=cnt[v];
			}
			if(1LL*s==a) cnt[b]++;
		}
	}
	cout<<ans<<'\n';
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);

	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

标签:int,875,Codeforces,枚举,edge,using,Div,节点
From: https://www.cnblogs.com/Lionel-ZQY/p/17441625.html

相关文章

  • Codeforces Round 875 (Div. 2)
    Preface难得现场打一次,这天下午打了三个半小时的校内赛,然后八点打了两小时ARC,最后再接上两个半小时的CF真是爽歪歪不过有一说一其实很多时候都在坐牢,这场CF也差不多,一个小时写完ABCD然后开始坐牢,其实E基本想出来了但是没想到用随机赋值的方法来实现不过由于这场手很稳因此排名......
  • CF1292 div.1 做题记录
    ACF题面若某一列的第\(i\)行禁止移动,那么看另一列的第\(i-1,i,i+1\)行是否存在禁止移动的格子,若存在为No,否则为Yes,这个只需要在改变一个点状态时判断即可。点击查看代码#include<bits/stdc++.h>#defineullunsignedlonglong#definelllonglong#definepiipair......
  • cf-div.2-875d
    链接:https://codeforces.com/contest/1831/problem/D脑子确实不好使,没啥思路,看jls代码之后豁然开朗。思路:先枚举约数s,因为\(b_i+b_j\)不会超过4e5,所以第一层枚举所有约数为根号级别,第二层循环里枚举所有对数,统计\(v=a_i*s-b_i\)的所有个数,只有当\(a_i\)的值与s的值相等时,才能......
  • Codeforces Round 874 (Div. 3)
    A.MusicalPuzzle#include<bits/stdc++.h>usingnamespacestd;voidsolve(){intn;strings;cin>>n>>s;set<string>cnt;for(inti=0;i+1<n;i++)cnt.insert(s.substr(i,2));......
  • Codeforces Round 875 (Div. 2) A-D
    CodeforcesRound875(Div.2)A.TwinPermutationsinta[N];voidsolve(){intn=read();for(inti=1;i<=n;i++)a[i]=read();for(inti=1;i<=n;i++)cout<<n+1-a[i]<<'';cout<<'\n';//puts(ans&g......
  • CodeForces 1830C Hyperregular Bracket Strings
    洛谷传送门CF传送门每一步思路都非常自然的题。考虑先从一些简单的case入手。1.\(k=0\)设\(g_i\)为长度为\(i\)的合法括号串数。显然\(\foralli\nmid2,g_i=0\)。对于偶数的\(i\),这是一个经典问题,\(g_i\)就是第\(\frac{i}{2}\)项卡特兰数,因此\(g_i=\bi......
  • Codeforces Round #875 (Div. 2)
    CodeforcesRound#875(Div.2)bilibili:CodeforcesRound#875(Div.2)实况|完成度[4.01/6]A#include<bits/stdc++.h>usingll=longlong;usinguint=unsigned;usingnamespacestd;intTestCase;signedmain(){ for(scanf("%d",&......
  • Codeforces Round 875 (Div. 2) A~D
    CodeforcesRound875(Div.2)A~DA.TwinPermutations构造\(a[i]+b[i]=n+1\)voidwork(){ intn; cin>>n; rep(i,1,n){ intx; cin>>x; cout<<n-x+1<<""; } cout<<endl;}B.Arraymerging......
  • HTML中让上下两个div之间保持一定距离或没有距离
    这篇文章主要为大家详细介绍了HTML让上下两个DIV之间保持一定距离或没有距离,可以用来参考一下。1、若想上下DIV块之间距离,只需设定:在CSS里设置DIV标签各属性参数为0div{margin:0;border:0;padding:0;}这里就设置了DIV标签CSS属性相当于初始化了DIV标签CSS属性,这里设置margin外......
  • Educational Codeforces Round 149 (Rated for Div. 2)(A~F)
    A.GrasshopperonaLine题意:给出n,k,从0开始,每次可以加一个数,最快到达n需要,输出首先跳几次,然后每次跳多少,限制只有一个跳的长度不能整除k。分析:n%k,有余直接跳,没余数,先跳一个,再跳剩余的长度。代码:#include<cstring>#include<iostream>#include<algorithm>usingnamespac......