Educational Codeforces Round 85 (Rated for Div. 2) D. Minimum Euler Cycle

题意:给个有向完全图,然后在里边按字典序跑欧拉回路。现在给出有向完全图的点数和遍历结点顺序的区间,然后把该区间的遍历结点顺序输出。

原题链接:https://codeforces.ml/problemset/problem/1334/D


 

分析:不难看出这个遍历的顺序是十分有规律的,即1 2 1 3 1 4 .. 1 n 2 3 2 4 ... 2 n...

那么就区间暴力枚举即可。

#include <bits/stdc++.h>
#define rep(i, l, r) for(int i=l; i<=r ;i++)
using namespace std;

typedef long long ll;
typedef pair<int, int> PII;
typedef vector<int> VI;
ll gcd(ll n, ll m) { return n % m == 0 ? m : gcd(m, n % m);}

ll getNum(ll x, ll n, ll pre, ll k)
{
    if(k >= n) return 1;

    if((x - pre) & 1) return k;
    else return k + (x - pre) / 2;
}

int main()
{
    ios::sync_with_stdio(false);
    //freopen("data.txt", "r", stdin);
    //freopen("output.txt", "w", stdout);

    int T;
    cin>>T;
    while(T--) {
        ll n, l, r;
        cin>>n>>l>>r;
        ll pre = 0;
        ll Next = 2 * (n - 1);
        ll k = 1;
        for(ll i=l; i<=r ;i++){
            while(i > Next && k != n){
                pre = Next;
                Next += 2 * (n - k - 1);
                k++;
            }
            cout<<getNum(i, n, pre, k)<<" ";
        }
        cout<<endl;
    }

    return 0;
}

 

posted @ 2020-04-12 10:14  雾里尘埃  阅读(188)  评论(0)    收藏  举报