目錄
- 題目概述
- 思路想法
- 參考程式碼
- 做題反思
題目概述
原題參考:C. LR-remainders
給出一個長度為n的陣列和操作字串以及一個模數,要求給出整個陣列乘積對模數取模,當操作字串為'L'時,刪去最左邊,當操作字串為'R'時,刪除最右邊
思路想法
剛開始還看岔了,以為是加法,是個模擬,但是發現是乘法,會爆資料,開始想其他方法,但是不正確,直到想到正向減陣列不好做,那就反向加數。對於操作字串,先確定一個終點位置,然後反向跑操作字串,每次對答案進行維護假如棧中,最後輸出答案
參考程式碼
#include <bits/stdc++.h>
using namespace std;
#define FAST_IO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define endl '\n'
#define pll pair<long long, long long>
#define pii pair<int, int>
#define vi vector<int>
#define vl vector<long long>
#define ll long long
#define ull unsigned long long
const ll INF = 9187201950435737471;
const int inf = 2139062143;
const double eps = 1e-6;
const double PI = acos(-1.0);
const int N = 2e5+7;
stack<ll> ans;
ll n, a[N], mod;
string s;
void solve() {
cin >> n >> mod;
for(int i=1; i<=n; i++) cin >> a[i];
cin >> s;
int lt = 1, rt = n, lth = s.size();
for(int i=0; i<lth-1; i++) {
if(s[i] == 'L') lt ++;
else rt --;
}
ll tmp = a[lt];
for(int i=lth-2; i>=0; i--) {
ans.push(tmp%mod);
if(s[i] == 'L') tmp *= a[--lt];
else tmp *= a[++rt];
}
ans.push(tmp%mod);
while(!ans.empty()) cout << ans.top() << " ", ans.pop();
cout << endl;
}
int main() {
#ifdef xrl
freopen("in.txt", "r", stdin), freopen("out.txt", "w", stdout);
#endif
FAST_IO;
int t = 1;
cin >> t;
while(t --) solve();
#ifdef xrl
cout << "Time used = " << (double)(clock() * 1.0 / CLOCKS_PER_SEC) << "s";
#endif
return 0;
}
做題反思
記錄一下2b時刻,剛開始是ans.push(tmp%mod)
,而不是在外面取模,這會有什麼結果呢,當然是爆掉了呀,自己被蠢暈了,當然如果在我寫題的時候沒人給我打電話就更好了