제출 #899477

#제출 시각아이디문제언어결과실행 시간메모리
899477CookieI want to be the very best too! (NOI17_pokemonmaster)C++14
100 / 100
4338 ms90552 KiB
#include<bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include<fstream>
using namespace std;
#define sz(a) (int)a.size()
#define ALL(v) v.begin(), v.end()
#define ALLR(v) v.rbegin(), v.rend()
#define ll long long
#define pb push_back
#define forr(i, a, b) for(int i = a; i < b; i++)
#define dorr(i, a, b) for(int i = a; i >= b; i--)
#define ld long double
#define vt vector
#include<fstream>
#define fi first
#define se second
#define pll pair<ll, ll>
#define pii pair<int, int>
#define mpp make_pair
const ld PI = 3.14159265359;
using u128 = __uint128_t;
const int x[4] = {1, 0, -1, 0};
const int y[4] = {0, -1, 0, 1};
const ll mod = 1e9 + 7;
const int mxn = 5e4 + 69, mxq = 1e5 + 5, sq = 500, mxv = 2e7 + 5;
//const int base = (1 <<18);
const int inf = 1e9 + 5, neg = -69420;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
//const int x[9] = {0, 1, 1, -1, -1, 2, -2, 2, -2};
//const inty[9] = {0, 2, -2, 2, -2, 1, 1, -1, -1};
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
#define ordered_set tree<pii, null_type,less<pii>, rb_tree_tag,tree_order_statistics_node_update>
int r, c, q;
vt<vt<int>>a, colour;
int toa[mxn + 1];
bool cmp(pii ca, pii cb){
    return(a[ca.fi][ca.se] < a[cb.fi][cb.se]);
}
int pa[mxn + 1], tin[mxn + 1], tout[mxn + 1], tt = 0, tonode[mxn + 1], up[mxn + 1][17], rp[mxn + 1], toc[mxn + 1];
vt<int>adj[mxn + 1];
int fp(int u){
    if(pa[u] < 0)return(u);
    return((pa[u] = fp(pa[u])));
}
bool unon(int u, int v){
    u = fp(u); v = fp(v);
    if(u == v)return(0);
    pa[u] += pa[v]; pa[v] = u;
    return(1);
}
void dfs(int s){
    tin[s] = ++tt; tonode[tt] = s;
    for(auto i: adj[s]){
        dfs(i);
    }
    tout[s] = tt;
}

set<int>co[mxn + 1];
ordered_set st[4 * mxn + 1];
void build(int nd, int l, int r){
    if(l == r){
        st[nd].insert(mpp(rp[l], l));
        return;
    }
    int mid = (l + r) >> 1;
    build(nd << 1, l, mid); build(nd << 1 | 1, mid + 1, r);
    for(int i = l; i <= r; i++)st[nd].insert(mpp(rp[i], i));
}
void upd(int nd, int l, int r, int id, int v){
    st[nd].erase(mpp(rp[id], id)); st[nd].insert(mpp(v, id));
    if(l == r)return;
    int mid = (l + r) >> 1;
    if(id <= mid)upd(nd << 1, l, mid, id, v);
    else upd(nd << 1 | 1, mid + 1, r, id, v);
}
int get(int nd, int l, int r, int ql, int qr){
    if(ql > r || qr < l)return(0);
    if(ql <= l && qr >= r){
        int cntless = st[nd].order_of_key(mpp(qr, inf));
        //for(auto i: st[nd])cout << i.fi << " " << i.se << "\n";
        return(r - l + 1 - cntless);
    }
    int mid = (l + r) >> 1;
    return(get(nd << 1, l, mid, ql, qr) + get(nd << 1 | 1, mid + 1, r, ql, qr));
}
void rem(int idc, int pos){
    auto it = co[idc].lower_bound(pos);
    if(it != co[idc].begin()){
        auto lw = prev(it), hg = next(it);
        if(hg == co[idc].end()){
            upd(1, 1, r * c, *lw, r * c + 1); 
			rp[*lw] = r * c + 1;
        }else{
            upd(1, 1, r * c, *lw, *hg); 
			rp[*lw] = *hg;
        }
    }
    co[idc].erase(pos);
}
void add(int idc, int pos){
    auto it = co[idc].lower_bound(pos);
    if(it != co[idc].end()){
        upd(1, 1, r * c, pos, *it); 
		rp[pos] = *it;
    }else{
        upd(1, 1, r * c, pos, r * c + 1); 
		rp[pos] = r * c + 1;
    }
    if(it != co[idc].begin()){
        auto lg = prev(it);
        upd(1, 1, r * c, *lg, pos); 
		rp[*lg] = pos;
    }
    co[idc].insert(pos);
}
int coef(int px, int py){
    return((px - 1) * c + py);
}
bool inside(int px, int py){
    return(px >= 1 && py >= 1 && px <= r && py <= c);
}
signed main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    //freopen("COLLEGE.INP", "r", stdin);
    //freopen("COLLEGE.OUT", "w", stdout);
    cin >> r >> c >> q;
    for(int i = 1; i <= r * c; i++)pa[i] = -1;
    vt<pii>comp;
    a.resize(r + 1, vt<int>(c + 1)); colour.resize(r + 1, vt<int>(c + 1));
    for(int i = 1; i <= r; i++){
        for(int j = 1; j <= c; j++){
            cin >> a[i][j]; comp.pb(mpp(i, j));  toa[coef(i, j)] = a[i][j];
        }
    }
    for(int i = 1; i <= r; i++){
        for(int j = 1; j <= c; j++){

            cin >> toc[coef(i, j)];
        }
    }

    sort(ALL(comp), cmp);
    for(auto [px, py]: comp){
        int u = coef(px, py);
        forr(i, 0, 4){
            int nwx = px + x[i], nwy = py + y[i];
            if(inside(nwx, nwy) && a[nwx][nwy] < a[px][py]){

                int v = fp(coef(nwx, nwy));
                if(unon(u, v)){
                    adj[u].pb(v); up[v][0] = u;
                }
            }
        }
    }


    int root = fp(1); up[root][0] = root;
    //for(int i = 1; i <= r * c; i++)cout << up[i][0] << " ";
    for(int i = 1; i < 17; i++){
        for(int j = 1; j <= r * c; j++){
            up[j][i] = up[up[j][i - 1]][i - 1];
            //cout << up[j][i] << " ";
        }
    }

    dfs(root);
    for(int i = r * c; i >= 1; i--){
        int u = tonode[i];
        if(co[toc[u]].empty()){
            rp[i] = r * c + 1;
        }else{
            rp[i] = *co[toc[u]].begin();
        }
        //cout << u << " " << rp[i] << "\n";
        co[toc[u]].insert(i);
    }
    build(1, 1, r * c);
    //cout << rp[4] << " " << rp[5] << " ";

    while(q--){
        int idq; cin >> idq;
        if(idq == 1){
            int px, py, p; cin >> px >> py >> p; swap(px, py);
            int u = coef(px, py);
            rem(toc[u], tin[u]); toc[u] = p; add(toc[u], tin[u]);
        }else{
            int px, py, l; cin >> px >> py >> l; swap(px, py);
            int u = coef(px, py);
            if(toa[u] > l){
                //cout << "aa";
                cout << 0 << "\n";
            }else{
                for(int i = 16; i >= 0; i--){
                    if(toa[up[u][i]] <= l){
                        u = up[u][i];
                    }
                }

                cout << get(1, 1, r * c, tin[u], tout[u]) << "\n";
            }
        }
    }

    return(0);
}
/*
1 5 1
1 2 3 4 5
1 1 2 1 2
2 2 1 2
2 1 1 4
2 4 1 3
1 3 1 1
2 3 1 4
*/

컴파일 시 표준 에러 (stderr) 메시지

pokemonmaster.cpp: In function 'int main()':
pokemonmaster.cpp:147:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  147 |     for(auto [px, py]: comp){
      |              ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...