zoukankan      html  css  js  c++  java
  • 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("
    ");
        }
        return 0;
    }
  • 相关阅读:
    课后作业
    课后作业
    课后作业3
    课后作业
    课后作业
    课后作业
    java 加减法2
    java 出计算题
    Java web 登录界面
    构建之法读后感
  • 原文地址:https://www.cnblogs.com/YangKun-/p/12683744.html
Copyright © 2011-2022 走看看