首页 > 其他分享 >Codeforces Round 903 (Div. 3)

Codeforces Round 903 (Div. 3)

时间:2024-02-18 13:56:17浏览次数:34  
标签:903 int Codeforces long dep solve Div left define

题目链接

A.

按题意模拟
字符串find函数
if(x.find(s)==string::npos)//没找到

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f

void solve() {
    int n,m;cin>>n>>m;
    string x,s;cin>>x>>s;
    int cnt=0;
    while(x.size()<100){
        if(x.find(s)==string::npos){
            x=x+x;cnt++;
        }else{
            cout<<cnt<<'\n';
            return ;
        }
    }
    cout<<"-1\n";
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

B.

先排序,再判大数是不是小数的整数倍,若不是则NO
再计算出割断的次数,小等于3才是YES

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f

void solve() {
    int a[5];
    for(int i=1;i<=3;i++)cin>>a[i];
    sort(a+1,a+1+3);
    int cnt=0;
    for(int i=2;i<=3;i++){
        if(a[i]%a[1]!=0){
            cout<<"NO\n";return ;
        }
        cnt+=a[i]/a[1]-1;
    }
    if(cnt<=3)cout<<"YES\n";
    else cout<<"NO\n";
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

C.

找到点(i,j)旋转后的其他3个位置,取最大值
算出操作次数即可

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e3+10;
#define inf 0x3f3f3f3f

int g[N][N];
void solve() {
    int n;cin>>n;
    char c;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
            cin>>c;
            g[i][j]=c-'a';
        }
    int cnt=0;
    for(int i=1;i<=n/2;i++){
        for(int j=1;j<=n/2;j++){
            int ma=max({g[i][j],g[n-j+1][i],g[j][n-i+1],g[n-i+1][n-j+1]});
            int tmp=g[i][j]+g[n-j+1][i]+g[j][n-i+1]+g[n-i+1][n-j+1];
            cnt+=ma*4-tmp;
        }
    }
    cout<<cnt<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

D.

考虑把所有数都进行质因数分解(分成最小单位)
然后看每种质因数是否都有n的整数倍个,这样一定能通过若干操作后使每个数相同
类似于守恒

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f

void solve() {
    int n;cin>>n;
    map<int,int>mp;
    for(int i=1,x;i<=n;i++){
        cin>>x;
        //cout<<"x="<<x<<'\n';
        mp[1]++;
        for(int j=2;j*j<=x;j++){
            if(x%j==0){
                while(x%j==0){
                    mp[j]++;
                    x/=j;
                    //cout<<j<<'\n';
                  //  cout<<"x="<<x<<'\n';
                }
                //cout<<"x="<<x<<' '<<"j="<<j<<'\n';
            }
        }
        //cout<<'\n';
        if(x>1)mp[x]++;
    }
    for(auto t:mp){
        if(t.second%n==0)continue;
        cout<<"NO\n";return ;
    }
    cout<<"YES\n";
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

E.

从后往前dp,看当前数作为区间开头能否更优,否则就删掉

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=2e5+10;
#define inf 0x3f3f3f3f

int a[N];
void solve() {
    int n;cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    vector<int>dp(n+10,0);
    dp[n]=1;dp[n+1]=0;
    for(int i=n-1;i>=1;i--){
        if(i+a[i]<=n){
            dp[i]=min(dp[i+a[i]+1],dp[i+1]+1);
        }else{
            dp[i]=dp[i+1]+1;
        }
    }
    cout<<dp[1]<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

F.

首先,最远考虑直径,再最小考虑直径的中间值
问题转化成距离最远的两个标记点的一半
那么就是标记点之间的直径的一半

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=2e5+10;
#define inf 0x3f3f3f3f

int n,k;
vector<int>vis;
vector<vector<int>>g;
int d1,d2;
int dep_d1,dep_d2;
void dfs1(int u,int fa,int dep){
    if(vis[u]&&dep>dep_d1){
        dep_d1=dep;
        d1=u;
    }
    for(int i=0;i<g[u].size();i++){
        int y=g[u][i];
        if(y==fa)continue;
        dfs1(y,u,dep+1);
    }
}
void dfs2(int u,int fa,int dep){
    if(vis[u]&&dep>dep_d2){
        dep_d2=dep;
        d2=u;
    }
    for(int i=0;i<g[u].size();i++){
        int y=g[u][i];
        if(y==fa)continue;
        dfs2(y,u,dep+1);
    }
}
void solve() {
    dep_d1=0;dep_d2=0;
    cin>>n>>k;
    vis=vector<int>(n+1);
    g=vector<vector<int>>(n+1);
    for(int i=1,x;i<=k;i++){
        cin>>x;
        vis[x]++;
    }
    for(int i=1,u,v;i<n;i++){
        cin>>u>>v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    if(n==1||k==1){
        cout<<"0\n";return ;
    }
    if(n==2){
        cout<<"1\n";return ;
    }
    for(int i=1;i<=n;i++){
        if(vis[i]){
            dfs1(i,0,1);
//     cout<<"i="<<i<<'\n';
            break;
        }
    }
    dfs2(d1,0,1);
  //  cout<<"d1="<<d1<<' '<<"d2="<<d2<<'\n';
    cout<<dep_d2/2<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

标签:903,int,Codeforces,long,dep,solve,Div,left,define
From: https://www.cnblogs.com/wwww-/p/18016379

相关文章

  • CF1929 Codeforces Round 926 (Div. 2)
    C.SashaandtheCasino当\(k<x\)时,显然我们只需要每次下注一个硬币就好了.当\(k>x\)时.考虑先一个一个的下硬币,那么为了保证不亏本,最多输\(k-2\)局,然后在第\(k-1\)局赢,这样才能盈利\(1\)个硬币.那么在第\(k\)局之后呢?此时我们最少也需要下注两个硬币,这......
  • 【赛后反思】【LGR-175 Div.4】 洛谷入门赛#20 赛后反思
    洛谷入门赛#20赛后反思今日推歌:《水与水之歌feat.绮萱》きくお呆在这里直到精神恍惚为止让我们一起快乐地玩耍我们术术人有自己的《让我们荡起双桨》(大雾Before先看结果(是同步赛的成绩,因为前一天晚上我在死磕dfs):省流:暴力-纯度75%STL-纯度25%展开目录目录洛谷入......
  • Codeforces Round 922 (Div. 2)
    A.BrickWall因为水平砖块的长度至少为\(2\),所以一行中水平砖块最多放\(\lfloor\frac{m}{2}\rfloor\)块,因此答案不超过\(n\cdot\lfloor\frac{m}{2}\rfloor\)。如果\(m\)是奇数,用长度为\(\lfloor\frac{m}{2}\rfloor\)的水平砖块平铺过去,最后一块长度为\(3\),这样......
  • Codeforces 解题报告(202402)
    CodeforcesRound926D-SashaandaWalkintheCitydp,主要难点在于设状态。发现子树内一旦存在一个点,到当前子树的根节点路径上有两个危险点,那么除了那条链所属的子树,其他的点就都不能选了。所以把这个性质放进状态,设\(f_{u,0/1}\)表示以\(u\)为根的子树内,是否存在一......
  • Codeforces(1500板刷)
    目录写在前面1.A.DidWeGetEverythingCovered?(构造、思维)题目链接题意题解代码总结2F.Greetings(离散化+树状数组)题目链接题意题解代码总结写在前面开始板刷1500了,主要是最近卡1300-1400上不去,发现cf很多思维题要不是想不到,要不就是签的慢,被读题卡了心态就巨难受,一下就......
  • Codeforces Round 926 (Div. 2) 总结
    A题意:给出一个数组,让你重新排序,\(\sum_{i=1}^{n-1}a_i-a_{i+1}\)最大。做法:显然从小到大排序即可,答案就是最大值减去最小值。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=1e6+5,MOD=998244353;signedmain(){ios::sync_with_s......
  • Codeforces Round 926 (Div. 2) DEF
    D.SashaandaWalkintheCity题意:给定一棵树,问不存在三个点属于同一条路径的点集个数。\(f[x]\)表示,最近公共祖先为\(x\)的合法非空集数量。如果选\(x\),那么只能为不选子树或选一棵子树,否则\(u\insubtree[y_1]\),\(v\insubtree[y_2]\)与\(x\)共链。?贡献为\(......
  • Codeforces Round 926 (Div. 2) 赛后总结
    这场比赛掉了前三场比赛上的分,望周知。SashaandtheBeautifulArray题目大意:一个有n个数的数组,对n个数进行排序,求数组中ai-ai-1(下标从2到n)的和的最大值。分析列出来和式,为an-an-1+an-1-an-2……-a1最后得到an-a1那么an最大,a1最小即可。很容易想到排序。#include<i......
  • Codeforces Round 926 (Div. 2)(A~D)
    目录ABCDA输出最大值减最小值,或者排序算一下答案#include<bits/stdc++.h>#defineintlonglong#definerep(i,a,b)for(inti=(a);i<=(b);++i)#definefep(i,a,b)for(inti=(a);i>=(b);--i)#definepiipair<int,int>#definelllonglong#definedb......
  • Codeforces Round 926 (Div. 2) 题解
    比赛链接:https://codeforces.com/contest/1929官解链接:https://codeforces.com/blog/entry/125943出的很差的一场。推歌CF1929A.SashaandtheBeautifulArray题意任意排列数组\(a_{1..n}\),求\(\sum_{i=2}^n(a_i-a_{i-1})\)的最大值。题解见过最显然的A题,奠定了......