C. LR-remainders

https://codeforces.com/problemset/problem/1932/C

题意:给定长度为n的数组a和字符串s,s包含L和R,再给定一个数字m。 有n次操作,每次操作根据S中的字符,删除a中最左边或者最右边的一个数字。在每次操作之前,输出当前数组a中所有的数字相乘 % m的结果。

思路:每次计算后删除一个数,逆向思维,相当于每次在当前的结果中增加一个数相乘,并对m取模,只要按照s中的删除元素的顺序,逆着来一遍就行。 先确定删除元素的顺序,然后逆着来,一个一个加元素加到结果中,计算出余数,然后再逆序输出余数即可。

思路:看了没思路,只想到暴力破解的方法,然后尝试在暴力的基础上找规律,进行优化,根本想不到逆向思维。 以后5分钟没思路,直接看题解,节省时间~承认菜

inline void solve() {
int n, m;
cin >> n >> m;

deque dq(n);
iota(dq.begin(), dq.end(), 0);

vector a(n);
for (auto& x : a) {
cin >> x;
}

string s;
cin >> s;

stack stk;
for (int i = 0; i < n; ++i) {
if (s[i] == 'L') {
stk.push(dq.front());
dq.pop_front();
}
else {
stk.push(dq.back());
dq.pop_back();
}
}

int sum = 1;
vector ans;
ans.reserve(n);
while (!stk.empty()) {
sum = 1ll * sum * a[stk.top()] % m;
ans.push_back(sum);
stk.pop();
}

reverse(ans.begin(), ans.end());

for (int i = 0; i < n; ++i) {
cout << ans[i] << " \n"[i == n - 1];
}
}

posted @ 2025-04-01 09:26  _Yxc  阅读(32)  评论(0)    收藏  举报