Codeforces Round 909 (Div. 3)(A~E)

107 阅读4分钟

emmmemmm,想去吃饭了,但是还是想先水一篇,于是FF就先不补了,看不懂英文QAQQAQ,这次的div3div3的题和div4div4差不多,然而就算如此,依然阻挡不了我只做了两题的fwfw大脑,不找原因了,菜就是菜,好好训别给下个赛季留遗憾。

Dashboard - Codeforces Round 909 (Div. 3) - Codeforces

这里先贴个这次链接。 然后

分析

AA:很显然,只有nn%303≠0时,后者胜,否则前者胜。

BB:这应该是前五题中代码最多的一题了,思路就是找nn除了本身之外所有的约数,然后记录一下前缀和,枚举步长,最后在循环中找到最大值即可。

CC:一个很显然的dpdp,但是昨天卡了我很久,考虑dp[i]dp[i],如果(a[i]+mod)(a[i]+mod)%2(a[i1]+mod2≠(a[i-1]+mod%22。那么dp[i]=max(a[i],dp[i1]+a[i]dp[i]=max(a[i],dp[i-1]+a[i]。否则dp[i]=a[i]dp[i]=a[i];注意由于一定要取数,我们考虑当且仅当所有数都0≤0时候,我们最后的结果才可能0≤0,也就是直接取数组里的最大值输出即可,需要特判这一点,然后我们初始化dpdp数组为00即可。

DD:思维题,我们经过化简可以很显然发现如下性质:我们要找的就是满足2ai/ai=2aj/aj2^{a_i}/{a_i}=2^{a_j}/{a_j},我们通过求导(对,你没看错就是求导)可以发现只有当ai=aja_i=a_j或者ai=1,2a_i=1,2或者aj=1,2a_j=1,2时候,我们才有这个式子成立,于是乎我们只需要统计这个数组里面相等元素的个数以及1122分别的个数,然后通过组合数可以得知当相等的数为kk个,我们可以贡献k(k1)/2k(k-1)/2对,如果11个数为num1num122个数为num2num2,可以贡献num1num2num1*num2对。

EE:思维题,比DD还简单。我们很容易发现一个性质,也就是当不能这样排序的情况:我们找到数组中最小的数第一次出现的位置,如果其后面的数不是按照单调非递减的顺序排好,肯定是不行的,否则呢,否则我们可以通过这样的操作,把前面所有的数都排好序,那么是多少次操作呢?很显然是k1k-1次,kk是序列中最小元素第一次出现的位置。

FF:不会,但是应该不难。

GG:不会,应该很难,据说是什么chairmanchairman treetree,不懂。

要去吃饭了,饿死了TATTAT

代码

AA:

#include <bits/stdc++.h>

#define ll long long
#define x first
#define y second

#define IOS ios::sync_with_stdio(false);cin.tie(nullptr),cout.tie(nullptr);


using namespace std;
int n;
void solve(){
	cin>>n;
	if((n-1)%3==0 || (n+1)%3==0 ) cout<<"First\n";
	else cout<<"Second\n"; 
}
int main(){
	
	int t;
	cin>>t;
	while(t--) solve();
	return 0;
} 

BB:

#include <bits/stdc++.h>

#define ll long long
#define x first
#define y second

#define IOS ios::sync_with_stdio(false);cin.tie(nullptr),cout.tie(nullptr);

const int N=150010;
ll a[N],s[N];
using namespace std;
int n;
vector<ll> res;
void solve(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];
	res.clear();
	ll xx=n;
    for (int i = 1; i <= xx / i; i ++ )//基本数学常识 只用除到sqrt(x)
        if (xx % i == 0)// 此时i 为 n 的一个 因子(约数)
        {
            res.push_back(i);
            if (i != xx / i) res.push_back(xx / i);//防止i 与 n/ i 相等
        }
    sort(res.begin(), res.end());
    res.pop_back();
    ll anss=0;
    for(int i=0;i<res.size();i++){
    	ll temp=res[i];
    	ll maxn=0;
    	ll minn=1e18;
    	for(int j=0;j+temp<=n;j+=temp){
    		maxn=max(maxn,s[j+temp]-s[j]);
    		minn=min(minn,s[j+temp]-s[j]);
		}
		anss=max(anss,maxn-minn);
	}
	cout<<anss<<endl;
}
int main(){
	
	int t;
	cin>>t;
	while(t--) solve();
	return 0;
} 

CC:

#include <bits/stdc++.h>

#define ll long long
#define x first
#define y second

#define IOS ios::sync_with_stdio(false);cin.tie(nullptr),cout.tie(nullptr);
using namespace std;
const int N=200010;
int mod=10000;
int dp[N];
int a[N],n;
void solve(){
	cin>>n;
	//memset(s,0,sizeof s);
	int maxn=-100000;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		maxn=max(maxn,a[i]);
	}
	if(maxn<=0){
		cout<<maxn<<"\n";
		return;
	}
	dp[1]=0;
	dp[1]=max(dp[1],a[1]);
	for(int i=2;i<=n;i++){
		if((a[i]+mod)%2!=(a[i-1]+mod)%2){
			dp[i]=max(a[i],dp[i-1]+a[i]);
		}
		else dp[i]=a[i];
	}
	int ans=0;
	for(int i=1;i<=n;i++) ans=max(ans,dp[i]);
	cout<<ans<<"\n";
}
int main(){
	
	int t;
	cin>>t;
	while(t--) solve();
	return 0;
} 

DD:

#include <bits/stdc++.h>

#define ll long long
#define x first
#define y second

#define IOS ios::sync_with_stdio(false);cin.tie(nullptr),cout.tie(nullptr);
using namespace std;
const int N=200010;
int mod=10000;
int dp[N];
int a[N],n;
map<int,ll> mp;
void solve(){
	cin>>n;
	mp.clear();
	for(int i=1;i<=n;i++){
		cin>>a[i];
		mp[a[i]]++;
	}
	ll num1=0,num2=0;
	ll ans=0;
	for(auto it:mp){
		if(it.x==1) num1=it.y;
		if(it.x==2) num2=it.y;
		//cout<<"*"<<it.y<<endl;
		ans+=(it.y*(it.y-1))/2;
	}
//	cout<<"**"<<num1<<" "<<num2<<endl;
	ans+=num1*num2;
	cout<<ans<<"\n";
}
int main(){
	
	int t;
	cin>>t;
	while(t--) solve();
	return 0;
} 

EE:

#include <bits/stdc++.h>

#define ll long long
#define x first
#define y second

#define IOS ios::sync_with_stdio(false);cin.tie(nullptr),cout.tie(nullptr);
using namespace std;
const int N=200010;
int mod=10000;
int dp[N];
int a[N],n;
map<int,ll> mp;
void solve(){
	cin>>n;
	mp.clear();
	int minn=0x3f3f3f3f;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		minn=min(minn,a[i]);
	}
	int id;
	for(int i=1;i<=n;i++){
		if(a[i]==minn){
			id=i;
			break;
		}
	}
	bool ok=true;
	for(int i=id;i+1<=n;i++){
		if(a[i+1]<a[i]){
			ok=false;
			break;
		}
	}
	if(!ok){
		cout<<"-1\n";
	}
	else{
		cout<<id-1<<"\n";
	}
}
int main(){
	
	int t;
	cin>>t;
	while(t--) solve();
	return 0;
} 

争取下次能补到FF