逆向思維_cf927_C. LR-remainders

山余木發表於2024-03-09

目錄
  • 題目概述
  • 思路想法
  • 參考程式碼
  • 做題反思

題目概述

原題參考: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),而不是在外面取模,這會有什麼結果呢,當然是爆掉了呀,自己被蠢暈了,當然如果在我寫題的時候沒人給我打電話就更好了

相關文章