求助简单栈题(悬棺)
  • 板块学术版
  • 楼主403notfound
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/7/13 10:53
  • 上次更新2023/11/3 10:10:15
查看原帖
求助简单栈题(悬棺)
891150
403notfound楼主2023/7/13 10:53

题目传送门

#include <stack>
#include <queue>
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll n , l , r , x , k , ans;
stack<ll>zmk;
int main(){
	cin >> n;
	for (int i = 1;i <= n;i++){
		cin >> x;
		if (x == 1) {
			cin >> l >> r;
			zmk.push(l) , zmk.push(r);
		}
		else if (x == 2){
			ll r1 = zmk.top();
			zmk.pop();
			ans = 0;
			cin >> k;
			if (r1 - zmk.top() > k) ans = ((r1<<1) - k + 1) * k / 2 , r1 -= k , zmk.push(r1);
			else if (r1 - zmk.top() == k) ans = (r1 + zmk.top()) * k / 2 , zmk.pop();
			else{
				while (r1 - zmk.top() < k){
					ans+=(r1 + zmk.top()) * (r1 - zmk.top() + 1) / 2;
					k -= r1 - zmk.top() + 1;
					zmk.pop();
					r1 = zmk.top();
					zmk.pop();
				}
				if (r1 - zmk.top() > k) ans += ((r1<<1) - k + 1) * k / 2 , r1 -= k , zmk.push(r1);
				else if (r1 - zmk.top() == k) ans += (r1 + zmk.top()) * k / 2 , zmk.pop();
			} 
			cout << ans << endl;
		}
	}
	return 0;
}			
2023/7/13 10:53
加载中...