蒟蒻写完这道题交上去60T了 不知道怎么优化,求大佬解答!
#include<bits/stdc++.h>
using namespace std ;
const int N = 1e6 + 11 , mod = 317847191 ;
#define int long long
int n , m , cnt1 , cnt2 , cnt3 , cnt4 , ans[N] , sum = 1 ,a[N] ;
char c[N] ;
vector < int > v ,V ;
map <int , int> M ,M1;
int fxxt (int x , int y){
int s = 1 , p = x ;
while (y) {
if (y & 1 ) {
s *= p ;
s %= mod ;
}
y >>= 1 ;
p *= p ;
p %= mod ;
}
return s ;
}
signed main () {
cin >> n >> m ;
for (int i = 1 ; i <= n ; i ++){
int x ;
cin >> x ;
if(! M[x]){ v.push_back(x) ; }
M[x] ++ ;
M1[x] ++ ;
}
sort ( v.begin() , v.end() ) ;
for (int i = 1 ; i <= m ; i ++) {
cin >> c[i] ;
if (c[i] == 'D') {
int x ;
cin >> x;
M[x] -- ;
cnt4 ++ ;
a[cnt4] = x ;
V.push_back(x) ;
cnt1 ++ ;
}
}
cnt2 = 0 ;
cnt3 = v.size() - 1 ;
for (auto i : v) {
for (int j = 1 ; j <= M[i] ; j ++){
sum *= i ;
sum %= mod ;
}
}
for (int i = V.size() - 1 ; i >= 0 ; i --){
ans[i + 1] = sum ;
sum *= V[i] ;
sum %= mod ;
}
ans[0] = sum ;
cnt4 = 0 ;
for (int i = 1 ; i <= m ; i ++){
if (c[i] == 'D'){
cnt4 ++ ;
M1[ a[cnt4] ] -- ;
}
else if (c[i] == 'B') {
while (!M1[v[cnt3] ]) cnt3 -- ;
cout << v[cnt3] << "\n" ;
}
else if (c[i] == 'S') {
while (!M1[v[cnt2] ]) cnt2 ++ ;
cout << v[cnt2] << "\n" ;
}
else if (c[i] == 'M'){
while (!M1[v[cnt3] ]) cnt3 -- ;
while (!M1[v[cnt2] ]) cnt2 ++ ;
cout << fxxt (v[cnt3] , v[cnt2]) << "\n" ;
}
else { cout << ans[cnt4] << "\n" ; }
}
return 0 ;
}