首页 > 其他分享 >Codeforces Round #821 (Div. 2)

Codeforces Round #821 (Div. 2)

时间:2022-09-20 16:57:54浏览次数:88  
标签:return int Codeforces pos ans 操作 Div 821 define

Codeforces Round #821 (Div. 2)

C. Parity Shuffle Sorting

题目大意

每次操作可以选择l,r,如果\(a_l+a_r\)是奇数可以让\(a_l=a_r\),否则可以让\(a_l=a_r\),要求使用不超过n次操作使得序列变得有序。

分析

给出以下构造。首先操作1,n让序列首位相同,然后对于[2~n-1]的每个位置i,根据奇偶性选择操作(1,i

)或者(i,n)让第\(a_i=a_1/a_n\),显然操作完之后徐磊中所有元素都相等且操作次数不超过n次。

AC_code

#include <bits/stdc++.h>
#define fi first    
#define se second    
#define endl '\n'
#define ios ios::sync_with_stdio(false); cin.tie(0), cout.tie(0)
typedef long long LL;
using namespace std;
const int N = 1e5 + 10,M = N*2;
   
void solve() {
    int n;cin>>n;
    vector<int> a(n+1);
    for(int i=1;i<=n;i++) cin>>a[i];
    vector<array<int,2>> ans;
    if(a[1]!=a[n])
    {
        ans.push_back({1,n});
        if((a[1]+a[n])&1) a[n] = a[1];
        else a[1] = a[n];
    }
    for(int i=2;i<=n-1;i++)
    {
        if(a[i]==a[1]) continue;
        if(a[i]+a[1]&1) ans.push_back({1,i});
        else ans.push_back({i,n});
    }
    cout<<ans.size()<<'\n';
    for(auto x:ans) cout<<x[0]<<" "<<x[1]<<'\n';
}
 
int main() 
{
    ios;
    int T=1;
    cin>>T;
 
    while(T -- ) {
        solve();
    }
 
    return 0;
}

D2. Zero-One (Hard Version)

题目大意

给两01个字符串ab,长度都为n。你可以对a做以下操作任意次。

  1. 任选\(a_l,a_r\),将其值翻转
  2. 若区间长度>2,则代价为y,否则为x

分析

我们发现,每次操作的值翻转的都是两个,因此,不同的位置应该有偶数个,否则无解。

我们发现越远的点对使用第二种操作更好,因此使用第二种操作一定是从两边操作。

因此,我们每次操作,要不是改变开头的两个位置,要不是结尾的两个位置,要不就是改变开头和结尾各一个位置。

AC_code

#include <bits/stdc++.h>
#define fi first    
#define se second    
#define endl '\n'
#define ios ios::sync_with_stdio(false); cin.tie(0), cout.tie(0)
typedef long long LL;
using namespace std;
const int N = 5010,M = N*2;

char a[N],b[N];
LL f[N][N];
vector<int> pos;
int n,x,y;

LL dp(int l,int r)
{
    if(l>r) return 0ll;
    if(~f[l][r]) return f[l][r];
    LL ans = 1e18;
    ans = min(ans,dp(l+1,r-1)+y);
    ans = min(ans,dp(l,r-2)+min(1ll*y,1ll*x*(pos[r]-pos[r-1])));
    ans = min(ans,dp(l+2,r)+min(1ll*y,1ll*x*(pos[l+1]-pos[l])));
    return f[l][r] = ans;
}

void solve()
{
    cin>>n>>x>>y>>a+1>>b+1;
    pos.clear();
    for(int i=1;i<=n;i++) 
        if(a[i]!=b[i])
            pos.push_back(i);
    if(pos.size()&1)
    {
        cout<<"-1\n";
        return ;
    }
    if(!pos.size())
    {
        cout<<"0\n";
        return ;
    }
    if(x>=y)
    {
        if(pos.size()!=2)
        {
            cout<<1ll*pos.size()/2*y<<'\n';
            return ;
        }
        if(pos[0]+1!=pos[1])
        {
            cout<<y<<'\n';
            return ;
        }
        cout<<min(2*y,x)<<'\n';
    }
    else 
    {
        for(int i=0;i<pos.size();i++)
            for(int j=i;j<pos.size();j++)
                f[i][j] = -1;
        cout<<dp(0,pos.size()-1)<<'\n';
    }
}
 
int main() 
{
    ios;
    int T=1;
    cin>>T;
 
    while(T -- ) {
        solve();
    }
 
    return 0;
}

标签:return,int,Codeforces,pos,ans,操作,Div,821,define
From: https://www.cnblogs.com/aitejiu/p/16711620.html

相关文章

  • Codeforces #821 Div2(A~D2)题解
    CF#821Div2AConsecutiveSum题目:​ 选择\(i\)和\(j\),如果\(j=i+xk(x=R)\),可以交换\(i,j\)。任意选择一段长度为k的相加。思路:​ 题目等价于在下标\(mod\)k相同......
  • Workshop: Definition, Benefits, and Its Purpose for Individuals
    Workshop:Definition,Benefits,andItsPurposeforIndividualsHoldingaworkshopisoneofthecompany’seffortsinimprovingtheskillsandabilitiesofth......
  • Codeforces Round #813 (Div. 2)
    CodeforcesRound#813(Div.2)D.EmptyGraph分析我们通过简单的分析,可以得出一个结论,我们的答案一定来自于相邻两个点的位置或是最小值的两倍。我们考虑如何给构造......
  • CF round 812 div2 A-D 题解
    首先第一题TravelingSalesManProblem,给出一些坐标,就是问从原点出发,然后收集所有的点,问最少需要多少次移动这个就是求收集完那曼哈顿距离,这个距离稍加观察可以发现,就是......
  • Codeforces Round #640 (Div. 4) C. K-th Not Divisible by n
    CodeforcesRound#640(Div.4)翻译岛田小雅C.K-thNotDivisiblebyn出题人MikeMirzayanov有两个正整数\(n\)和\(k\),输出第\(k\)个不能被\(n\)整除的正整......
  • torch.nn.KLDivLoss
    CLASStorch.nn.KLDivLoss(size_average=None,reduce=None,reduction='mean',log_target=False)TheKullback-Leiblerdivergenceloss.Fortensorsofthesames......
  • CF1694E Keshi in Search of AmShZ#800(div.2)
    题目链接https://codeforces.com/contest/1694/problem/E题意简述\(Keshi\)准备从城市\(1\)出发,前往\(AmShZ\)所在的城市\(n\).这里一共有\(n\)个城市,编号......
  • Codeforces Round #819 D
    D.EdgeSplitn+2条边并且连通图就证明最多多3条边我们可以想到的是要是连成了环的话不如拆一条边给其他颜色所以我们一定要无环我们先跑一遍最小生成树确定成红色......
  • 一个div靠左另一个靠右
    1.使用flex布局<style> #back{ border:redsolid1px; width:800px; height:500px; display:flex; align-items:center; } #left{ ......
  • js在指定div右键菜单 js限制div内使用鼠标右键功能
     最近在做一个小东西的时候需要在某一个元素上“右击”触发一个自定义菜单,通过自定义的菜单对右击的条目进行编辑。这就要求屏蔽默认的右键菜单IE和FF下面的元素都有onc......