Codeforces Round #793 (Div. 2)解题报告

A. Palindromic Indices

英语不好,以为是问可以删除的下标,还开了个问题。。

容易发现对于回文串,删除中间元素后仍然为回文串,所以方案数即为与中间元素等价的元素个数,所以从中间找出与中间元素相同的连续区间长度即为答案

B. AND Sorting

我们只需要关注不在应在位置的元素即可。对于这些元素的与结果肯定是一个答案,接下来只需要考虑是否有比该值大的答案。

容易推理出如果存在,则必定有部分元素不能被交换,所以输出与结果即可。

C. LIS or Reverse LIS?

题目说明了可以将元素任意放置,我们可以先考虑排序去重得到最长的LIS。

然后我们思考如何使得答案最大,注意到如果某元素的数量大于1时,他可以在反转和正序的LIS都有1的贡献,并且对于一个数量为1的元素亦可做到该贡献。

所以答案就是(去重后的元素数量+数量大于1 的元素数量+1)/2

D. Circular Spanning Tree

构造题,首先先特判一些NO的情况,如题目中的”10″,然后以及考虑到的全为”0″的情况

然后就是如何构造的问题了。注意到’0’的节点与’1’的节点相连后,’1’的节点可以舍去,而’0’的节点会等价于’1’的节点。所以我们先找到为’1’的节点坐标,然后维护一个栈,遇到’1’就放入下标,遇到’0’就弹出构造一个答案,并把当前节点下标放入栈中。

最后就剩下一些等价’1’的节点,思考到如果栈内元素的个数为奇数,则不能构造答案,应该直接输出NO,否则取出一个元素,然后将剩余元素与其相连即可。

E. Unordered Swaps

assert害死人,RE这么多。。。。

首先从排列中每个不在应在位置的元素会构成一个环,所以我们可以先bfs求出每个元素的层数,每组元素的个数。

然后对接下来的交换对建一个临接链表,用map存id。

然后对每个点遍历一遍边,计算出相对层数并将结果与id存入vector后排序,从第二个开始每个点对id度数加一(不如说是:受约束计数变量,因为我们仅可以先执行对两点均为最相邻的步骤,即为0)

然后遍历点对id,将度数为0的存入队列中,循环输出答案即可。

Code:

A

cin>>tt;
    f(sb,1,tt){
        cin>>n>>s;
        s=' '+s;
        char c=s[(n+1)/2];
        int l=(n+1)/2,r=(n+1)/2;
        while(s[l]==c)l-=1;
        while(s[r]==c)r+=1;
        //cout<<r<<"::"<<l<<"\n";
        cout<<r-l-1<<'\n';
    }

B


LL tt,n;
int a[(int)2e5+9];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>tt;
    f(sb,1,tt){
        cin>>n;
        f(i,0,n-1)cin>>a[i];
        vi ans;
        f(i,0,n-1){
            if(a[i]!=i)ans.push_back(a[i]);
        }
        int res=ans[0];
        for(auto it:ans)res&=it;
        cout<<res<<"\n";
    }
    return 0;
}

C

LL tt,n;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>tt;
    f(sb,1,tt){
        map<int,int> cnt;
        cin>>n;
        vi v(n);
        for(auto &it:v)cin>>it,cnt[it]+=1;
        sort(all(v));
        auto it=unique(all(v));
        LL lis=it-v.begin(),cf=0;
        for(auto i=v.begin();i!=it;++i){
            if(cnt[*i]>1)cf+=1;
        }
        cout<<(lis+cf+1)/2<<"\n";
    }
    return 0;
}

D


LL tt, n;
string s;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> tt;
    f(sb, 1, tt)
    {
        cin >> n >> s;
        int cn1 = 0,st=0;
        for (auto it : s)
            if (it == '1')
                cn1 += 1;
        if( (n - cn1 == 1 && (cn1 & 1))||cn1==0)
        {
            cout << "NO\n";
            continue;
        }
        while(s[st]=='0')st+=1;
        vector<pii>ans;
        stack<int> s1;
        for(int i=0;i<n;++i){
            if(s[(st+i)%n]=='1'){
                s1.push((st+i)%n);
            }else {
                ans.push_back({s1.top(),(st+i)%n});
                s1.pop();
                s1.push((st+i)%n);
            }
        }
        if(s1.size()&1){
            cout<<"NO\n";
            continue;
        }
        int hd=s1.top();
        s1.pop();
        while(!s1.empty()){
            ans.push_back({s1.top(),hd});
            s1.pop();
        }
        cout<<"YES\n";
        for(auto [aa,bb]:ans){
            cout<<aa+1<<" "<<bb+1<<"\n";
        }
    }
    return 0;
}

E

#include <algorithm>
#include <bitset>
#include <map>
#include <vector>
#include <string>
#include <cstring>
#include <iostream>
#include <ctime>
#include <cmath>
#include <stack>
#include <set>
#include <queue>
#include <array>

using namespace std;

const double eps = 1e-10;
const double pi = 3.1415926535897932384626433832795;
const double eln = 2.718281828459045235360287471352;

#define f(i, a, b) for (int i = a; i <= b; i++)
#define LL long long
#define IN freopen("in.txt", "r", stdin)
#define OUT freopen("out.txt", "w", stdout)
#define scan(x) scanf("%d", &x)
#define mp make_pair
#define pb push_back
#define sqr(x) (x) * (x)
#define pr1(x) printf("Case %d: ", x)
#define pn1(x) printf("Case %d:\n", x)
#define pr2(x) printf("Case #%d: ", x)
#define pn2(x) printf("Case #%d:\n", x)
#define lowbit(x) (x & (-x))

#define fi first
#define se second
#define sz(x) int((x).size())
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define summ(a) (accumulate(all(a), 0ll))

typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef vector<int> vi;

LL n, m;
LL fa[(int)2e5 + 9], a[(int)2e5 + 9], sz[(int)2e5 + 9], dep[(int)2e5 + 9], deg[(int)2e5 + 9];
map<array<int,2>, int> id;

bitset<(int)2e5 + 9> vis;
vector<int> adj[(int)2e5 + 9], andj[(int)2e5 + 9];
vector<pii> an[(int)2e5 + 9];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> m;
    f(i, 1, n)
    {
        cin >> a[i];
        sz[i] = 1;
    }
    f(i, 1, n)
    {
        if (a[i] != i && !vis[i])
        {
            int cs = 0;
            dep[i] = ++cs;
            vis[i] = 1;
            for (int j = a[i]; !vis[j]; j = a[j])
            {
                vis[j] = 1, dep[j] = ++cs, fa[j] = i;
            }
            fa[i] = -cs;
        }
    }
    for (int i = 1, x, y; i <= m; ++i)
    {
        cin >> x >> y;
        id[{x, y}] = id[{y, x}] = i;
        adj[x].push_back(y), adj[y].push_back(x);
    }
    f(i, 1, n)
    {
        int sz;
        sz = fa[i] < 0 ? -fa[i] : -fa[fa[i]];
        for (auto it : adj[i])
        {
            int u = (dep[it] - dep[i] + sz) % sz;

            an[i].push_back({u, id[{i, it}]});
        }
        sort(all(an[i]));
        for (int j = 1; j < an[i].size(); ++j)
        {
            deg[an[i][j].second] += 1;
            andj[an[i][j - 1].second].pb(an[i][j].second);
        }
    }
    queue<int> q;
    f(i, 1, m)
    {
        if (!deg[i])
            q.push(i);
    }
    while (!q.empty())
    {
        auto p = q.front();
        q.pop();
        cout << p << " ";
        for (auto it : andj[p])
        {
            deg[it] -= 1;
            if (!deg[it])
                q.push(it);
        }
    }

    return 0;
}
上一篇
下一篇