結果
問題 |
No.457 (^^*)
|
ユーザー |
|
提出日時 | 2025-03-21 12:04:50 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 3 ms / 2,000 ms |
コード長 | 2,158 bytes |
コンパイル時間 | 926 ms |
コンパイル使用メモリ | 78,076 KB |
実行使用メモリ | 5,888 KB |
最終ジャッジ日時 | 2025-03-21 12:04:52 |
合計ジャッジ時間 | 2,290 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 20 |
ソースコード
#include<iostream> #include<vector> #include<cassert> #define rep(i,n) for(i=0;i<(int)(n);i++) using namespace std; typedef long long ll; typedef unsigned long long ull; string s; int c2Id(char c){ switch(c){ case '(': return 0; case '^': return 1; case '*': return 2; default: break; } return 3; } int main(){ int i,j,ans1=0,ans2=0,tmp; cin>>s; const int MAX=4; vector<vector<int> > sum(MAX,vector<int>(s.length()+1,0)); vector<int> asl; rep(i,s.length()){ sum[c2Id(s[i])][i+1]=1; if(s[i]=='*')asl.push_back(i); } rep(i,MAX)rep(j,s.length())sum[i][j+1]+=sum[i][j]; vector<int> imos(s.length(),0); auto judge=[&](int l,int r)->bool{ return sum[c2Id('^')][r]-sum[c2Id('^')][l]>=2; }; rep(i,s.length())if(s[i]=='('){ int asl_id=lower_bound(asl.begin(),asl.end(),i)-asl.begin(); if(asl_id==asl.size())continue; asl_id=asl[asl_id]; //printf("%d %d\n",i,asl_id); int left=asl_id,right=s.length()+1,mid; while(left<right){ mid=(left+right)/2; if(judge(asl_id,mid))right=mid; else left=mid+1; } if(left<s.length())imos[left]++; } rep(i,s.length()-1)imos[i+1]+=imos[i]; //rep(i,s.length()-1)printf("%d ",imos[i]);printf("%d\n",imos[i]); rep(i,s.length())if(s[i]==')')ans2+=imos[i]; imos=vector<int>(s.length(),0); rep(i,s.length())if(s[i]==')'){ int asl_id=lower_bound(asl.begin(),asl.end(),i)-asl.begin(); asl_id--; if(asl_id<0)continue; asl_id=asl[asl_id]; //printf("%d %d\n",i,asl_id); int left=0,right=asl_id,mid; while(left<right){ mid=(left+right)/2; if(judge(mid,asl_id))left=mid+1; else right=mid; } if(0<left)imos[left-1]++; } for(i=(int)imos.size()-1;i>0;i--)imos[i-1]+=imos[i]; //rep(i,s.length()-1)printf("%d ",imos[i]);printf("%d\n",imos[i]); rep(i,s.length())if(s[i]=='(')ans1+=imos[i]; printf("%d %d\n",ans1,ans2); return 0; }