Codeforces 1152E(欧拉路径)

看样例然后发现只要求一个一笔画即可,用板子。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

const int maxn = 1e5 + 5;
int n, b[maxn], c[maxn], _b[maxn], _c[maxn];
int d[maxn << 1], tot;
vector<pair<int, int>> adj[maxn << 1];
bool vis[maxn];
int ans[maxn];
int cnt;

void dfs(int cur) {
    while (!adj[cur].empty()) {
        auto tmp = adj[cur].back();
        adj[cur].pop_back();
        if (!vis[tmp.second]) {
            vis[tmp.second] = 1;
            dfs(tmp.first);
            ans[cnt++] = tmp.first;
        }
    }
}

int main() {
    scanf("%d", &n);
    for (int i = 1; i < n; i++)
        scanf("%d", &b[i]), d[++tot] = b[i];
    for (int i = 1; i < n; i++)
        scanf("%d", &c[i]), d[++tot] = c[i];

    sort(d + 1, d + 1 + tot);
    tot = unique(d + 1, d + 1 + tot) - d - 1;
    for (int i = 1; i < n; i++) {
        _b[i] = lower_bound(d + 1, d + 1 + tot, b[i]) - d;
        _c[i] = lower_bound(d + 1, d + 1 + tot, c[i]) - d;
        if (_b[i] > _c[i]) {
            puts("-1");
            return 0;
        }
        adj[_b[i]].push_back({_c[i], i});
        adj[_c[i]].push_back({_b[i], i});
    }

    vector<int> v;
    for (int i = 1; i <= tot; i++) {
        if (adj[i].size() % 2 == 1)
            v.push_back(i);
    }
    if (v.size() == 2) {
        dfs(v[0]);
        ans[cnt++] = v[0];
    } else if(v.size() == 0) {
        dfs(1);
        ans[cnt++] = 1;
    }
    if (cnt == n)
        for (int i = cnt - 1; ~i; --i)
            printf("%d ", d[ans[i]]);
    else    puts("-1");
    return 0;
}

原文地址:https://www.cnblogs.com/AlphaWA/p/10849714.html

时间: 2024-08-30 18:26:16

Codeforces 1152E(欧拉路径)的相关文章

Codeforces 1152E Neko and Flashback 欧拉路径

Neko and Flashback 把a[ i ] - b[ i ] 看成边, 就是求一遍欧拉路径就好了. 注意图不连通的情况.. #include<bits/stdc++.h> #define fi first #define se second #define mk make_pair #define PII pair<int, int> using namespace std; const int N = (int)2e5 + 7; int n, a[N], b[N], d

CodeForces 789D 欧拉路径计数,思维

CodeForces 789D 题意:n个点m条边的无向图,求经过其中m-2条边两次,剩下2条边一次的方案数有几种,如果剩下两条边的集合一样算同一种. tags: 选出两条边,其它m-2条边假想复制成两条,这样就是要求欧拉路径是否存在,即奇点个数是否为0或2. 所以该怎么选这两条边呢? 先把边分为自环边和普通边. 1.选取两条不相邻普通边,图中存在4个奇点,不满足欧拉路径条件: 2.选取两条相邻普通边,图中存在2个奇点,满足欧拉路径条件: 3.选取一条普通边一条自环,图中存在2个奇点,满足欧拉路

codeforces 547D Mike and Fish 欧拉路径

题目链接:点击打开链接 题意: 给定二维平面上的n个点的坐标 问: 把每个点用红色或蓝色染色, 使得 水平共线(或者垂直共线)的 点 中红色与蓝色数量差不超过1. 思路: 我们建一个二部图,X集是x轴,Y集是y轴 那么点(1,5)就是 x集的 1向 y集的 5连一条边. 此时点就是用边来表示的,那我们的任务就是给边染色. 使得: 对于二部图中任意一个点, 点所连接的红边和蓝边数量差不超过1. 那么我们可以认为这个点的入边就是红色,出边就是蓝色.显然这就是一个欧拉路径. 所以爆搜欧拉路径即可. #

【codeforces 718E】E. Matvey&#39;s Birthday

题目大意&链接: http://codeforces.com/problemset/problem/718/E 给一个长为n(n<=100 000)的只包含‘a’~‘h’8个字符的字符串s.两个位置i,j(i!=j)存在一条边,当且仅当|i-j|==1或s[i]==s[j].求这个无向图的直径,以及直径数量. 题解:  命题1:任意位置之间距离不会大于15. 证明:对于任意两个位置i,j之间,其所经过每种字符不会超过2个(因为相同字符会连边),所以i,j经过节点至多为16,也就意味着边数至多

Codeforces 124A - The number of positions

题目链接:http://codeforces.com/problemset/problem/124/A Petr stands in line of n people, but he doesn't know exactly which position he occupies. He can say that there are no less than a people standing in front of him and no more than b people standing b

Codeforces 841D Leha and another game about graph - 差分

Leha plays a computer game, where is on each level is given a connected graph with n vertices and m edges. Graph can contain multiple edges, but can not contain self loops. Each vertex has an integer di, which can be equal to 0, 1 or  - 1. To pass th

Codeforces Round #286 (Div. 1) A. Mr. Kitayuta, the Treasure Hunter DP

链接: http://codeforces.com/problemset/problem/506/A 题意: 给出30000个岛,有n个宝石分布在上面,第一步到d位置,每次走的距离与上一步的差距不大于1,问走完一路最多捡到多少块宝石. 题解: 容易想到DP,dp[i][j]表示到达 i 处,现在步长为 j 时最多收集到的财富,转移也不难,cnt[i]表示 i 处的财富. dp[i+step-1] = max(dp[i+step-1],dp[i][j]+cnt[i+step+1]) dp[i+st

Codeforces 772A Voltage Keepsake - 二分答案

You have n devices that you want to use simultaneously. The i-th device uses ai units of power per second. This usage is continuous. That is, in λ seconds, the device will use λ·ai units of power. The i-th device currently has bi units of power store

Educational Codeforces Round 21 G. Anthem of Berland(dp+kmp)

题目链接:Educational Codeforces Round 21 G. Anthem of Berland 题意: 给你两个字符串,第一个字符串包含问号,问号可以变成任意字符串. 问你第一个字符串最多包含多少个第二个字符串. 题解: 考虑dp[i][j],表示当前考虑到第一个串的第i位,已经匹配到第二个字符串的第j位. 这样的话复杂度为26*n*m*O(fail). fail可以用kmp进行预处理,将26个字母全部处理出来,这样复杂度就变成了26*n*m. 状态转移看代码(就是一个kmp