【Codeforces】Codeforces Round #680 Div2


https://codeforces.com/contest/1445

賽時結果

image.png


A. Array Rearrangment

一手純模擬,沒有細節問題。

#include<bits/stdc++.h>
#define int long long
#define rep(i,a,b) for(register int i=(a);i<=(b);i++)
using namespace std;
const int N=59;

inline int read() {
    register int x=0, f=1; register char c=getchar();
    while(c<'0'||c>'9') {if(c=='-') f=-1; c=getchar();}
    while(c>='0'&&c<='9') {x=(x<<3)+(x<<1)+c-48,c=getchar();}
    return x*f;
}

int T,n,x,a[N],b[N];

signed main() {
	T=read();
	while(T--) {
		n=read(), x=read();
		rep(i,1,n) a[i]=read();
		rep(i,1,n) b[i]=read();
		sort(a+1,a+n+1);
		sort(b+1,b+n+1); reverse(b+1,b+n+1);
		bool ans=1;
		rep(i,1,n) if(a[i]+b[i]>x) ans=0;
		if(ans==1) puts("YES");
		else puts("NO");
	}
	return 0;
} 

B. Elimination

我比較想吐槽的一道題。純粹閱讀+結論,沒什么特別大的意思。答案就是 \(max(a+b,c+d)\)

C. Division

相比於 B 和 D,C 就有意思多了。考慮將 \(q\) 質因數分解。然后由於 \(q\) 不能是 \(x\) 的約數,於是我們需要選擇一個 \(q\) 的質因數,然后將 \(p\) 一直除以這個質因數直到 \(p\bmod q\neq 0\)

#include<bits/stdc++.h>
#define int long long
#define rep(i,a,b) for(register int i=(a);i<=(b);i++)
using namespace std;
const int N=59;

inline int read() {
    register int x=0, f=1; register char c=getchar();
    while(c<'0'||c>'9') {if(c=='-') f=-1; c=getchar();}
    while(c>='0'&&c<='9') {x=(x<<3)+(x<<1)+c-48,c=getchar();}
    return x*f;
}

int T,p,q;

signed main() {
	T=read();
	while(T--) {
		p=read(), q=read();
		if(p<q) printf("%lld\n",p);
		else if(p%q!=0) printf("%lld\n",p);
		else {
			int ans=1;
			for(int i=2;i*i<=q;i++) {
				if(q%i==0) {
					int t=p;
					while(t%q==0) t/=i;
					ans=max(ans,t);
					while(q%i==0) q/=i;
				}
			}
			if(q!=1) {
				while(p%q==0) p/=q;
				ans=max(ans,p);
			}
			printf("%lld\n",ans);
		}
	}
	return 0;
} 

D. D. Divide and Sum

又是一道結論題。對於數列 \(a\)\(f(p,q)\) 永遠是相等的。於是用一個組合數加上稍微模擬一下即可。

#include<bits/stdc++.h>
#define int long long
#define rep(i,a,b) for(register int i=(a);i<=(b);i++)
using namespace std;
const int N=300009, mod=998244353;

inline int read() {
    register int x=0, f=1; register char c=getchar();
    while(c<'0'||c>'9') {if(c=='-') f=-1; c=getchar();}
    while(c>='0'&&c<='9') {x=(x<<3)+(x<<1)+c-48,c=getchar();}
    return x*f;
}

int n,a[N];

int mn,fac[N], inv[N], ifac[N];
void pre() {
    inv[0]=inv[1]=fac[0]=ifac[0]=1;
    for(int i=1;i<=mn;i++) fac[i]=fac[i-1]*i%mod;
    for(int i=2;i<=mn;i++) inv[i]=inv[mod%i]*(mod-mod/i)%mod;
    for(int i=1;i<=mn;i++) ifac[i]=ifac[i-1]*inv[i]%mod;
}
int C(int x,int y) {
    if(x<0||y<0||x<y) return 0;
    else return fac[x]*ifac[y]%mod*ifac[x-y]%mod;
}

signed main() {
	n=read();
	rep(i,1,2*n) a[i]=read();
	sort(a+1,a+2*n+1);
	int ans=0;
	rep(i,1,n) (ans+=abs(a[2*n-i+1]-a[i]))%=mod;
	mn=2*n;
	pre();
	ans=ans*C(2*n,n)%mod;
	printf("%lld\n",ans);
	return 0;
}

E. Team-Building

感覺 D 和 E 的 difficulty gap 比較大。一道有意思的圖論題。做法比較煩。

首先對於每一個學術小組,我們都檢查一下是不是二分圖,如果不是那么就不可能被選做參與活動的組。

我們設 \(c_i\) 代表 \(i\) 所屬於的學術小組,\(f(i)\) 表示 \(i\) 在哪個連通塊。於是對於兩個學術小組,要判斷兩個是否是二分圖,只需要連兩個學術小組的連通塊即可。那么時間還是 \(O(n^2)\) 的嘛?顯然不是,因為最多有 \(O(m)\) 對學術小組是有邊的。所以其實是 \(O(m)\)

代碼太煩了,以后回來再看看吧。

扔兩個題解 https://www.cnblogs.com/George1123/p/13912680.html https://www.luogu.com.cn/blog/SSerxhs/solution-cf1444c


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM