,想去吃饭了,但是还是想先水一篇,于是就先不补了,看不懂英文,这次的的题和差不多,然而就算如此,依然阻挡不了我只做了两题的大脑,不找原因了,菜就是菜,好好训别给下个赛季留遗憾。
Dashboard - Codeforces Round 909 (Div. 3) - Codeforces
这里先贴个这次链接。 然后
分析
:很显然,只有%时,后者胜,否则前者胜。
:这应该是前五题中代码最多的一题了,思路就是找除了本身之外所有的约数,然后记录一下前缀和,枚举步长,最后在循环中找到最大值即可。
:一个很显然的,但是昨天卡了我很久,考虑,如果%%。那么。否则;注意由于一定要取数,我们考虑当且仅当所有数都时候,我们最后的结果才可能,也就是直接取数组里的最大值输出即可,需要特判这一点,然后我们初始化数组为即可。
:思维题,我们经过化简可以很显然发现如下性质:我们要找的就是满足,我们通过求导(对,你没看错就是求导)可以发现只有当或者或者时候,我们才有这个式子成立,于是乎我们只需要统计这个数组里面相等元素的个数以及和分别的个数,然后通过组合数可以得知当相等的数为个,我们可以贡献对,如果个数为,个数为,可以贡献对。
:思维题,比还简单。我们很容易发现一个性质,也就是当不能这样排序的情况:我们找到数组中最小的数第一次出现的位置,如果其后面的数不是按照单调非递减的顺序排好,肯定是不行的,否则呢,否则我们可以通过这样的操作,把前面所有的数都排好序,那么是多少次操作呢?很显然是次,是序列中最小元素第一次出现的位置。
:不会,但是应该不难。
:不会,应该很难,据说是什么 ,不懂。
要去吃饭了,饿死了。
代码
:
#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;
}
:
#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;
}
:
#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;
}
:
#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;
}
:
#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;
}
争取下次能补到。