Codeforces Round #692 (Div. 2, based on Technocup 2021 Elimination Round 3)


B

题意

给你一个数,找到一个可以整除某个数任意一位的数

分析

1 2 3 4 5 6 7 8 9的lcm是2550,说明最大就是2550暴力即可

代码

#include 
#define ll long long
using namespace std;

int main()
{
ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--)
    {
        ll n,m;
        cin>>n;
        m=n;
        int flag=0;
        while(!flag)
        {
            while(n)
            {
                int x=n%10;
                if(x!=0)
                {
                    if(m%x!=0)
                    {
                        m++;
                        n=m;
                        break;
                    }
                }
                n/=10;
            }
            if(n==0)flag++;
        }
        cout<

C

题意

给你一个棋盘,一开始每个车不能在同一行同一列,然后最后让你把他们移动对角线

分析

如果是一个环就res++

代码

/*made in mrd*/
#include
using namespace std;
const int N=2e5+10;
const int M=5e3+10;
#define int long long
#define mem(a,b) memset(a,b,sizeof a)
#define fi first
#define se second
#define cout1(x) cout<
int f[N];
int find(int x)
{
    if(x!=f[x]) f[x]=find(f[x]);
    return f[x];
}
signed main() {
    int t;
    cin>>t;
    while(t--)
    {
        int n,m;
        cin>>n>>m;
        int res=m,cnt=0;
        for(int i=1;i<=n;i++) f[i]=i;
        for(int i=1;i<=m;i++)
        {
            int x,y;
            cin>>x>>y;
            if(x==y) res--;
            else if(find(x)==find(y)) cnt++;
            else {
                f[find(x)]=y;
            }
        }
        cout< .│? /│  Shift   │     │ ↑ │     │ 1 │ 2 │ 3 │   │
* ├─────┬──┴─┬─┴──┬┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐ ├───┴───┼───┤ E││
* │ Ctrl│ Win│ Alt│         Space         │ Alt│ Win│Menu│Ctrl│ │ ← │ ↓ │ → │ │   0   │ . │←─┘│
* └─────┴────┴────┴───────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ └───────┴───┴───┘
*/

D

题意

?可以变成1或0,01子序列可以获得x,10子序列可以获得y求最少可以多少

分析

file

代码

#include
using namespace std;
typedef long long LL;
const int N=1e5+10;
char str[N];
LL x,y;
int st[N][3],ed[N][3];//记录每个位置之前0,1,'?'的数量
vectorg;//存下每个问号的位置
int main()
{
    scanf("%s",str+1);
    scanf("%lld%lld",&x,&y);
    int len=strlen(str+1);
    for(int i=1;i<=len;i++)
    {//求前缀
        st[i][0]=st[i-1][0];
        st[i][1]=st[i-1][1];
        st[i][2]=st[i-1][2];
        if(str[i]=='0') st[i][0]++;
        else if(str[i]=='1') st[i][1]++;
        else
        {
            st[i][2]++;
            g.push_back(i);
        } 
    }
    for(int i=len;i>=1;i--)
    {//求后缀
        ed[i][0]=ed[i+1][0];
        ed[i][1]=ed[i+1][1];
        ed[i][2]=ed[i+1][2];
        if(str[i]=='0') ed[i][0]++;
        else if(str[i]=='1') ed[i][1]++;
        else ed[i][2]++;
    }
    LL num0=0,num1=0;//记录前缀中0和1的数量(先把'?'都先看成是1)
    LL ans=0;
    for(int i=1;i<=len;i++)
    {
        if(str[i]=='0')
        {
            ans=ans+num1*y;
            num0++;
        }
        else
        {
            ans=ans+num0*x;
            num1++;
        }
    }
    LL res=ans;
    if(x=0;i--)
        {//从后往前遍历问号的位置,并把它变成0
            int idx=g[i];
            res=res-st[idx-1][0]*x-(ed[idx+1][0]+ed[idx+1][2])*y;
            res=res+(st[idx-1][1]+st[idx-1][2])*y+ed[idx+1][1]*x;
            ans=min(res,ans);
        }
    }
    printf("%lld\n",ans);
    //system("pause");
    return 0;
}

CF