codeforces-1334D-Minimum Euler Cycle

传送门:https://codeforces.com/contest/1334/problem/D

题意:找到字典序最小的欧拉回路 并输出l到r这一段

一开始又想错了,感觉最近做题都不长脑子

因为是字典序最小所以1放在越前面越好,1又不能跟1连,就连2,在回到1 n=5时带1的就是12131415,这样与1相连的只差一个51,这个要放在后面封口,先不管,连完1字典序最小的是2,就是232425 三 3435 四45 五1,这样5又能跟每个数相连,每次用字典序的顺序依次找中转点,12131415 232425 3435 45 1

按照刚才的想法我们可以把这个序列分成几段,记录每段第一位数出现的位置,每次二分查找到某一段,奇数输出第几段,偶数输出xxx(应该不用我多说)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
vector<ll>ans;
ll sum[1000005];
int main()
{
    int _;
    for(scanf("%d",&_);_;_--)
    {
        ans.clear();
        ll l,r,n;
        scanf("%lld%lld%lld",&n,&l,&r);
        for(ll i=1;i<=n;i++) sum[i]=sum[i-1]+2*(n-i);
        for(ll i=l;i<=r;i++)
        {
            if(i>sum[n-1])
            {
                printf("1 ");
                continue;
            }
            ll tem=lower_bound(sum+1,sum+n+1,i)-sum;
            if((i-sum[tem-1])%2) printf("%lld ",tem);
            else printf("%lld ",(i-sum[tem-1])/2+tem);
        }
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/YangKun-/p/12683744.html