简单黄题求调
查看原帖
简单黄题求调
1041101
Aventurine_stone楼主2024/7/27 09:02
#include<bits/stdc++.h>
using namespace std;
const int N=200010;
inline int read()
{
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9')
		c=='-'?f=-1:1,c=getchar();
	while(c>='0'&&c<='9')
		x=(x<<1)+(x<<3)+c-'0',c=getchar();
	return x*f;
}
int n,m;
struct node{
	int l,r;
}a[N];
inline bool cmp(node a1,node a2)
{
	return a1.r<a2.r;
}
struct tree{
	int l,r;
	int key,size,val;
}t[N];
int idx,root;
inline void pushup(int p)
{
	t[p].size=t[t[p].l].size+t[t[p].r].size+1;
}
inline int cnode(int x)
{
	t[++idx].key=x;
	t[idx].size=1;
	t[idx].val=rand();
	return idx;
}
inline void fl(int p,int v,int &x,int &y)
{
	if(!p)
	{
		x=y=0;
		return ;
	}
	if(t[p].key<=v)
	{
		x=p;
		fl(t[p].r,v,t[p].r,y);
	}
	else
	{
		y=p;
		fl(t[p].l,v,x,t[p].l);
	}
	pushup(p);
}
inline int hb(int x,int y)
{
	if(!x||!y)
		return x+y;
	if(t[x].val<t[y].val)
	{
		t[x].r=hb(t[x].r,y);
		pushup(x);
		return x;
	}
	else
	{
		t[y].l=hb(x,t[y].l);
		pushup(y);
		return y;
	}
}
inline void insert(int v)
{
	int x,y,z;
	fl(root,v,x,y);
	z=cnode(v);
	root=hb(hb(x,z),y);
}
inline void dlt(int v)
{
	int x,y,z;
	fl(root,v,x,y);
	fl(x,v-1,x,z);
	z=hb(t[z].l,t[z].r);
	root=hb(hb(x,z),y);
}
inline int qk(int p,int k)
{
	if(!p)
		return 0;
	if(t[t[p].l].size>=k)
		return qk(t[p].l,k);
	if(t[t[p].l].size+1==k)
		return p;
	return qk(t[p].r,k-t[t[p].l].size-1);
}
inline int qfront(int v)
{
	int x,y,p;
	fl(root,v-1,x,y);
	p=qk(x,t[x].size);
	root=hb(x,y);
	return p;
}
int p,ans;
int main()
{
	n=read(),m=read();
	if(m>=n)
	{
		printf("0");
		return 0;
	}
	for(int i=1;i<=n;i++)
		a[i]={read(),read()};
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=m;i++)
		insert(a[i].r);
	for(int i=m+1;i<=n;i++)
	{
		p=qfront(a[i].l+1);
		if(!p)
		{
			ans++;
			continue;
		}
		dlt(t[p].key);
		insert(a[i].r);
	}
	printf("%d",ans);
	return 0;
}
2024/7/27 09:02
加载中...