0
点赞
收藏
分享

微信扫一扫

2019河北省大学生程序设计竞赛(重现赛) E题 树状数组解析

颜娘娘的碎碎念 2022-04-29 阅读 38
c++算法
#include<bits/stdc++.h>
using namespace std;
int n;
struct Node{
	int l,r;
	bool operator<(const Node&t)const
	{
		return r<t.r;
	}
}node[1000005];
int weizhi[1000005];
int f[1000005];
int s[1000005];
int lowbit(int x)
{
	return x&-x;
}
void add(int x,int v)
{
	for(int i=x;i<=100000;i+=lowbit(i))f[i]+=v;
}
int sum(int x)
{
	int res=0;
	for(int i=x;i!=0;i-=lowbit(i))res+=f[i];
	return res;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		int t,g;
		scanf("%d%d",&t,&g);
		t-=n;
		g-=n;
		weizhi[t]=i;
		node[i]={i,g};
	}
	for(int i=1;i<=n;i++)
	{
		node[i]={i,weizhi[node[i].r]};
	}
	memset(f,0,sizeof f);
	for(int i=1;i<=n;i++)
	{
		add(node[i].r,1);
		s[i]+=sum(n)-sum(node[i].r);//找到男孩左边的女朋友插到男孩自己的女朋友右边的数量 
	}
	memset(f,0,sizeof f);
	for(int i=n;i>=1;i--)
	{
		s[i]+=sum(node[i].r);//找到男孩右边的女朋友插到男孩自己女朋友左边的数量 
		add(node[i].r,1);
	}
	for(int i=1;i<=n;i++)
	{
		cout<<s[i];
		if(i!=n)
		cout<<endl;
	} 
	 
}

 

 

举报

相关推荐

0 条评论