| 比赛 |
进阶指南第0章测试 |
评测结果 |
AAAAAAAAAA |
| 题目名称 |
国旗计划 |
最终得分 |
100 |
| 用户昵称 |
小福鑫 |
运行时间 |
2.131 s |
| 代码语言 |
C++ |
内存使用 |
49.05 MiB |
| 提交时间 |
2026-03-14 13:49:39 |
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct edge{int l,r,f;}a[500001];
int n,m,l,r,k=1,f[500001][25],ans[500001];
bool cmp(edge a,edge b){return a.l<b.l;}
void solve(int x){
int now=x,r=0;
for(int i=20;i>=0;i--){
if(f[now][i]!=0&&a[f[now][i]].r<a[x].l+m){
r+=(1<<i);
now=f[now][i];
}
}
ans[a[x].f]=r+1;
}
signed main(){
freopen("flagplan.in","r",stdin);
freopen("flagplan.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>l>>r;
if(r<l)r+=m;
a[i]={l,r,i};
}
sort(a+1,a+1+n,cmp);
for(int i=n+1;i<=2*n;i++){
a[i]={a[i-n].l+m,a[i-n].r+m,a[i-n].f};
}
for(int i=1;i<=2*n;i++){
while(k<=2*n&&a[i].r>=a[k].l)k++;
f[i][0]=k-1;
}
for(int j=1;j<=20;j++){
for(int i=1;i<=2*n;i++){
f[i][j]=f[f[i][j-1]][j-1];
}
}
for(int i=1;i<=n;i++){
solve(i);
}
for(int i=1;i<=n;i++){
cout<<ans[i]+1<<" ";
}
}