首页 > 其他分享 >Codeforces Round 922 (A-C)

Codeforces Round 922 (A-C)

时间:2024-01-31 09:44:05浏览次数:29  
标签:地砖 倒置 int Codeforces 贡献 放置 序列 922 Round

第一次打Div2,对我来说还是很难,写篇博客记录一下~
A题
题意:T组输入,每组输入一个n,m,代表nm大小的地板,以1k大小的地砖完全覆盖地板(k>=2,且同一地板中k可以不同)。将水平放置的地砖与垂直放置的地砖相减的值定义为稳定性,求最大的稳定性是多少。
思路:
尽可能的使得水平放置的地砖多,垂直放置的地砖少,且地砖的总数尽可能多。
地砖总数尽可能多可以通过仅使用12大小的地砖实现,水平放置的地砖尽可能多可以通过先一直放置水平地砖,无法放置了再放垂直地砖实现。
但,真的有放置垂直地砖的需要吗?由于我们一直使用的是1
2大小的地砖来保证地砖总数尽可能多,但如果列数m是一个奇数就会有一列无法填补完全需要使用垂直的砖块。但题目给出地砖的大小可以为不同,因此我们可以在最后一列无法填补时将将最后一块砖换成1*3大小的刚好将最后一列填上,这样就能保证砖头总数最多的同时垂直放置的地砖最少。
代码

 int main()
 {
    int t;
    cin>>t;
    while(t--)
    {
        int n,m;
        cin>>n>>m;
        int k=m/2;
        cout<<n*k<<"\n";
    }

    return 0;
 }

B题
题意:给出一个n和两个长度为n的序列a,b。a,b中的值为1~n,且序列中元素不重复。有一种可以进行无限次的操作,选择一对(i,j),同时将(a[i],a[j])与(b[i],b[j])交换。当i<j时,若a[i]>a[j],则认为(i,j)是倒置的,要求求出a,b序列经操作后倒置对数最少的可能。
思路:
先将a序列排序,再考虑减少b序列中的倒置对数。
将a序列排完序后发现,此时如果将a序列中任意一对数交换,则a序列一定会多出一对倒置的数,而b序列却不一定减少倒置的数,若减少倒置的数也仅会减少一对。
如:
a序列:{1,2,3,4,5}
b序列:{5,2,4,3,1}
将a序列的(4,5)交换,a序列多出一对倒置对数,将b序列(3,1)交换,b序列倒置对数不变,总体多了一对倒置对数。因此,将a序列从小到大排完序后的结果就是答案。
代码

const int N=2e5+10;
int t,n;
int b[N];
struct node
{
    int x,y;
}a[N];

bool cmp(node x,node y)
{
    return x.x<y.x;
}

int main()
{
    cin>>t;
    while(t--)
    {
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i].x;
            a[i].y=i;
        }
        for(int i=1;i<=n;i++)
        {
            cin>>b[i];
        }
        sort(a+1,a+n+1,cmp);
        for(int i=1;i<=n;i++)
        {
            cout<<a[i].x<<" \n"[i==n];
        }
        for(int i=1;i<=n;i++)
        {
            cout<<b[a[i].y]<<" \n"[i==n];
        }
    }

    return 0;
}

C题
题意:给出一个a,b,r,求出|((a ^ x)-(b ^ x))|(0<=x<=r)的最小值。
思路:按位计算贡献。
很明显当a与b的第i位都是0或1时,那么无论怎么异或都不会对结果产生影响,即贡献为0。
如: a=2,b=2时;
a的二进制为 10
b的二进制为 10
当x也为2时,1 ^ 1 = 0,0 ^ 0 = 0,a ^ x = 0,b ^ x = 0,a-b=0。
当x为0时,1 ^ 0 = 1,0 ^ 0 = 0,a ^ x = 2,b ^ x = 2,a - b = 0。
因此我们仅需要考虑a与b第i位不相等的情况。
当a的第i位为1,b的第i位位0时,就会产生2的i次贡献,当a的第i位为0,b的第i位为1时,就会产生负的2的i次的贡献。
如: a=5,b=3时
a的二进制为 1 0 1
b的二进制为 0 1 1
贡献 4 -2 0
总的贡献为2,即在不进行操作的情况下差值为2。
而若进行操作使得贡献最小,很明显应该将a,b每一位的贡献转换为正+负+负……或负+正+正……
如:
a为 1 1 1 0 1
b为 0 0 1 0 1
贡献 16 8 0 0 0
显然将贡献为8的那一位转换为-8能够得到最小的贡献。
然而,x的取值范围必须小于等于r,因此,我们还需要一点点的贪心,使得x尽可能将贡献和减小。
代码

#include <bits/stdc++.h>
#define ios                      \
    ios::sync_with_stdio(false); \
    cin.tie(0);                  \
    cout.tie(0)

using namespace std;

int add(int x, int y) { return x ? add((x & y) << 1, x ^ y) : y; }

#define ONLINE_JUDGE

typedef long long ll;
int t;

int main()
{
#ifndef ONLINE_JUDGE
    freopen("1.in", "r", stdin);
    freopen("1.out", "w", stdout);
#endif
    ios;
    cin >> t;
    while (t--)
    {
        ll a, b, r;
        cin >> a >> b >> r;
        bool flag = true;
        ll now = 0;
        for (ll i = 60; i >= 0; i--)
        {
            bool x = (a & (1LL << i));
            bool y = (b & (1LL << i));
            if (x == y)
            {
                continue;
            }
            if (flag)
            {
                now = (1LL << i) * (x - y);
                flag = false;
            }
            else
            {
                if (r >= (1LL << i) && (x - y) * now > 0)
                {
                    r -= (1LL << i);
                    now -= (x - y) * (1LL << i);
                }
                else
                {
                    now += (x - y) * (1LL << i);
                }
            }
        }
        if (now > 0)
        {
            cout << now << "\n";
        }
        else
        {
            cout << -now << "\n";
        }
    }

    return 0;
}

标签:地砖,倒置,int,Codeforces,贡献,放置,序列,922,Round
From: https://www.cnblogs.com/Aliciaandsakura/p/17998487

相关文章

  • [LMXOI Round 1] Size
    \(\sumd_i<=5*10^7\)一定是解题的突破口;可是,该怎么利用这个条件呢?不妨更进一步——考虑数据的特征,发现数字的种类是有限的点击查看代码#include<bits/stdc++.h>usingnamespacestd;intd[2000005],r[2000005];map<int,longlong>q;intread1(){ charcc=getchar()......
  • 牛客周赛 Round 30
    牛客周赛Round30A代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusingi128=__int128_t;voidsolve(){strings;cin>>s;for(inti=0;......
  • 牛客周赛 Round 29
    C题:用桶处理字符串重排小红拿到了一个字符串,其中一定包含连续子串"xiao",和连续子串"hong"。请你将字符串重排,使得该字符串包含"xiaohong"的连续子串。较简单的做法:遍历字符串,给每个字符放到相应的桶中,然后先先输出目标字符串xiaohong,同时对桶进行相对应的调整。最后再按任意顺......
  • CodeForces 1239E Turtle
    洛谷传送门CF传送门放放/ll/ll/ll。这题是个性质题。首先第一排一定是升序,第二排一定是降序。考虑第一排若存在\(i<j\)使得\(a_{1,i}>a_{1,j}\),那么交换这两个数不会变劣。第二排类似。然后发现在\(1\)走下去或在\(n\)走下去最优。考虑先求出从\(1\)走下去的......
  • P10114 [LMXOI Round 1] Size 题解
    题目链接:[LMXOIRound1]Size挺有意思的诈骗题,其实这类题都喜欢批一个外壳,例如数据范围提示之类的。记得以前遇到的很多诈骗题,有一道cf的高分题,问的是区间出现次数的次数\(mex\),这玩意一开始感觉好难,出现次数还简单,还要考虑次数的次数,所以带修莫队的时候,一直没法确定怎么解决......
  • Codeforces Round 921 (Div. 2)
    目录写在前面ABCDE写在最后写在前面比赛地址:https://codeforces.com/contest/1925。在床上躺了两天终于复活了妈的。A发现字符串\(s\)合法当且仅当\(s\)可以被分为至少\(n\)段,其中每段都包含\(k\)种字符至少1次。正确性可以归纳证明,这里懒得写了感性理解下。于是......
  • CodeTON Round 7 (Div. 1 + Div. 2, Rated, Prizes!)
    CodeTONRound7(Div.1+Div.2,Rated,Prizes!)比赛链接A.JaggedSwaps思路:考虑到题目要求,给定的排列第一位必须是1才会构造出可行性序列,如果不是就是没有办法Code#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongvoidsolve(){ intn; cin......
  • Codeforces Round 921 (Div. 2)
    A-WeGotEverythingCovered!难度:⭐题目大意给定n和k两个整数,要求用前k个小写字母组成一个字符串;该字符串的子串应包含所有由前k个字母组成的长度为n的字符串全排列;要求输出最短的满足条件的字符串;解题思路这题题目挺唬人,但其实是个水题;所谓最短,其实......
  • Codeforces Round 921 (Div. 2)(A~E)
    好久不打用小号水了一场,赛时坑坑拌拌勉强四题,以为美美上分,结果重测时卡掉了我没细想复杂度就交了的B题,这下小丑了 A.WeGotEverythingCovered!直接输出n次连续前k个字母即可#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongsignedmain(){ ios......
  • Codeforces Round 921 (Div. 2)
    CodeforcesRound921(Div.2)A-WeGotEverythingCovered!解题思路:以前\(k\)个字符都出现过至少一次为一轮,构造\(n\)轮即可。代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecon......