답안 #1089098

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1089098 2024-09-16T04:53:56 Z coldbr3w 푸드 코트 (JOI21_foodcourt) C++17
0 / 100
1000 ms 77140 KB
#pragma GCC optimize("Ofast,unroll-loops")
#include <bits/stdc++.h>
using namespace std;
 
#define ll long long
#define pll pair<long long, long long>
#define pb push_back
#define F first
#define S second  
#define all(x) (x).begin(), (x).end()

const ll N = 3e5 + 100;
const ll inf = 1e18;
const ll mod = 1e9 + 7;
const ll blocks = 350;
int n,m,q;
vector<pll>t[N], ask[N];
int g[N], res[N];
bool add[N], ok[N];
struct segment_tree_min{
    ll n;
    vector<pair<ll,int>>st;
	vector<ll> lz;
    void init(int _n){
        n = _n;
        st.clear(); st.resize(4 * n + 10);
        lz.clear(); lz.resize(4 * n + 10, 0);
		build(1,1,n);
    }
	void build(int id, int l, int r){
		if(l == r){
			st[id] = {0, l};
			return;
		}
		int mid = (l + r) / 2;
		build(2 * id, l, mid); build(2 * id + 1, mid + 1, r);
		st[id] = min(st[2 * id], st[2 * id + 1]);
	}
    void down(int id, int l, int r){
        st[id].F += lz[id];
        if(l != r) lz[2 * id] += lz[id], lz[2 * id + 1] += lz[id];
        lz[id] = 0;
    }
    void update(int id, int l, int r, int left, int right, ll val){
        down(id, l, r);
        if(l > right || r < left) return;
        if(left <= l && r <= right){
            lz[id] += val;
            down(id, l, r);
            return;
        }
        int mid = (l + r) / 2;
        update(2 * id, l, mid, left, right, val);
        update(2 * id + 1, mid + 1, r, left, right, val);
        st[id] = min(st[2 * id], st[2 * id + 1]);
    }
    pair<ll,int> get(int id, int l, int r, int left, int right){
        down(id, l, r);
        if(l > right || r < left) return {inf, inf};
        if(left <= l && r <= right) return st[id];
        int mid = (l + r) / 2;
        return min(get(2 * id, l, mid, left, right), get(2 * id + 1, mid + 1, r, left, right));
    }
    void update(ll l, ll r, ll val){update(1,1,n,l,r,val);}
    pll get(ll l, ll r){return get(1,1,n,l,r);}
} stmin;
struct segment_tree_sum{
	int n;
    vector<ll>st, lz;
    void init(int _n){
        n = _n;
        st.clear(); st.resize(4 * n + 10, 0);
        lz.clear(); lz.resize(4 * n + 10, 0);
    }
    void down(int id, ll l, ll r){
        st[id] += lz[id] * (r - l + 1);
        if(l != r) lz[2 * id] += lz[id], lz[2 * id + 1] += lz[id];
        lz[id] = 0;
    }
    void update(int id, int l, int r,int left, int right, ll val){
        down(id, l, r);
        if(l > right || r < left) return;
        if(left <= l && r <= right){
            lz[id] += val;
            down(id, l, r);
            return;
        }
        int mid = (l + r) / 2;
        update(2 * id, l, mid, left, right, val);
        update(2 * id + 1, mid + 1, r, left, right, val);
        st[id] = st[2 * id] + st[2 * id + 1];
    }
    ll get(int id, int l, int r, int left, int right){
        down(id, l, r);
        if(l > right || r < left) return 0;
        if(left <= l && r <= right) return st[id];
        int mid = (l + r) / 2;
        return get(2 * id, l, mid, left, right) + get(2 * id + 1, mid + 1, r, left, right);
    }
	int walk(int id, int l, int r, int pos, ll val){
		down(id, l, r);
		if(r < pos || st[id] < val) return -1;
		if(l == r) return l;
		int mid = (l + r) / 2;
		int res = -1;
		if(st[2 * id]) res = walk(2 * id, l, mid, pos, val);
		if(res == -1) res = walk(2 * id + 1, mid + 1, r, pos, val);
		return res;
	}
	int walk(int pos, ll val){return walk(1,1,n,pos,val);}
    void update(int l, int r, ll val){update(1,1,n,l,r,val);}
    ll get(int l, int r){return get(1,1,n,l,r);}
} st1, st2;
void to_thic_cau(){
	cin >> n >> m >> q;
	st1.init(q); st2.init(q); stmin.init(q);
	for(int i = 1; i <= q;i++){
		int typ; cin >> typ;
		if(typ == 1){
			int l,r,c; ll k; cin >> l >> r >> c >> k;
			g[i] = c; add[i] = 1;
			t[l].pb({i, k}); t[r + 1].pb({i, -k});
		}
		else if(typ == 2){
			int l,r; ll k; cin >> l >> r >> k;
			t[l].pb({i, -k}); t[r+1].pb({i, k});
		}
		else{
			ok[i] = 1;
			ll a,b; cin >> a >> b;
			ask[a].pb({b, i});
		}
	}	
	for(int i = 1; i <= n;i++){
		for(auto x : t[i]){
			int j = x.F; ll k = x.S;
			stmin.update(j, q, k);
			if(add[j]) st1.update(j, q, k); 
			else st2.update(j, q, -k);
		}
		for(auto x : ask[i]){
			ll v = x.F, j = x.S;
			pair<ll,int> cur = min(make_pair(0ll,0ll), stmin.get(1, j));
			if(stmin.get(j, j).F < cur.F + v) continue;
			v += st2.get(j, j) + cur.F;
			res[j] = g[st1.walk(cur.S + 1, v)];	
		}
	}
	for(int i = 1; i <= q;i++) if(ok[i]) cout << res[i] << " ";
	cout << '\n';
}

signed main()   
{ 
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	ll tc = 1;
	//cin >> tc;
	while(tc--) to_thic_cau();
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 9 ms 14940 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 9 ms 14940 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 82 ms 32008 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1049 ms 77140 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 9 ms 14940 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1055 ms 30092 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 9 ms 14940 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 9 ms 14940 KB Output isn't correct
2 Halted 0 ms 0 KB -