坑的一比,自己超级沙雕。
#include<iostream>
#include<algorithm>
#include<set>
#define ll int
using namespace std;
struct ss{
ll x;
ll index_;
}a[300050];
ll flag[300050];
set<ll> st;
ll n,m,d;
set<ll>::iterator it;
bool cmp(ss x,ss y)
{
return(x.x<y.x);
}
void set_group(ll num,ll group)
{
ll left=0;
ll right=n-1;
while (left <= right) {
int mid = (left + right) / 2;
if (a[mid].x >= num) {
right = mid - 1;
}
else {
left = mid + 1;
}
}
flag[a[left].index_]=group;
return;
}
int main()
{
// freopen("data.in","r",stdin);
ios::sync_with_stdio(false);
cin>>n>>m>>d;
for(ll i=0;i<n;i++)
{
cin>>a[i].x;
a[i].index_=i;
st.insert(a[i].x);
}
sort(a,a+n,cmp);
ll group=0;
while(!st.empty())
{
group++;
it=st.begin();
ll num=*it;
set_group(num,group);
st.erase(it);
num+=d+1;
while(!st.empty()&&st.lower_bound(num)!=st.end())
{
it=st.lower_bound(num);
set_group(*it,group);
num=*it+d+1;
st.erase(it);
//cout<<num<<endl;
}
}
cout<<group<<endl;
for(ll i=0;i<n;i++)
if(i!=n-1) cout<<flag[i]<<" ";else cout<<flag[i]<<endl;
return 0;
}
num=*it+d+1;
st.erase(it);
st.erase(it);
num=*it+d+1;
注意这两者的区别:先删除,后使用,先使用后删除,这个很致命。