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

Codeforces Round 908 (Div. 2)

时间:2024-03-16 17:01:20浏览次数:24  
标签:int 908 Codeforces long LIS using Div ll define

Codeforces Round 908 (Div. 2)

A - Secret Sport

解题思路:

有一说一,没看很懂,感觉最后赢的就是赢了。。。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using piii = pair<ll, pair<ll, ll>>;
const ll inf = 1ll << 60;
using ull = unsigned long long;
const int mod = 998244353;

void solve()
{
    int n;
    cin >> n;
    string s;
    cin >> s;
    s = ' ' + s;
    cout << s.back() << "\n";
}

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

B - Two Out of Three

解题思路:

选取两个不同的数字,分别满足\((1,2),(1,3)\)对,其余全部设为\(1\).

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using piii = pair<ll, pair<ll, ll>>;
const ll inf = 1ll << 60;
using ull = unsigned long long;
const int mod = 998244353;

void solve()
{
    int n;
    cin >> n;
    vector<int> a(n + 1), cnt(100 + 10);
    vector<vector<int>> pos(100 + 1, vector<int>());
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        cnt[a[i]]++;
        pos[a[i]].push_back(i);
    }
    int num = 0;
    for (int i = 1; i <= 100; i++)
    {
        if (cnt[i] > 1)
        {
            num++;
        }
    }
    if (num < 2)
    {
        cout << -1 << "\n";
        return;
    }
    vector<int> ans(n + 1);
    int t = 3;
    for (int i = 1; i <= 100; i++)
    {
        if (cnt[i] > 1)
        {
            int len = pos[i].size();
            for (int j = 0; j < len; j++)
            {
                if (j == 0)
                {
                    ans[pos[i][j]] = 1;
                }
                else
                {
                    ans[pos[i][j]] = t;
                }
            }
            if (t == 3)
            {
                t = 2;
            }
            else
            {
                t = 0;
            }
        }
        if (t == 0)
        {
            break;
        }
    }
    for (int i = 1; i <= n; i++)
    {
        if (!ans[i])
        {
            ans[i] = 1;
        }
    }
    for (int i = 1; i <= n; i++)
    {
        cout << ans[i] << " \n"[i == n];
    }
}

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

C - Anonymous Informant

解题思路:

正着想没头绪,思考反向操作。

发现反向操作模拟方便,如果能够反向操作\(n\)次,那么一定能形成一个循环操作(可能不到\(n\)次就开始循环了)。

所以,对于\(k < n\),我们可以直接模拟\(k\)次反向操作是否合法。

对于\(k \geq n\),如果\(n\)次合法,那么一定可以无限操作,\(k\)也合法。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using piii = pair<ll, pair<ll, ll>>;
const ll inf = 1ll << 60;
using ull = unsigned long long;
const int mod = 998244353;

void solve()
{
    int n, k;
    cin >> n >> k;
    vector<int> a(n + 1);
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    int cur = n;
    for (int i = 1; i <= min(k, n + 1); i++)
    {
        if (a[cur] > n)
        {
            cout << "NO\n";
            return;
        }
        cur = (cur - 1 - a[cur] + n) % n + 1;
    }
    cout << "YES\n";
}

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

D - Neutral Tonality

解题思路:

新序列的\(LIS\)一定大于等于原序列\(LIS\),我们的目的就是尽量让\(LIS\)保持不变。

先将\(b\)进行降序排序。

对于将大于\(a_1\)的元素降序插入到\(a_1\)之前。

  • 如果原\(LIS\)包括\(a_1\),那么首位降序插入的元素最多选一个替代\(a_1\),\(LIS\)不会增长。
  • 如果原\(LIS\)不包括\(a_1\),那么\(a_1\)一定大于等于原\(LIS\)的首位,插入的元素也一定大于等于原\(LIS\)首位,那么首位降序插入的元素最多选一个替代\(a_1\),\(LIS\)不会增长。

将剩余的元素降序插入到\(a_n\)之后。

  • 如果原\(LIS\)包括\(a_1\),那么最后降序插入的元素都小于\(a_1\)​,同样最多选一个进行替换,\(LIS\)不会增长。
  • 如果原\(LIS\)不包括\(a_1\),那么\(a_1\)一定大于等于原\(LIS\)的首位,同理。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using piii = pair<ll, pair<ll, ll>>;
const ll inf = 1ll << 60;
using ull = unsigned long long;
const int mod = 998244353;

void solve()
{
    int n, m;
    cin >> n >> m;
    vector<int> a(n + 1), b(m + 1);
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    for (int i = 1; i <= m; i++)
    {
        cin >> b[i];
    }
    sort(b.begin() + 1, b.end());
    vector<int> ans;
    int j = m;
    for (int i = 1; i <= n; i++)
    {
        while (j > 0 && b[j] >= a[i])
        {
            cout << b[j--] << ' ';
        }
        cout << a[i] << ' ';
    }
    while (j > 0)
    {
        cout << b[j--] << ' ';
    }
    cout << endl;
}

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

标签:int,908,Codeforces,long,LIS,using,Div,ll,define
From: https://www.cnblogs.com/value0/p/18077284

相关文章

  • Codeforces 1948G MST with Matching
    因为贡献是两个之和,考虑固定下一个,求解另一个的最优。\(\text{MST}\)似乎找不到什么好的办法固定,便考虑固定下最大匹配。对于树的最大匹配,考虑到因为树也是二分图,所以树的最大匹配\(=\)最小点覆盖。考虑如果知道了最小点覆盖内的点,那就说明如果一条边两个端点都不在点集中,是......
  • Educational Codeforces Round 163 A-E
    A.SpecialCharacters构造。形如\(A\)和\(B\)这类单个字符构成的字符串对答案的贡献为\(0\),而\(AA\)和\(AAAA\)这类多个相同字符构成的字符串对答案的贡献固定为\(2\)​,则无法构造出奇数值,由第二类字符串拼接即可构造出偶数值。时间复杂度:\(O(n)\)。#include<bit......
  • Codeforces 1948E Clique Partition
    考虑到有\(|i-j|\),所以肯定是让相邻的一部分在一个团里。考虑构造出一个最长长度的,后面类似复制几遍即可。考虑到\(|k-1|=k-1\),且因为\(a_i\)为一个排列,差的绝对值至少为\(1\),所以只考虑两端最长长度也只可能为\(k\)。不妨先假设最长长度为\(k\)来构造。那么......
  • Codeforces-1005C
    https://codeforces.com/problemset/problem/1005/C一、代码目录#include<bits/stdc++.h>usingnamespacestd;voidsolve(){inta[122222],n,ans=0;map<int,int>m;scanf("%d",&n);for(inti=0;i<n;i++){......
  • Educational Codeforces Round 163 (Rated for Div. 2)
    EducationalCodeforcesRound163(RatedforDiv.2)A-SpecialCharacters解题思路:一个相同的连续段会贡献两个特殊字符,所以答案一定是偶数,找个不同的数分隔开即可。代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll......
  • 无线电模块ODIN-W263-06B专为物联网网关应用而设计,QN9080-001-M17Y支持蓝牙和NFC的模
    本篇文章主要介绍三款无线模块:无线电模块ODIN-W263-06B专为物联网网关应用而设计,QN9080-001-M17Y支持蓝牙和NFC的模块,RS9116W-DB00-AB1多协议无线模块——明佳达1、ODIN-W2系列:具有Wi-Fi和蓝牙双模式(蓝牙BR/EDR和蓝牙低能耗v4.2)描述:ODIN-W2是一款紧凑而强大的独立多无线电模块......
  • 3.14 CF Round 933 (Div. 3)
    (1)CF1941BRudolfand121给定一个长度为\(n\)的序列\(a\)。求最少进行多少次操作后所有\(a_i=0\):选择一个\(2\lei<n\),并让\(a_i\getsa_i-2,a_{i-1}\getsa_{i-1}-1,a_{i+1}\getsa_{i+1}-1\)。我们记选择\(i=x\)时的操作为\(\opera......
  • Codeforces Round 933 (Div. 3)赛后总结
    CodeforcesRound933(Div.3)B从边缘开始计算,因为边缘肯定只能一个一个减,就可以遍历得到答案.代码C只要对mapie特判,然后判断map和pie的个数就是答案了。D(记忆化搜索)可以通过二维数组来标记搜索状态,将已经出现过的状态直接返回,极大减少时间。#include<bits/stdc++.h>......
  • Codeforces Round 933 (Div. 3) A - G 题解
    CodeforcesRound933(Div.3)A-RudolfandtheTicketSolution因为\(n\)很小,直接枚举\(b_i+c_j\)所产生的所有数字Code#include<bits/stdc++.h>usingnamespacestd;voidsolve(){intn,m,k;cin>>n>>m>>k;intans=0;......
  • CodeForces 1874E Jellyfish and Hack
    洛谷传送门CF传送门显然\(\text{fun}(P)_{\max}=\frac{|P|(|P|+1)}{2}\)。考虑大力dp,设\(f_{i,j,k}\)为\(|P|=i\),\(P_1=j\),\(\text{fun}(P)=k\)的排列\(P\)的个数。此时\(|L|=j-1,|R|=i-j\)。转移枚举\(L_1,R_1,\text{fun}(L),\text{fun}(R......