Codeforces Round #632 (Div. 2) 比赛人数14824
[codeforces 1334D] Minimum Euler Cycle 找规律
总目录详见https://blog.csdn.net/mrcrack/article/details/103564004
在线测评地址https://codeforces.com/contest/1334/problem/D
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
D - Minimum Euler Cycle | GNU C++17 | Accepted | 46 ms | 0 KB |
手工算法如下
Input:
3
2 1 2
3 1 7
4 1 13
Output:
1 2 1
1 2 1 3 2 3 1
1 2 1 3 1 4 2 3 2 4 3 4 1
可以预测
5 1 21
1 2 1 3 1 4 1 5 2 3 2 4 2 5 3 4 3 5 4 5 1
规律如下
1 2 1 3 1 4 1 5 有4*2=8个点
2 3 2 4 2 5 有3*2=6个点
3 4 3 5 有2*2=4个点
4 5 有1*2=2个点
1 有1*1=1个点
共计有8+6+4+2+1=21
根据上述算法,编写代码
#include <stdio.h>
#define LL long long
int main(){
int t;
LL n,l,r,i,p,q,j,m;
scanf("%d",&t);
while(t--){
scanf("%lld%lld%lld",&n,&l,&r);
p=-1,q=-1;
for(i=1;i<n;i++)
if((2*n-i-1)*i>=l){p=i;break;}//确定l所属区间 ((n-1)+(n-2)+......+(n-k))*2=((n-1+n-k)*k/2)*2=(2*n-k-1)*k
for(i=1;i<n;i++)
if((2*n-i-1)*i>=r){q=i;break;}//确定r所属区间
if(p==q){//同一区间
if(q==-1)printf("1\n");//最后一个区间
else{
l-=(2*n-(p-1)-1)*(p-1);
r-=(2*n-(q-1)-1)*(q-1);
for(i=l;i<=r;i++)
if((i-1)%2==0)printf("%lld ",p);
else printf("%lld ",p+i/2);
printf("\n");
}
}else{//不同区间
l-=(2*n-(p-1)-1)*(p-1);
for(i=l;i<=(n-p)*2;i++)//开始区间
if((i-1)%2==0)printf("%lld ",p);
else printf("%lld ",p+i/2);
if(q==-1)m=n-1;
else m=q-1;
for(i=p+1;i<=m;i++)//中间区间
for(j=1;j<=(n-i)*2;j++)
if((j-1)%2==0)printf("%lld ",i);
else printf("%lld ",i+j/2);
if(q==-1)printf("1 ");
else{
r-=(2*n-(q-1)-1)*(q-1);
for(i=1;i<=r;i++)//结尾区间
if((i-1)%2==0)printf("%lld ",q);
else printf("%lld ",q+i/2);
}
printf("\n");
}
}
return 0;
}