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<int> dq(n);
iota(dq.begin(), dq.end(), 0);
vector<int> a(n);
for (auto& x : a) {
cin >> x;
}
string s;
cin >> s;
stack<int> 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<int> 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];
}
}

浙公网安备 33010602011771号