60分求条!
查看原帖
60分求条!
1312482
Delightedppp楼主2025/7/27 14:34

蒟蒻写完这道题交上去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 ;
}
2025/7/27 14:34
加载中...