比赛 |
20251001国庆欢乐赛1 |
评测结果 |
AWWWAWWWWW |
题目名称 |
国旗计划 |
最终得分 |
20 |
用户昵称 |
Ruyi |
运行时间 |
1.494 s |
代码语言 |
C++ |
内存使用 |
22.44 MiB |
提交时间 |
2025-10-01 11:57:37 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int n,m,ans[200001],dp[400001][20];
struct node{
int i,l,r;
}a[400001];
bool cmp(node x,node y){return x.l<y.l;}
void f1(){
for(int i=1,cnt=i;i<=2*n;i++){
while(cnt<=2*n&&a[cnt].l<=a[i].r) cnt++;
dp[i][0]=cnt-1;
}
for(int i=1;i<=2*n;i++)
for(int j=1;j<20;j++)
dp[i][j]=dp[dp[i][j-1]][j-1];
return ;
}
void f2(int k){
int maxx=a[k].l+m,sum=1,p=k;
for(int i=19;i>=0;i--){
if(dp[k][i]!=0&&a[dp[k][i]].r<maxx){
sum+=(1<<i);
k=dp[k][i];
}
}
ans[a[p].i]=sum+1;
return ;
}
int main(){
freopen("flagplan.in","r",stdin);
freopen("flagplan.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i].l>>a[i].r;
if(a[i].r<a[i].l) a[i].r+=m;
a[i].i=i;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
a[i+n]=a[i];
a[i+n].l=a[i].l+m;
a[i+n].r=a[i].r+m;
}
f1();
for(int i=1;i<=n;i++) f2(i);
for(int i=1;i<=n;i++) cout<<ans[i]<<' ';
return 0;
}