萌新袜子才学c++求条模板题
  • 板块灌水区
  • 楼主BK小鹿
  • 当前回复15
  • 已保存回复15
  • 发布时间2024/8/14 10:52
  • 上次更新2024/8/14 13:12:24
查看原帖
萌新袜子才学c++求条模板题
1345783
BK小鹿楼主2024/8/14 10:52

样例都没过

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;

typedef long long LL;

const int N = 2e5 + 10;

int n, m;
int g[N], add[N], sum[N], num, belong[N];

int main()
{
//	freopen(".in", "r", stdin);
//	freopen(".out", "w", stdout);
    scanf("%d%d", &n, &m);
    num = sqrt(n);
    for (int i = 1; i <= n; i ++ )  scanf("%d", &g[i]), belong[i] = i / num, sum[belong[i]] += g[i];
    
    int op, l, r, v;
    while (m -- )
    {
    	scanf("%d", &op);
    	if (op == 1)
    	{
    		scanf("%d%d%d", &l, &r, &v);
    		if (belong[l] == belong[r])  for (int i = l; i <= r; i ++ )  g[i] += v, sum[belong[i]] += v;
			else
			{
				int i = l, j = r;
				while (belong[i] == belong[l]) g[i] += v, sum[belong[i]] += v, i ++ ;
				while (belong[j] == belong[r]) g[j] += v, sum[belong[j]] += v, j -- ;
				for (int k = belong[i]; k <= belong[j]; k ++ ) add[k] += v, sum[k] += v * num; 
			}
		}
		else if (op == 2 || op == 3)
		{
			scanf("%d", &v);
			if (op == 3) v = -v;
			g[1] += v;
			sum[1] += v; 
		}
		else if (op == 4)
		{
			scanf("%d%d", &l, &r);
			LL sum1 = 0;
			if (belong[l] == belong[r])
			{
				for (int i = l; i <= r; i ++ ) sum1 += g[i] + add[belong[i]];
				printf("%lld\n", sum1);
			}
			else 
			{
				int i = l, j = r;
				while (belong[l] == belong[i])  sum1 += g[i] + add[belong[i]], i ++ ;
				while (belong[j] == belong[r]) sum1 += g[j] + add[belong[j]], j -- ;
				for (int k = belong[i]; k <= belong[j]; k ++ ) sum1 += sum[k];
				if (l == 1) sum1 -= add[1];
				printf("%lld\n", sum1);
			}
		}
		else if (op == 5)  printf("%d\n", g[1] + add[1]);
	}
	return 0;
}

2024/8/14 10:52
加载中...