求助,树状数组正序对
  • 板块题目总版
  • 楼主渡鸦2007
  • 当前回复4
  • 已保存回复4
  • 发布时间2021/4/23 21:58
  • 上次更新2023/11/5 00:12:05
查看原帖
求助,树状数组正序对
385748
渡鸦2007楼主2021/4/23 21:58

bfs无果

给定一个长度为 nn 的序列a[1],a[2]....a[n]a[1],a[2]....a[n],对于某下标ii,如果存在另一个下标jjj<ij<i)使得a[i]+ji>a[j]a[i]+j-i>a[j]成立,序列的贡献数+1(某个ii可能会有多个下标jj使得条件成立,贡献数就要不断加上去)。求序列的总贡献。

输入样例

4

1 3 3 5

输出样例

3

我的代码

int n;
int tree[2000100];
int lowbit(int num)
{
	return num & (~num+1);
}
void upset(int where,int num)
{
	while(where<=n)
	{
		tree[where]+=num;
		where+=lowbit(where);
	}
}
int sum(int where)
{
	int ans=0;
	while(where>0)
	{
		ans+=tree[where];
		where-=lowbit(where);
	}
	return ans;
}
int main()
{
	//freopen("devote.in","r",stdin);
	//freopen("devote.out","w",stdout);
	n=read();
	int ans=0;
	for (re int i=1;i<=n;++i)
	{
		int t;t=read();
		upset(t-i+n,1);	
		ans+=sum(t-i+n-1);
	}
	cout<<ans%12345;
	fclose(stdin);
	fclose(stdout);
	return 0;
}
2021/4/23 21:58
加载中...