A
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int T;
cin>>T;
while(T--){
int x;
cin>>x;
if(x==0)cout<<0<<'\n';
else if(x==1)cout<<1<<'\n';
else if(x%2==0)cout<<2<<'\n';
else cout<<3<<'\n';
}
}
B
指针
一开始不在差分数组上做,wa了一发
后面换成差分数组上做就过了,我也不知道为啥
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
int n,a[N],b[N],f[N];
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i],b[i]=a[i]-a[i-1];
// for(int i=1;i<=n;i++)cout<<"b["<<i<<"]="<<b[i]<<endl;
int ans=1;
for(int i=2;i<=n;i++){
if(b[i]==1){
int k=-1;
int c=2;
int j=i+1;
while(j<=n&&b[j]==k*c)c++,k=-k,j++;
j--;
// cout<<"i="<<i<<" j="<<j<<endl;
ans=max(ans,j-i+2);
i=j;
}
}
// for(int i=1;i<n;i++){
// int j=i+1;
// int b=1;
// int c=1;
// while(j<=n&&a[j]==a[i]+b*c){
// j++;
// if(b==-1)c++;
// b=-b;
// }
// j--;
// ans=max(ans,j-i+1);
// i=j;
// }
cout<<ans;
}
C
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,a[N],s[N],o[N],S[N];
vector<int>v[N];
void dfs(int i=1,int fa=0){
int j=i+1;
// cout<<"u="<<a[i]<<" fa="<<fa<<endl;
while(s[a[i]]>1){
int sz=s[a[j]];
dfs(j,a[i]);
sz=S[a[j]];
j+=sz;
s[a[i]]-=sz;
}
if(s[a[i]]==1){
if(fa>0){
if(fa<a[i])v[fa].push_back(a[i]);
else v[a[i]].push_back(fa);
}
}
return;
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>s[i],S[i]=s[i];
dfs(1);
for(int i=1;i<=n;i++){
// for(auto j:v[i])cout<<i<<" "<<j<<'\n';
sort(v[i].begin(),v[i].end());
for(auto j:v[i])cout<<i<<" "<<j<<'\n';
}
}
D
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=3e5+10;
const int mod=1e9+7;
int n,m,k;
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m>>k;
multiset<int>S;
int x;
for(int i=1;i<=n;i++){
cin>>x;
S.insert(x);
}
// if(n==1){
// cout<<x;
// return 0;
// }
while(k--){
auto mi=S.begin();
auto ma=--S.end();
if(*mi==*ma){
break;
}
int A=*mi;
int B=*ma;
// cout<<"max="<<*ma<<" min="<<*mi<<endl;
int a=A+m;
int b=B-m;
if(b<=0){
break;
}
if(A*B>=a*b)break;
S.erase(mi),S.erase(ma);
S.insert(a),S.insert(b);
}
int ans=1;
for(auto x:S)ans=ans*x%mod;
cout<<ans;
}
E
F
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
int n,a[N],f[N],x,ans=1;
/*
对每一种值,我们只需要记录最左边的那个数字
对每一种可能性,我们只需要放进下一个需要的数字
每一个确切的数字,只会有一个数字去承接他的值
对于一个个建,有很多个值
*/
typedef pair<int,int>PII;
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
cin>>n;
map<int,map<int,int>>mp;
for(int i=1;i<=n;i++){
cin>>x;
if(mp.count(x)){
for(auto [B,len]:mp[x]){
int b=B;
if(b>=0)b=-(b+1);
else b=-(b-1);
mp[x+b][b]=max(mp[x+b][b],len+1);
ans=max(ans,len+1);
}
}
else if(!mp.count(x+1))mp[x+1][1]=1;
}
cout<<ans;
}