1041C 2019/2/8 数据结构set

坑的一比,自己超级沙雕。

#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;

注意这两者的区别:先删除,后使用,先使用后删除,这个很致命。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值