답안 #494669

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
494669 2021-12-16T01:39:37 Z jiahng Progression (NOI20_progression) C++17
57 / 100
1770 ms 90228 KB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
#define int ll
typedef pair<int,int> pi;
typedef vector <ll> vi;
typedef vector <pi> vpi;
typedef pair<pi, ll> pii;
typedef set <ll> si;
typedef long double ld;
#define f first
#define s second
#define mp make_pair
#define FOR(i,s,e) for(int i=s;i<=ll(e);++i)
#define DEC(i,s,e) for(int i=s;i>=ll(e);--i)
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define lbd(x, y) lower_bound(all(x), y)
#define ubd(x, y) upper_bound(all(x), y)
#define aFOR(i,x) for (auto i: x)
#define mem(x,i) memset(x,i,sizeof x)
#define fast ios_base::sync_with_stdio(false),cin.tie(0)
#define MOD 1000000007
#define maxn 300010
#define data data1


struct data{
	int llen, rlen, lval, rval, sz, val, sm;
	data(int _sz, int _val, int _llen, int _rlen, int _lval, int _rval, int _sm){
		llen = _llen; val = _val; rlen = _rlen, lval = _lval, rval = _rval; sz = _sz;
		sm = _sm;
	}
};

data merge(data x, data y){
	 int lval = x.lval, rval = y.rval;
	 int llen, rlen;
	 if (x.llen == x.sz && x.rval == y.lval) llen = x.llen + y.llen;
	 else llen = x.llen;
	 
	 if (y.rlen == y.sz && y.lval == x.rval) rlen = y.rlen + x.rlen;
	 else rlen = y.rlen;
	 
	 int val = max(x.val, y.val);
	 if (x.rval == y.lval) val = max(val, x.rlen + y.llen);
	 
	 return data(x.sz + y.sz, val, llen, rlen, lval, rval, x.sm + y.sm);
}
int N,Q;
int A[maxn],B[maxn];
struct node{
	int s,e,m,lazyadd=0,lazyset=0;
	bool lazyset_flag = 0;
	data dat = data(0,0,0,0,0,0,0);
	node *l,*r;
	node (int ss,int ee){
		s = ss; e = ee; m = (s + e) / 2;
		if (s == e){
			dat = data(1, 1, 1, 1, B[s], B[s],B[s]);
		}else{
			l = new node(s,m); r = new node(m+1,e);
			dat = merge(l->dat, r->dat);
		}
	}

	void prop(){
		if (lazyadd != 0){
			dat.lval += lazyadd; dat.rval += lazyadd; dat.sm += lazyadd * (e-s+1);
		}
		if (lazyset_flag){
			dat = data(e-s+1,e-s+1,e-s+1,e-s+1,lazyset,lazyset,(e-s+1)*lazyset);
		}
		
		
		if (s != e){
			if (lazyset_flag){
				l->lazyset_flag = r->lazyset_flag = 1;
				l->lazyadd = r->lazyadd = 0;
				l->lazyset = r->lazyset = lazyset;
			}
			if (lazyadd != 0){
				if (l->lazyset_flag) l->lazyset += lazyadd;
				else l->lazyadd += lazyadd;
				
				if (r->lazyset_flag) r->lazyset += lazyadd;
				else r->lazyadd += lazyadd;
			}
		}
				
		lazyadd = 0; lazyset_flag = 0; lazyset = 0;
	}
	void set(int a,int b,int c){
		prop();
		if (a <= s && e <= b){
			lazyset_flag = 1; lazyset = c; lazyadd = 0;
			prop();
		}else if (a > e || s > b) return;
		else{
			l->set(a,b,c); r->set(a,b,c);
			l->prop(); r->prop();
			dat = merge(l->dat, r->dat);
		}
	}
	void add(int a,int b,int c){
		prop();
		if (a <= s && e <= b){
			if (lazyset_flag) lazyset += c;
			else lazyadd += c;
			prop();
		}else if (a > e || s > b) return;
		else{
			l->add(a,b,c); r->add(a,b,c);
			l->prop(); r->prop();
			dat = merge(l->dat, r->dat);
		}
	}
	
	int qry(int a,int b){ // Largest contiguous equal sequence
		if (a > b) return 0;
		if (a == b) return 1;
		prop();
		if (a <= s && e <= b) return dat.val;
		else if (a > e || s > b) return 0;
		else{
			l->prop(); r->prop();
			int res = max(l->qry(a,b), r->qry(a,b));
			l->prop(); r->prop();
			if (l->dat.rval == r->dat.lval){
				int x = l->e - l->dat.rlen + 1;
				int y = r->s + r->dat.llen - 1;
				x = max(x, a); y = min(y, b);
				res = max(res, y - x + 1);;
			}
			return res;
		}
	}
	int sum(int a,int b){
		prop();
		if (a <= s && e <= b) return dat.sm;
		else if (a > e || s > b) return 0;
		else return l->sum(a,b)+ r->sum(a,b);
	}
}*root;

int qryA(int p){
	return A[p];
	if (p == 1) return A[1];
	else return A[1] + root->sum(1, p-1);
}

int32_t main(){
    fast;
    cin >> N >> Q;
    FOR(i,1,N) cin >> A[i];
    FOR(i,1,N-1) B[i] = A[i+1] - A[i];
    if (N > 1) root = new node(1,N-1);

    int t,l,r,s,c;
    FOR(q,1,Q){
		cin >> t;
		if (t == 1){ // add
			cin >> l >> r >> s >> c;
			if (N == 1) continue;
			if (l > 1){
				root->add(l-1,l-1,s);
				//~ cout << "ADD " << l-1 << ' ' << l-1 << ' ' << s << '\n';
			}
			if (r < N){
				root->add(r,r,-(s+(r-l)*c));
				//~ cout << "ADD " << r << ' ' << r << ' ' << -(s+(r-l)*c) << '\n';
			}
			if (l < r) root->add(l,r-1,c);
			//~ cout << "ADD " << l << ' ' << r-1 << ' ' << c << '\n';
			//~ FOR(i,l,r) A[i] += s + (i-l)*c;
			if (l == 1) A[1] += s;
		}else if (t == 2){ //set
			cin >> l >> r >> s >> c;
			if (N == 1) continue;
			//~ FOR(i,l,r) A[i] = s + (i-l)*c;
			
			if (l > 1) root->set(l-1,l-1,s-qryA(l-1));
			if (r < N) root->set(r,r,qryA(r+1)-(s+(r-l)*c));
			if (l < r) root->set(l,r-1,c);
			if (l == 1) A[1] = s;
		}else{
			cin >> l >> r;
			if (N == 1 || l == r) cout << 1 << '\n';
			else cout << root->qry(l,r-1) + 1 << '\n';
		}
	}
}
# 결과 실행 시간 메모리 Grader output
1 Correct 199 ms 88668 KB Output is correct
2 Correct 78 ms 3496 KB Output is correct
3 Correct 91 ms 3572 KB Output is correct
4 Correct 81 ms 3488 KB Output is correct
5 Correct 82 ms 3664 KB Output is correct
6 Correct 80 ms 3592 KB Output is correct
7 Correct 83 ms 3456 KB Output is correct
8 Correct 1 ms 332 KB Output is correct
9 Correct 1 ms 336 KB Output is correct
10 Correct 1 ms 344 KB Output is correct
11 Correct 172 ms 88832 KB Output is correct
12 Correct 174 ms 88648 KB Output is correct
13 Correct 175 ms 88952 KB Output is correct
14 Correct 173 ms 89048 KB Output is correct
15 Correct 176 ms 88840 KB Output is correct
16 Correct 185 ms 88648 KB Output is correct
17 Correct 227 ms 88680 KB Output is correct
18 Correct 184 ms 88612 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 596 KB Output is correct
2 Incorrect 2 ms 332 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 486 ms 87160 KB Output is correct
2 Correct 97 ms 3012 KB Output is correct
3 Correct 91 ms 3016 KB Output is correct
4 Correct 119 ms 2948 KB Output is correct
5 Correct 89 ms 3140 KB Output is correct
6 Correct 114 ms 3156 KB Output is correct
7 Correct 100 ms 3060 KB Output is correct
8 Correct 1 ms 332 KB Output is correct
9 Correct 1 ms 344 KB Output is correct
10 Correct 1 ms 344 KB Output is correct
11 Correct 565 ms 85844 KB Output is correct
12 Correct 449 ms 87248 KB Output is correct
13 Correct 600 ms 85844 KB Output is correct
14 Correct 515 ms 85768 KB Output is correct
15 Correct 511 ms 87188 KB Output is correct
16 Correct 649 ms 87828 KB Output is correct
17 Correct 541 ms 87716 KB Output is correct
18 Correct 568 ms 87820 KB Output is correct
19 Correct 477 ms 87204 KB Output is correct
20 Correct 536 ms 87176 KB Output is correct
21 Correct 437 ms 87084 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 897 ms 90228 KB Output is correct
2 Incorrect 153 ms 3652 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 486 ms 87160 KB Output is correct
2 Correct 97 ms 3012 KB Output is correct
3 Correct 91 ms 3016 KB Output is correct
4 Correct 119 ms 2948 KB Output is correct
5 Correct 89 ms 3140 KB Output is correct
6 Correct 114 ms 3156 KB Output is correct
7 Correct 100 ms 3060 KB Output is correct
8 Correct 1 ms 332 KB Output is correct
9 Correct 1 ms 344 KB Output is correct
10 Correct 1 ms 344 KB Output is correct
11 Correct 565 ms 85844 KB Output is correct
12 Correct 449 ms 87248 KB Output is correct
13 Correct 600 ms 85844 KB Output is correct
14 Correct 515 ms 85768 KB Output is correct
15 Correct 511 ms 87188 KB Output is correct
16 Correct 649 ms 87828 KB Output is correct
17 Correct 541 ms 87716 KB Output is correct
18 Correct 568 ms 87820 KB Output is correct
19 Correct 477 ms 87204 KB Output is correct
20 Correct 536 ms 87176 KB Output is correct
21 Correct 437 ms 87084 KB Output is correct
22 Correct 1660 ms 89464 KB Output is correct
23 Correct 168 ms 3460 KB Output is correct
24 Correct 171 ms 3528 KB Output is correct
25 Correct 160 ms 3460 KB Output is correct
26 Correct 175 ms 3520 KB Output is correct
27 Correct 181 ms 3496 KB Output is correct
28 Correct 168 ms 3504 KB Output is correct
29 Correct 1 ms 336 KB Output is correct
30 Correct 1 ms 316 KB Output is correct
31 Correct 1 ms 324 KB Output is correct
32 Correct 1596 ms 86680 KB Output is correct
33 Correct 1761 ms 89356 KB Output is correct
34 Correct 1659 ms 86632 KB Output is correct
35 Correct 1555 ms 86868 KB Output is correct
36 Correct 1176 ms 86492 KB Output is correct
37 Correct 1204 ms 86508 KB Output is correct
38 Correct 1269 ms 86452 KB Output is correct
39 Correct 1605 ms 85500 KB Output is correct
40 Correct 1554 ms 89324 KB Output is correct
41 Correct 1770 ms 89512 KB Output is correct
42 Correct 1536 ms 89372 KB Output is correct
43 Correct 1454 ms 82408 KB Output is correct
44 Correct 1530 ms 82284 KB Output is correct
45 Correct 1612 ms 83532 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 199 ms 88668 KB Output is correct
2 Correct 78 ms 3496 KB Output is correct
3 Correct 91 ms 3572 KB Output is correct
4 Correct 81 ms 3488 KB Output is correct
5 Correct 82 ms 3664 KB Output is correct
6 Correct 80 ms 3592 KB Output is correct
7 Correct 83 ms 3456 KB Output is correct
8 Correct 1 ms 332 KB Output is correct
9 Correct 1 ms 336 KB Output is correct
10 Correct 1 ms 344 KB Output is correct
11 Correct 172 ms 88832 KB Output is correct
12 Correct 174 ms 88648 KB Output is correct
13 Correct 175 ms 88952 KB Output is correct
14 Correct 173 ms 89048 KB Output is correct
15 Correct 176 ms 88840 KB Output is correct
16 Correct 185 ms 88648 KB Output is correct
17 Correct 227 ms 88680 KB Output is correct
18 Correct 184 ms 88612 KB Output is correct
19 Correct 3 ms 596 KB Output is correct
20 Incorrect 2 ms 332 KB Output isn't correct
21 Halted 0 ms 0 KB -