传送门: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; }