求救,一直卡在75分 开了long long也检查不到错误
查看原帖
求救,一直卡在75分 开了long long也检查不到错误
99244
我是大帅比ZED楼主2023/9/10 23:28

如题

/*
  
 */
#include <stdio.h>
#include <iostream>
using namespace std;

struct Stack
{
	int left, right;
};

Stack ans[500001];//n <= 5 * 10^5
long long int l, r;
int top;

long long int f(int len, int up, int down)
{//等差数列求和
	return len * (up + down) / 2;
}

int main (void)
{
	int n;//n次操作
	cin >> n;
	while (n --)
	{
		int opre;
		cin >> opre;
		if (opre == 1)
		{//存放 从l到r的团子
			cin >> l >> r;
			ans[++top].left = l;//入栈
			ans[top].right = r;
		}
		else
		{
			long long int num;//想要团子的个数
			cin >> num;
			long long int sum = 0;//要支付的钱

			while (num > ans[top].right - ans[top].left + 1)//把存着时 是完整的团子区间 给剪掉
			{
				sum += f(ans[top].right - ans[top].left + 1, ans[top].right, ans[top].left);//计算
				num -= ans[top].right - ans[top].left + 1;//削减
				top--;//弹出

			}
			
			l = ans[top].right - num + 1;//方便后续计算
			sum += f(ans[top].right - l + 1, l, ans[top].right);
			ans[top].right = l - 1;//修改栈顶 右端点的值
			
			cout << sum << endl;
		}
	}
	
	return 0;
}
/*
  测试:
  -----------------------------
  -----------------------------
  总结:
  1. 栈不能直接用,直接用辅助空间会爆掉,所以得用端点来保存(毕竟是连续的
  2. 出栈的操作得在 一轮中最后来实现
  
 */
2023/9/10 23:28
加载中...