結果
| 問題 |
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;
}