Codeforces #740 div2
讲解视频在:https://www.bilibili.com/video/BV1UM4y1V7V1
代码部分
A题
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define dec(x,y,z) for(int x=y;x>=z;x--)
const int maxn=1005;
int n;
int a[maxn];
void solve()
{
cin>>n;
rep(i,1,n)cin>>a[i];
int cnt=0;
bool ok=1;
rep(j,1,n)
{
if(a[j]!=j)ok=0;
}
if(ok)
{
cout<<0<<"\n";
return;
}
rep(i,1,n)
{
for(int j=(i%2);j+1<=n;j+=2)
{
if(a[j]>a[j+1])swap(a[j],a[j+1]);
}
bool ok=1;
rep(j,1,n)
{
if(a[j]!=j)ok=0;
}
if(ok)
{
cout<<i<<"\n";
return;
}
}
}
int main()
{
int _t;
cin>>_t;
while(_t--)solve();
return 0;
}
B题
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define dec(x,y,z) for(int x=y;x>=z;x--)
const int maxn=2e5+20;
int sa[maxn];
void deal(int x,int y,int xx,int yy)
{
int n=x+y;
if(x<xx)
{
swap(x,y);
swap(xx,yy);
}
int cur=x-xx;sa[cur]=1;
rep(i,1,min(xx,y))sa[cur+i*2]=1;
}
void solve()
{
int a,b;
cin>>a>>b;
rep(i,0,a+b)sa[i]=0;
deal((a+b)/2,(a+b+1)/2,a,b);
deal((a+b)/2,(a+b+1)/2,b,a);
int cnt=0;
rep(i,0,a+b)if(sa[i])cnt++;
cout<<cnt<<"\n";
rep(i,0,a+b)if(sa[i])cout<<i<<" ";
cout<<"\n";
}
int main()
{
int _t;
cin>>_t;
while(_t--)solve();
return 0;
}
C题
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define dec(x,y,z) for(int x=y;x>=z;x--)
const int maxn=2e5+20;
vector<int>a;
int n,k;
struct node
{
vector<int>t;
int key;
bool operator<(const node& A)
{
return key<A.key;
}
}tt[maxn];
bool check(int val)
{
for(int i=0;i<a.size();i++)
{
if(i+val<=a[i])return 0;
}
return 1;
}
void solve()
{
a.clear();
cin>>n;
rep(i,1,n)
{
cin>>k;
tt[i].t.clear();
tt[i].key=-INF;
rep(j,1,k)
{
int x;cin>>x;
tt[i].t.push_back(x);
tt[i].key=max(tt[i].key,x-j);
}
}
sort(tt+1,tt+n+1);
rep(i,1,n)for(auto it:tt[i].t)a.push_back(it);
int l=1,r=1e9+50;
while(l+1<r)
{
int mid=(l+r)>>1;
if(check(mid))r=mid;
else l=mid;
}
if(check(l))cout<<l<<"\n";
else cout<<r<<"\n";
}
int main()
{
int _t;
cin>>_t;
while(_t--)solve();
return 0;
}
D1 easy version
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define dec(x,y,z) for(int x=y;x>=z;x--)
#define int long long
const int maxn=4e6+105;
int n,mod;
int dp[maxn],pre[maxn];
void solve()
{
cin>>n>>mod;
dp[1]=1,pre[1]=1;
rep(i,2,n)
{
dp[i]=pre[i-1];
int val=i/2,l=2,r=i/val;
while(1) // sqrt(n)
{
(dp[i]+=dp[val]*(r-l+1)%mod)%=mod;
if(val==1)break;
l=r+1;
val=i/l;
r=i/val;
}
pre[i]=(dp[i]+pre[i-1])%mod;
}
cout<<dp[n]<<"\n";
}
signed main()
{
solve();
return 0;
}
D2 hard version
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define dec(x,y,z) for(int x=y;x>=z;x--)
#define int long long
const int maxn=4e6+105;
int n,mod;
int dp[maxn],pre[maxn],sav=0;
bool isPrime[maxn];
int Prime[maxn], cnt = 0;
void GetPrime(int n)
{
memset(isPrime,1,sizeof(isPrime));
isPrime[1]=0;
for(int i=2;i<=n;i++)
{
if(isPrime[i])
Prime[++cnt] = i;
for(int j = 1; j <= cnt && i*Prime[j] <= n; j++)
{
isPrime[i*Prime[j]] = 0;
if(i % Prime[j] == 0)
break;
}
}
}
vector<pair<int,int>>save;
int ii;
void dfs(int pos,int val)
{
if(pos==save.size())
{
if(val>1&&val!=ii)(sav=sav+dp[ii/val]-dp[ii/val-1]+mod)%=mod;
return;
}
int v=1;
dfs(pos+1,val);
for(int i=0;i<save[pos].second;i++)
{
v*=save[pos].first;
dfs(pos+1,val*v);
}
}
void solve()
{
cin>>n>>mod;
dp[1]=1,pre[1]=1;
dp[2]=2,pre[2]=2,sav=2;
rep(i,3,n)
{
(sav+=dp[1])%=mod;
int x=i;
save.clear();
for(int j=1;Prime[j]*Prime[j]<=x;j++)
{
if(x%Prime[j]!=0)continue;
int cnt=0;
while(x%Prime[j]==0)cnt++,x/=Prime[j];
save.push_back({Prime[j],cnt});
}
if(x>1)save.push_back({x,1});
ii=i;
dfs(0,1);
dp[i]=(pre[i-1]+sav)%mod;
pre[i]=(dp[i]+pre[i-1])%mod;
}
cout<<dp[n]<<"\n";
}
signed main()
{
GetPrime(maxn-20);
solve();
return 0;
}