HELP
查看原帖
HELP
300313
_luanyi_楼主2021/8/10 16:54

本地样例过了,但全WA

/*

	金陵城上西楼,倚清秋。万里夕阳垂地大江流。
	中原乱,簪缨散,几时收?试倩悲风吹泪过扬州。
		——朱敦儒《相见欢》 

*/

//红太阳zhoukangyang txdy!

//Orz _ZMF_ yyds!
//Orz zzd yyds!
//Orz hehezhou AKNOI!

//stO dead_X && DXqwq Orz

//jimmywang && the_tool_er AKIOI

#include <bits/stdc++.h>

#define forq(i,a,b) for(int i=(a);i<=(b);i++)
#define fornq(i,a,b) for(int i=(a);i<(b);i++)
#define nforq(i,a,b) for(int i=(a);i>=(b);i--)
#define nfornq(i,a,b) for(int i=(a);i>(b);i--)

using namespace std;

class reader {
	public:
	
	reader& operator >> (int &t) {
		int f = 1, num = 0;
		char ch = getchar ();
		while (!isdigit (ch)) {
			if (ch == '-') f *= -1;
			ch = getchar ();
		}
		while (isdigit (ch)) {
			num = num * 10 + ch - '0';
			ch = getchar ();
		}
		t = f * num;
		return *this;
	}
	
	reader& operator >> (long long &t) {
		long long f = 1, num = 0;
		char ch = getchar ();
		while (!isdigit (ch)) {
			if (ch == '-') f *= -1;
			ch = getchar ();
		}
		while (isdigit (ch)) {
			num = num * 10 + ch - '0';
			ch = getchar ();
		}
		t = f * num;
		return *this;
	}
	
	reader& operator >> (unsigned int &t) {
		unsigned int num = 0;
		char ch = getchar ();
		while (!isdigit (ch)) ch = getchar ();
		while (isdigit (ch)) {
			num = num * 10 + ch - '0';
			ch = getchar ();
		}
		t = num;
		return *this;
	}
	
	reader& operator >> (unsigned long long &t) {
		unsigned int num = 0;
		char ch = getchar ();
		while (!isdigit (ch)) ch = getchar ();
		while (isdigit (ch)) {
			num = num * 10 + ch - '0';
			ch = getchar ();
		}
		t = num;
		return *this;
	}
	
	reader& operator >> (float &t);
	reader& operator >> (double &t);
	reader& operator >> (char &c);
	reader& operator >> (char *s);
	reader& operator >> (string &s);
	
	reader& operator >> (__int128 &t);
} lin;

class writer {
	private:
	
	void writeu (unsigned int t) {
		if (t > 9) writeu (t / 10);
		putchar (t % 10 + '0');
	}
	
	void writeull (unsigned long long t) {
		if (t > 9) writeull (t / 10);
		putchar (t % 10 + '0');
	}
	
	public:
	
	writer& operator << (int t) {
		if (t < 0) putchar ('-'), t = -t;
		writeu (t);
		return *this;
	}
	
	writer& operator << (long long t) {
		if (t < 0) putchar ('-'), t = -t;
		writeull (t);
		return *this;
	}
	
	writer& operator << (unsigned int t) {
		writeu (t);
		return *this;
	}
	
	writer& operator << (unsigned long long t) {
		writeull (t);
		return *this;
	}
	
	writer& operator << (float t);
	writer& operator << (double t);
	writer& operator << (char c) {
		putchar (c);
		return *this;
	}
	writer& operator << (char *s);
	writer& operator << (string s);
	
	writer& operator << (__int128 t);
} lout;
#define lend '\n'

#define int long long

const int maxn = 100100;
int n, m, tree[maxn << 2], lazy[maxn << 2];
int a[maxn];

#define mid ((l + r) >> 1)
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1

void push_up (int rt) {tree[rt] = tree[rt << 1] + tree[rt << 1 | 1];}

void push_down (int l, int r, int rt) {
	if (l != r) {
		lazy[rt << 1] += lazy[rt];
		lazy[rt << 1 | 1] += lazy[rt];
		tree[rt << 1] += lazy[rt] * (mid - l + 1);
		tree[rt << 1 | 1] += lazy[rt] * (r - mid);
	}
	lazy[rt] = 0;
}

void build (int l, int r, int rt) {
	if (l == r) tree[rt] = a[l] - a[l - 1];
	else {
		build (lson);
		build (rson);
		push_up (rt);
	}
}

void update (int L, int R, int l, int r, int rt, int x) {
	if (L <= l && r <= R) {
		tree[rt] += (r - l + 1) * x;
		lazy[rt] += x;
	} else {
		push_down (l, r, rt);
		if (L <= mid) update (L, R, lson, x);
		if (R > mid) update (L, R, rson, x);
		push_up (rt);
	}
}

int query (int L, int R, int l, int r, int rt) {
	if (L <= l && r <= R) return tree[rt];
	push_down (l, r, rt);
	int sum = 0;
	if (L <= mid) sum += query (L, R, lson);
	if (R > mid) sum += query (L, r, rson);
	return sum;
}

signed main () {
	lin >> n >> m;
	forq (i, 1, n) lin >> a[i];
	build (1, n, 1);
	while (m--) {
		int op;
		lin >> op;
		if (op == 1) {
			int l, r, a, d;
			lin >> l >> r >> a >> d;
			if (l > r) swap (l, r);
			update (l, l, 1, n, 1, a);
			if (l != r) update (l + 1, r, 1, n, 1, d);
			if (r != n) update (r + 1, r + 1, 1, n, 1, -(a + (r - l) * d));
		} else {
			int p;
			lin >> p;
			lout << query (1, p, 1, n, 1) << lend;
		}
	}
	return 0;
}
2021/8/10 16:54
加载中...