cf 1041C双指针

比赛的时候想着用单调队列做。。。

打完发现其实就是个双指针

/*
构造双指针解决即可 
*/

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 200005
struct sd{int ans,a,id;}x[maxn];
bool cmp1(sd a,sd b){return a.a<b.a;} 
bool cmp2(sd a,sd b){return a.id<b.id;}
int main(){
    int n,m,d,p=1,cnt=0;
    scanf("%d%d%d",&n,&m,&d);
    for(int i=1;i<=n;i++) scanf("%d",&x[i].a),x[i].id=i;
    sort(x+1,x+1+n,cmp1);
    for(int i=1;i<=n;i++){
        if(!x[i].ans)  x[i].ans=++cnt;
        while(p<=n && (x[p].ans||x[p].a-x[i].a<=d)) 
            ++p; 
        x[p].ans=x[i].ans;
    }
    sort(x+1,x+1+n,cmp2);
    printf("%d
",cnt);
    for(int i=1;i<=n;i++) printf("%d ",x[i].ans);
}
原文地址:https://www.cnblogs.com/zsben991126/p/9979217.html