记录编号 206289 评测结果 AAAAAAAAAA
题目名称 [SYOI 2015] Asm.Def的验证码 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.126 s
提交时间 2015-11-06 15:43:10 内存使用 1.49 MiB
显示代码纯文本
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<vector>
  6. using namespace std;
  7. typedef long long LL;
  8. const LL MOD=1000000007;
  9. const int SIZEN=100010;
  10. int N;
  11. int A[SIZEN]={0};
  12. vector<int> pos1,pos2;
  13. LL F1[SIZEN],F2[SIZEN];//F1是前缀有几个1,F2是后缀有几个2
  14. LL G[SIZEN]={0};//有多少个"1..2",2的后端<=i
  15. LL calc(const vector<int> &p1,const vector<int> &p2){//计算"1..2..1..2"的数量
  16. memset(F1,0,sizeof(F1));
  17. memset(F2,0,sizeof(F2));
  18. for(int i=0;i<p1.size();i++) F1[p1[i]]=1;
  19. for(int i=0;i<p2.size();i++) F2[p2[i]]=1;
  20. for(int i=2;i<=N;i++) F1[i]+=F1[i-1];
  21. for(int i=N-1;i>=1;i--) F2[i]+=F2[i+1];
  22. memset(G,0,sizeof(G));
  23. for(int i=0;i<p2.size();i++) G[p2[i]]=F1[p2[i]];
  24. for(int i=2;i<=N;i++) G[i]+=G[i-1],G[i]%=MOD;
  25. //我们枚举第二个"1"
  26. LL ans=0;
  27. for(int i=0;i<p1.size();i++){
  28. LL now=G[p1[i]-1]*F2[p1[i]+1]%MOD;
  29. ans=(ans+now)%MOD;
  30. }
  31. return ans;
  32. }
  33. void read(void){
  34. scanf("%d",&N);
  35. for(int i=1;i<=N;i++){
  36. scanf("%d",&A[i]);
  37. if(A[i]==1) pos1.push_back(i);
  38. else pos2.push_back(i);
  39. }
  40. }
  41. int main(){
  42. freopen("asm_code.in","r",stdin);
  43. freopen("asm_code.out","w",stdout);
  44. read();
  45. LL ans=(calc(pos1,pos2)+calc(pos2,pos1))%MOD;
  46. cout<<ans<<endl;
  47. return 0;
  48. }