4.4 省选模拟赛 拉格朗日计数 树状数组+容斥.

Posted chdy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4.4 省选模拟赛 拉格朗日计数 树状数组+容斥.相关的知识,希望对你有一定的参考价值。

技术图片
技术图片

像这种计数 问题什么的 是最讨厌的了...

考虑是环往环后面再续一段 暴力枚举前两个数字 树状数组统计第三个数的个数 n^2log.

考虑只枚举第个数 发现由于边界问题什么的很难处理。

再将枚举直接放到环上 发现边界问题没有了 不过存在 枚举第二个数之后 有 123 231 312 这三种形式。

第一种形式很好统计 预处理一下左边有多少个数字比自己小即可。

考虑第二种和第三种形式 很难在枚举2的时候统计出来这两种形式 考虑容斥 231=XX1-321. 312=3XX-321.

发现XX1和3XX很好统计 321和上述123一样的统计方式 即可O(nlogn)得到答案。

const int MAXN=200010;
int n,T,m,top;ll ans=0;
int a[MAXN],c[MAXN];ll f[MAXN];
inline void add(int x,int y){while(x<=n){c[x]+=y;x+=x&(-x);}}
inline int ask(int x){int cnt=0;while(x){cnt+=c[x];x-=x&(-x);}return cnt;}
signed main()
{
	freopen("1.in","r",stdin);
	get(n);
	rep(1,n,i)
	{
		get(a[i]);
		f[i]=ask(a[i]-1);
		add(a[i],1);
	}
	rep(1,n,i)
	{
		ans+=f[i]*(n-i-(a[i]-1-f[i]));//123 左边比我小 右边比我大
		ans+=(a[i]-1-f[i])*(a[i]-1-f[i]-1)/2;//3XX
		ans+=(i-1-f[i])*(i-1-f[i]-1)/2;//XX1
		ans-=(i-1-f[i])*(a[i]-1-f[i])*2;//左边比我大 右边比我小
	}
	putl(ans);return 0;
}

以上是关于4.4 省选模拟赛 拉格朗日计数 树状数组+容斥.的主要内容,如果未能解决你的问题,请参考以下文章

HDU - 4059: The Boss on Mars (容斥 拉格朗日 优化)

洛谷 P4593 [TJOI2018]教科书般的亵渎(拉格朗日差值法)

BZOJ4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值

拉格朗日反演

浅谈拉格朗日插值公式

拉格朗日插值快速排序