답안 #893471

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
893471 2023-12-27T05:36:32 Z vjudge1 Road Construction (JOI21_road_construction) C++17
18 / 100
3348 ms 420056 KB
/*

author : abushbandit

platform : vjudge

date : 27.12.2023

contest : Izho PREP (contest #8)

problem : A - Road Construction

for subtask 1,2,3 !!!

*/


#include <bits/stdc++.h>

using namespace std;

#define int long long
#define pb push_back
#define all(x) x.begin(),x.end()
#define ff first
#define ss second

const long long INF = 1e18;
const int N = 1e5 + 1;
 
vector<pair<int, int>> a;
multiset<int> ans;
map<pair<pair<int,int>,pair<int,int>>,bool> vis;
int mn = INF;
int n,k;
 
int dist(pair<int, int> f, pair<int, int> s){
    return abs(f.ff - s.ff) + abs(f.ss - s.ss);
}
 
void update(pair<int, int> f, pair<int, int> s){
	if(vis[{f,s}] || vis[{s,f}]) return;
    ans.insert(dist(f, s));
    vis[{f,s}] = 1;
    if(ans.size() == k) mn = *(--	ans.end());
    else if(ans.size() > k) {
        ans.erase((--ans.end()));
        mn = *(--ans.end());
    }
}
 
bool cmp(pair<int, int> f, pair<int, int> s){
    return f.ss < s.ss;
}
 
void rec(int l, int r){
    if (r - l <= 3) {
        for (int i = l; i < r; i++) {
            for (int j = i + 1; j <= r; j++) {
                update(a[i], a[j]);
            }
        }
        sort(a.begin() + l, a.begin() + r + 1, cmp);
        return;
    }
 
    int m = (l + r) >> 1;
    int md = a[m].ff;
    rec(l, m), rec(m + 1, r);
    vector<pair<int, int>> t(r - l + 1);
    merge(a.begin() + l, a.begin() + m + 1, a.begin() + m + 1, a.begin() + r + 1, t.begin(), cmp);
    copy(t.begin(), t.begin() + r - l + 1, a.begin() + l);
 
    int sz = 0;
    for (int i = l; i <= r; i++) {
        if (abs(a[i].ff - md) < mn) {
            for (int j = sz - 1; j >= 0 && a[i].ss - t[j].ss < mn; j--) {
                update(a[i], t[j]);
            }
            t[sz] = a[i];
            sz++;
        }
    }
}

signed main(){
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
 
    cin >> n >> k;
    int cnt = 0;
    for (int i = 0; i < n; i++) {
        int x, y;
        cin >> x >> y;
        if(y == 0){
        	cnt++;
		}
        a.pb({x, y});
    }
    if(cnt == n || k <= 5 || n <= 1000){
	    sort(all(a));
	    rec(0, n - 1);
	    for(auto i : ans){
	    	cout << i << "\n";
		}	
	}
}	

Compilation message

road_construction.cpp: In function 'void update(std::pair<long long int, long long int>, std::pair<long long int, long long int>)':
road_construction.cpp:45:19: warning: comparison of integer expressions of different signedness: 'std::multiset<long long int>::size_type' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
   45 |     if(ans.size() == k) mn = *(-- ans.end());
      |        ~~~~~~~~~~~^~~~
road_construction.cpp:46:24: warning: comparison of integer expressions of different signedness: 'std::multiset<long long int>::size_type' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
   46 |     else if(ans.size() > k) {
      |             ~~~~~~~~~~~^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 950 ms 88656 KB Output is correct
2 Correct 941 ms 88656 KB Output is correct
3 Correct 494 ms 53844 KB Output is correct
4 Correct 450 ms 53840 KB Output is correct
5 Correct 705 ms 74120 KB Output is correct
6 Correct 10 ms 2652 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3348 ms 389704 KB Output is correct
2 Correct 3338 ms 390060 KB Output is correct
3 Correct 404 ms 53892 KB Output is correct
4 Correct 3047 ms 420056 KB Output is correct
5 Correct 2351 ms 378156 KB Output is correct
6 Correct 2355 ms 378404 KB Output is correct
7 Correct 2431 ms 381304 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 235 ms 66032 KB Output is correct
2 Correct 231 ms 66000 KB Output is correct
3 Correct 0 ms 344 KB Output is correct
4 Correct 201 ms 65896 KB Output is correct
5 Correct 236 ms 65928 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 235 ms 66032 KB Output is correct
2 Correct 231 ms 66000 KB Output is correct
3 Correct 0 ms 344 KB Output is correct
4 Correct 201 ms 65896 KB Output is correct
5 Correct 236 ms 65928 KB Output is correct
6 Incorrect 41 ms 5576 KB Output isn't correct
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 950 ms 88656 KB Output is correct
2 Correct 941 ms 88656 KB Output is correct
3 Correct 494 ms 53844 KB Output is correct
4 Correct 450 ms 53840 KB Output is correct
5 Correct 705 ms 74120 KB Output is correct
6 Correct 10 ms 2652 KB Output is correct
7 Incorrect 17 ms 2520 KB Output isn't correct
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 950 ms 88656 KB Output is correct
2 Correct 941 ms 88656 KB Output is correct
3 Correct 494 ms 53844 KB Output is correct
4 Correct 450 ms 53840 KB Output is correct
5 Correct 705 ms 74120 KB Output is correct
6 Correct 10 ms 2652 KB Output is correct
7 Correct 3348 ms 389704 KB Output is correct
8 Correct 3338 ms 390060 KB Output is correct
9 Correct 404 ms 53892 KB Output is correct
10 Correct 3047 ms 420056 KB Output is correct
11 Correct 2351 ms 378156 KB Output is correct
12 Correct 2355 ms 378404 KB Output is correct
13 Correct 2431 ms 381304 KB Output is correct
14 Correct 235 ms 66032 KB Output is correct
15 Correct 231 ms 66000 KB Output is correct
16 Correct 0 ms 344 KB Output is correct
17 Correct 201 ms 65896 KB Output is correct
18 Correct 236 ms 65928 KB Output is correct
19 Incorrect 41 ms 5576 KB Output isn't correct
20 Halted 0 ms 0 KB -