acw.241楼兰图腾

 

题目:https://www.acwing.com/problem/content/243/

西部 314314 打算研究这幅壁画中包含着多少个图腾。

如果三个点 (i,yi),(j,yj),(k,yk)(i,yi),(j,yj),(k,yk) 满足 1i<j<kn1≤i<j<k≤n 且 yi>yj,yj<ykyi>yj,yj<yk,则称这三个点构成 V 图腾;

如果三个点 (i,yi),(j,yj),(k,yk)(i,yi),(j,yj),(k,yk) 满足 1i<j<kn1≤i<j<k≤n 且 yi<yj,yj>ykyi<yj,yj>yk,则称这三个点构成  图腾;

西部 314314 想知道,这 nn 个点中两个部落图腾的数目。

因此,你需要编写一个程序来求出 V 的个数和  的个数。

输入格式

第一行一个数 nn。

第二行是 nn 个数,分别代表 y1y2,,yny1,y2,…,yn。

输出格式

两个数,中间用空格隔开,依次为 V 的个数和  的个数。

笔记:树状数组模板+基本用法(快速求前缀和!)

 

int main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	
	for(int i=1;i<=n;i++){
		int y=a[i];//左边,比y大的和比y小的 
		great[i]=sum(n)-sum(y);
		low[i]=sum(y-1);
		add(y,1);
	}
	memset(tr,0,sizeof tr);
	ll res1,res2;
	res1=res2=0;
	for(int i=n;i;i--){
		int y=a[i];
		res1+=great[i]*(ll)(sum(n)-sum(y));
		res2+=low[i]*(ll)(sum(y-1));
		add(y,1);
	}
	cout<<res1<<" "<<res2; 
	return 0;
}

  

posted @ 2021-08-15 06:02  reene444  阅读(83)  评论(0)    收藏  举报