Codeforces #740 div2 A到D2 代码 附带视频题解

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;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值