题目概述
原题参考: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)
,而不是在外面取模,这会有什么结果呢,当然是爆掉了呀,自己被蠢晕了,当然如果在我写题的时候没人给我打电话就更好了
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库