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];
	}
}
posted @ 2025-04-01 09:26  _Yxc  阅读(7)  评论(0)    收藏  举报