随笔 - 23,  文章 - 0,  评论 - 0,  阅读 - 782

题目概述

原题参考: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),而不是在外面取模,这会有什么结果呢,当然是爆掉了呀,自己被蠢晕了,当然如果在我写题的时候没人给我打电话就更好了

posted on   山余木  阅读(13)  评论(0编辑  收藏  举报
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

点击右上角即可分享
微信分享提示