10pts 树状数组求调
查看原帖
10pts 树状数组求调
305895
Take_A_Single_6楼主2022/10/13 22:00
#include<bits/stdc++.h>
using namespace std;
int n,m,x[100005],y[100005],c1[100005],c2[100005],b1[100005],b2[100005],z[100005];
void add1(int pos,int u)
{
	for(int i=pos;i>0;i-=(i&-i))
		c1[i]+=u; 
} 
int find1()
{
	int sum=0;
	for(int i=1;i<=m;i+=(i&-i))
		sum+=(c1[i]?1:0);
	return sum;
}
void add2(int pos,int u)
{
	for(int i=pos;i>0;i-=(i&-i))
		c2[i]+=u; 
} 
int find2()
{
	int sum=0;
	for(int i=1;i<=m;i+=(i&-i))
		sum+=(c2[i]?1:0);
	return sum;
}
int main()
{
	cin>>n>>m;
	for(int i=0;i<n;i++)
	{
		cin>>x[i]>>y[i];
		if(b1[x[i]]<=b2[y[i]])
			add1(x[i],1),z[i]=1,b1[x[i]]++;
		else add2(y[i],1),z[i]=2,b2[y[i]]++;
	}
	for(int i=0;i<n;i++)
	{
		cout<<find1()+find2()<<endl;
		if(z[i]==1)
		add1(x[i],-1);
		else
		add2(y[i],-1);
	}
	return 0;
} 
2022/10/13 22:00
加载中...