Submission #969981

#TimeUsernameProblemLanguageResultExecution timeMemory
969981socpite무지개나라 (APIO17_rainbow)C++14
100 / 100
984 ms140288 KiB
#include "rainbow.h"
#include<bits/stdc++.h>
using namespace std;

const int maxn = 2e5+5;

vector<int> pos[4][maxn];
vector<int> FW[4][maxn];

vector<pair<int, int>> E[4];

int r, c;

void fadd(int x, int y, int id){
    for(x; x <= r; x += x&(-x))pos[id][x].push_back(y);
}

void add(int x, int y, int id){
    for(x; x <= r; x += x&(-x)){
        for(int idx = lower_bound(pos[id][x].begin(), pos[id][x].end(), y) - pos[id][x].begin(); idx < FW[id][x].size(); idx += idx&(-idx)){
            FW[id][x][idx]++;
        }
    }
}

int query(int x, int y, int id){
    int re = 0;
    for(x; x > 0; x -= x&(-x)){
        for(int idx = upper_bound(pos[id][x].begin(), pos[id][x].end(), y) - pos[id][x].begin() - 1; idx > 0; idx -= idx&(-idx)){
            re += FW[id][x][idx];
        }
    }
    return re;
}

int query_rect(int x1, int y1, int x2, int y2, int id){
    if(x1 > x2 || y1 > y2)return 0;
    return query(x2, y2, id) - query(x1-1, y2, id) - query(x2, y1-1, id) + query(x1-1, y1-1, id);
}

void add_square(int sr, int sc){
    // cout << sr << " " << sc << endl;
    E[0].push_back({sr, sc});
    E[0].push_back({sr+1, sc});

    E[1].push_back({sr, sc});
    E[1].push_back({sr, sc+1});

    E[2].push_back({sr, sc});

    E[3].push_back({sr, sc});
    E[3].push_back({sr, sc+1});
    E[3].push_back({sr+1, sc+1});
    E[3].push_back({sr+1, sc});
}

void init(int R, int C, int sr, int sc, int M, char *S) {
    r = R;
    c = C;
    add_square(sr, sc);
    for(int i = 0; i < M; i++){
        if(S[i] == 'N')sr--;
        else if(S[i] == 'W')sc--;
        else if(S[i] == 'S')sr++;
        else sc++;
        add_square(sr, sc);
    }
    for(int id = 0; id < 4; id++){
        sort(E[id].begin(), E[id].end());
        E[id].erase(unique(E[id].begin(), E[id].end()), E[id].end());
        for(auto v: E[id])fadd(v.first, v.second, id);

        for(int i = 1; i <= r; i++){
            pos[id][i].push_back(-1);
            sort(pos[id][i].begin(), pos[id][i].end());
            pos[id][i].erase(unique(pos[id][i].begin(), pos[id][i].end()), pos[id][i].end());
            FW[id][i].assign(pos[id][i].size(), 0);
        }

        for(auto v: E[id])add(v.first, v.second, id);                                     
    }
    
}

// V - E + F - C = 1 => F = 1 + C + E - V
// 

int colour(int ar, int ac, int br, int bc) {
    int F = query_rect(ar, ac, br, bc, 2);
    if(F == 0)return 1;
    int V = (br - ar + 1)*2 + (bc - ac + 1)*2 + query_rect(ar+1, ac+1, br, bc, 3);
    int E = (br - ar + 1)*2 + (bc - ac + 1)*2 + query_rect(ar+1, ac, br, bc, 0) + query_rect(ar, ac+1, br, bc, 1);
    int C = 1 + (query_rect(ar+1, ac+1, br-1, bc-1, 2) == F);
    F++;
    return 1 + C + E - V - F;
}

Compilation message (stderr)

rainbow.cpp: In function 'void fadd(int, int, int)':
rainbow.cpp:15:9: warning: statement has no effect [-Wunused-value]
   15 |     for(x; x <= r; x += x&(-x))pos[id][x].push_back(y);
      |         ^
rainbow.cpp: In function 'void add(int, int, int)':
rainbow.cpp:19:9: warning: statement has no effect [-Wunused-value]
   19 |     for(x; x <= r; x += x&(-x)){
      |         ^
rainbow.cpp:20:102: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   20 |         for(int idx = lower_bound(pos[id][x].begin(), pos[id][x].end(), y) - pos[id][x].begin(); idx < FW[id][x].size(); idx += idx&(-idx)){
      |                                                                                                  ~~~~^~~~~~~~~~~~~~~~~~
rainbow.cpp: In function 'int query(int, int, int)':
rainbow.cpp:28:9: warning: statement has no effect [-Wunused-value]
   28 |     for(x; x > 0; x -= x&(-x)){
      |         ^
#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...