记录编号 |
206289 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[SYOI 2015] Asm.Def的验证码 |
最终得分 |
100 |
用户昵称 |
cstdio |
是否通过 |
通过 |
代码语言 |
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;
- }