紀中2020.5.30普及C組模擬賽總結

爲啥全是求方案總數的題(暈)

T1

我們可以用暴力來找規律,會發現:

n ans
1 1+2=3
2 1+2+3=6
3 1+2+3+4=10
4 1+2+3+4+5=15

總結起來可得出公式:
ans=(n+1)(n+2)/2ans=(n+1)*(n+2)/2

AC CodeAC~Code

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
long long n;
int main()
{
	freopen("h2o.in","r",stdin);
	freopen("h2o.out","w",stdout);
	cin>>n;
	cout<<(n+1)*(n+2)/2;  //公式
    return 0;
}

T2

AC CodeAC~Code

未做出

T3

AC CodeAC~Code

未做出

T4

這道題以前考試做過(<_<)
前綴和+離散化+樹狀數組

AC CodeAC~Code

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
long long a[100010],f[100010];
long long n,m,c,ans,w;
struct node 
{
	long long sum,place;
}b[100010];
bool cmp(node a,node b)
{
	return a.sum<b.sum;
}
bool cmp2(node a,node b)
{
	return a.place<b.place;
}
int main()
{
	freopen("sequence.in","r",stdin);
	freopen("sequence.out","w",stdout);
	cin>>n>>m;
	for(int i=1; i<=n; i++)
	 {
		scanf("%lld",&a[i]);
		a[i]-=m;  //首先統計一輪單個
		b[i].sum=b[i-1].sum+a[i];  //前綴和
		b[i].place=i;  //離散化
		if(b[i].sum>=1)   //單個比較
		  ans++;
	 }
	sort(b+1,b+1+n,cmp);
	for(int i=1; i<=n; i++)
	 {
		if(b[i].sum!=w||i==1)
		  c++;
		w=b[i].sum;
		b[i].sum=c;  //算次數
	 }
	sort(b+1,b+1+n,cmp2);
	for(int i=1; i<=n; i++)
	 {
		for(int j=b[i].sum-1; j>=1; j-=j&(-j))  //樹狀數組
			ans+=f[j];
		for(int j=b[i].sum; j<=c; j+=j&(-j))
			f[j]++;
	 }
	cout<<ans;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章