记录编号 206289 评测结果 AAAAAAAAAA
题目名称 [SYOI 2015] Asm.Def的验证码 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.126 s
提交时间 2015-11-06 15:43:10 内存使用 1.49 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
typedef long long LL;
const LL MOD=1000000007;
const int SIZEN=100010;
int N;
int A[SIZEN]={0};
vector<int> pos1,pos2;
LL F1[SIZEN],F2[SIZEN];//F1是前缀有几个1,F2是后缀有几个2
LL G[SIZEN]={0};//有多少个"1..2",2的后端<=i
LL calc(const vector<int> &p1,const vector<int> &p2){//计算"1..2..1..2"的数量
	memset(F1,0,sizeof(F1));
	memset(F2,0,sizeof(F2));
	for(int i=0;i<p1.size();i++) F1[p1[i]]=1;
	for(int i=0;i<p2.size();i++) F2[p2[i]]=1;
	for(int i=2;i<=N;i++) F1[i]+=F1[i-1];
	for(int i=N-1;i>=1;i--) F2[i]+=F2[i+1];
	memset(G,0,sizeof(G));
	for(int i=0;i<p2.size();i++) G[p2[i]]=F1[p2[i]];
	for(int i=2;i<=N;i++) G[i]+=G[i-1],G[i]%=MOD;
	//我们枚举第二个"1"
	LL ans=0;
	for(int i=0;i<p1.size();i++){
		LL now=G[p1[i]-1]*F2[p1[i]+1]%MOD;
		ans=(ans+now)%MOD;
	}
	return ans;
}
void read(void){
	scanf("%d",&N);
	for(int i=1;i<=N;i++){
		scanf("%d",&A[i]);
		if(A[i]==1) pos1.push_back(i);
		else pos2.push_back(i);
	}
}
int main(){
	freopen("asm_code.in","r",stdin);
	freopen("asm_code.out","w",stdout);
	read();
	LL ans=(calc(pos1,pos2)+calc(pos2,pos1))%MOD;
	cout<<ans<<endl;
	return 0;
}