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];}
}