首页 > 其他分享 >Codeforces Round 983 (Div. 2) A~D

Codeforces Round 983 (Div. 2) A~D

时间:2024-11-02 17:19:05浏览次数:6  
标签:const int 983 Codeforces ++ vector Div 节点 define

链接:Codeforces Round 983 (Div. 2)

A:Circuit

大意:

       n个灯,每个灯连两个开关,每个开关只连一个灯,每个灯对应的两个开关如果异或为1就亮

        现给定开关状态,求灯亮的最大和最小数量

思路:

       求最小数量的话,将开关为1的尽量组一起,我们发现,如果开关为1的数量为奇数,最小亮一个灯,偶数不亮灯

        求最大数量,将开关为1的如果<= n,直接输出开关为一的数量就行,开关为1的大于n,输出2n-开关为1即可,因为这就相当于先给每个灯安排一个为1的开关,然后剩下的为1的开关慢慢踩灯,那最后亮的就是n - (cnt  - n)

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 10, INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
#define pb push_back
#define  vi vector<int>
#define  vii vector<pair<int, int>>
#define ff first 
#define ss second 
// ++   ~!    */+-    <<>>    <>  ==   &^|   &&|| =

void solve()
{
    int n;cin >> n;
    int cnt = 0;
    for (int i = 1; i <= n * 2; i++)
    {
        int x;cin >> x;
        cnt += x;
    }

    int mx, mn;
    if (cnt <= n)
    {
        mx = cnt;
        mn = cnt & 1;
    }
    else
    {
        mx = 2 * n - cnt;
        mn = cnt & 1;
    }
    cout << mn << ' ' << mx << endl;

}

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

    return 0;
}
/*   /\_/\
*   (= ._.)
*   / >  \>
*/

 B:Medians

大意:

        给一组长度为奇数的排列1~n,分成奇数个子数组,求子数组的中位数构成的数组的中位数能否是k,能的话输出方案

思路:

        这道题n是奇数,并且限制子数组为奇数,这就说明,每个中位数都是排列中的数

        首先考虑中位数为k不存在的情况,当k不存在时,k只可能是1或者n(n=1的时候除外),因为中位数只可能是中间的数

        k如果合理,那么我们可以分成左边m个子数组,右边m个子数组,中间以k为中位数,为了方便输出,可以取中间只包含k,然后对m进行奇偶讨论,奇数直接左右都是一整块,偶数再拆分成两个奇数(偶数也可以让中间的子数组变成三个数,最后也输出三个子数组),构成五个子数组

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 10, INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
#define pb push_back
#define  vi vector<int>
#define  vii vector<pair<int, int>>
#define ff first 
#define ss second 
// ++   ~!    */+-    <<>>    <>  ==   &^|   &&|| =

void solve()
{
    int n, k;cin >> n >> k;
    if (n == 1)
    {
        cout << 1 << endl;
        cout << 1 << endl;
    }
    else if (k == 1 || k == n)
    {
        cout << -1 << endl;
    }
    else if (n == 3 && k == 2)
    {
        cout << 3 << endl;
        cout << "1 2 3" << endl;
    }
    else 
    {
        if ((k & 1 )== 0)
        {
            cout << 3 << endl;
            cout << 1 << ' ' << k << ' ' << k + 1 <<endl;
        }
        else if(k & 1)
        {
            cout << 5 << endl;
            cout << 1 << ' ' << 2 << ' ' << k << ' ' << k + 1 << ' ' << k + 2 << endl;
        }
    }

}

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

    return 0;
}
/*   /\_/\
*   (= ._.)
*   / >  \>
*/

C:Trinity

大意:

        给一组数,问最少可以通过赋值(a[i] = a[j])几次使得,对于任意三个数,都能组成三角形

思路:

        这道题的话,可以排个序,然后求最大的合法区间长度,然后用n减去即可

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 10, INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
#define pb push_back
#define  vi vector<int>
#define  vii vector<pair<int, int>>
#define ff first 
#define ss second 
// ++   ~!    */+-    <<>>    <>  ==   &^|   &&|| =

void solve()
{
    int n;cin >> n;
    vi a(n);
    for (int i = 0; i < n; i++)cin >> a[i];
    sort(a.begin(), a.end());
    vi dp(n);

    int num = 0;
    for (int i = 0, j = 2; i < n - 2; i++)
    {
        while (j < n && a[i] + a[i + 1] > a[j])j++;
        num = max(num, j - i);
        if (j == n)break;
    }
    cout << n - num << endl;

}

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

    return 0;
}
/*   /\_/\
*   (= ._.)
*   / >  \>
*/

D:Genokraken

大意:

        交互题,有一颗树,节点为0~n-1,砍下树根之后,剩下的就变成一条条链子了,并且一个节点父亲的编号是小于该节点编号的

        1、去掉树根,同一路径上就没有兄弟了

        2、p[i] < i

        3、x < y,p[x] < p[y]

请还原这棵树

思路:

        1、p[i] < i,我们可以按编号从小到大一个一个问,从树根开始不断还原这棵树:因为p[i] < i, 那么1节点的父节点就是0了;2节点呢?0或者1;3?0或1或2。。。

        2、x < y,p[x] < p[y]

这棵树特征是这样的,每个节点要不就跟上一个编号的节点,父亲在相同层,父亲的编号小于上一个编号的父亲的编号(树根除外),要不就是上一个编号节点的儿子

        那我们就先还原链子的头,找到树根的儿子,询问1和之后的编号,直到出现1的儿子,然后后面就依次找了,对于某个节点,一层一层地询问了相当于,直到找到父亲,然后继续往下问,将每个节点父亲全部问完,然后就输出答案

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 10, INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
#define pb push_back
#define  vi vector<int>
#define  vii vector<pair<int, int>>
#define ff first 
#define ss second 
// ++   ~!    */+-    <<>>    <>  ==   &^|   &&|| =

int query(int a, int b) // 0父子,1不同链
{
    cout << "? " << a << ' ' << b << endl;
    cout.flush();
    int x;
    cin >> x;
    return x;
}

void answer(const vi& v)
{
    cout << "! ";
    for (int i = 1; i < v.size(); i++)
    {
        cout << v[i] << ' ';
    }
    cout << endl;
    cout.flush();
}

void solve()
{
    
    int n;cin >> n;
    vi p(n);
    int i = 2, j = 2;
    while (query(1, j))//先找直接跟根节点相连的
        p[j ++] = 0;
        
    p[j ++] = 1;


    while (j < n) // j一个一个找父亲
    {
        while (query(i, j))i ++;

        p[j ++] = i++;
    }
    answer(p);

}

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

    return 0;
}
/*   /\_/\
*   (= ._.)
*   / >  \>
*/

标签:const,int,983,Codeforces,++,vector,Div,节点,define
From: https://blog.csdn.net/weixin_47774773/article/details/143452543

相关文章

  • Codeforces Round 983 Div2 A-C
    目录A-CircuitB-MediansC-TrinityD-总结与思考A-Circuit题目概述Alice刚刚制作了一个包含n个灯和2n个开关的电路。每个组件(灯或开关)有两种状态:开或关。灯和开关的排列方式如下:每个灯连接恰好两个开关。每个开关连接恰好一个灯。但并不知道每个开关......
  • Codeforces Round 983 (Div. 2)
    A最坏的情况就是所有开着的开关尽可能配对最好的情况就是所有开着的开关尽可能不配对#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;typedefpair<int,int>PII;constintN=1e6+10;constintmod=998244353;constintINF=0x3f3f3f3f;constllI......
  • Codeforces Round 983 div2 个人题解(A~D)
    CodeforcesRound983div2个人题解(A~D)Dashboard-CodeforcesRound983(Div.2)-Codeforces火车头#define_CRT_SECURE_NO_WARNINGS1#include<algorithm>#include<array>#include<bitset>#include<cassert>#include<cmath>#in......
  • CodeForces Dora and C++ (2007C) 题解
    CodeForcesDoraandC++(2007C)题解题意给一个数组\(c_{1...n}\),定义数组的\(range\)是最大值减最小值,即极差。给出两个值\(a\)和\(b\),每步操作中,可给数组中任一一个数增大\(a\)或增大\(b\)。问任意步操作后(可以是\(0\)步),极差的最小值。思路(要直接看答案可以跳......
  • Codeforces Round 982 (Div. 2)解题报告
    CodeforcesRound982(Div.2)解题报告A显然答案不会小于\(2(\maxw+\maxh)\)。构造方案学习样例一,挺明显的。B有个小性质(好像没用):一旦能通过操作变成non-increasing,再对整个序列操作一次必然变为同一个数字。我们把一开始remove的数字记为A类,通过操作删掉的记为B类......
  • Educational Codeforces Round 20 E. Roma and Poker
    差分约束我们记W表示\(1\),L表示\(-1\),D表示\(0\),然后记前\(i\)位的前缀和是\(dis[i]\)。则我们可以根据题面得到如下约束。当前位是W,则有\[\left\{\begin{matrix}dis[i]-dis[i-1]\le1\\dis[i-1]-dis[i]\le-1\end{matrix}\right.\]当前位是L,则有\[\left\{\begin{m......
  • Codeforces Round 977 (Div. 2, based on COMPFEST 16 - Final Round)
    Preface这场其实是上周四VP的,因为当时马上要出发打济南站了,但因为挺久没写代码了所以打算临阵磨枪一下好家伙结果Div.2D不会做直接给人整麻了,不过好在看了眼榜把E2写了,后面发现这个D想到了就不难A.MeaningMean容易发现从小到大操作一定最优#include<cstdio>#inc......
  • dreamweaver家乡主题网页设计 DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下
    家乡旅游景点网页作业制作网页代码运用了DIV盒子的使用方法,如盒子的嵌套、浮动、margin、border、background等属性的使用,外部大盒子设定居中,内部左中右布局,下方横向浮动排列,大学学习的前端知识点和布局方式都有运用,CSS的代码量也很足、很细致,使用hover来完成过渡效果、鼠......
  • Educational Codeforces Round 171 (Rated for Div. 2)B-D
    B.BlackCells题目:思路:首先我们发现要分奇偶讨论。偶数:很简单,取a[2]-a[1],a[4]-a[3],.........a[n]-[n-1]的最大值。奇数:我只需要知道假如删除当前的这个数剩下的数最大的间隔值,注意只能删除1,3,等奇数位,因为要保证删除后左右的数为偶数。(我的代码里面是偶数位因......
  • Codeforces Round 978(div.2) D1
    #感觉挺有意思的一道题题目:思路:观察发现对于两个人a,b如果两个人里面没有Impostor那么,你得到的回答是一样的,如果有impostor那么结果不同,那么我们就可以两个两个的询问,先找到2个人里面有impostor然后在找另外一个人来询问就行了。代码:#include<bits/stdc++.h>usin......