답안 #159491

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
159491 2019-10-23T00:50:00 Z arnold518 새 집 (APIO18_new_home) C++14
47 / 100
5000 ms 456428 KB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int MAXN = 3e5;
const int MAXVAL = 1e8;

struct Query
{
    int t, x, k, p;
    bool operator < (const Query &p)
    {
        if(t!=p.t) return t<p.t;
        return k>p.k;
    }
};

int N, K, Q, ans[MAXN+10], SZ, chk;
vector<Query> query;
multiset<int> S[MAXN+10];
set<int> scomp;
vector<int> comp;

int getcomp(int x)
{
    //for(auto it : comp) printf("%d ", it); printf("-> %d\n", x);
    assert(binary_search(comp.begin(), comp.end(), x));
    return lower_bound(comp.begin(), comp.end(), x)-comp.begin();
}

priority_queue<int, vector<int>, less<int>> tree1[5*MAXN+10];
priority_queue<int, vector<int>, less<int>> dead1[5*MAXN+10];

priority_queue<int, vector<int>, greater<int>> tree2[5*MAXN+10];
priority_queue<int, vector<int>, greater<int>> dead2[5*MAXN+10];

ll query1(int x)
{
    int y=x;
    x=getcomp(x);
    int ret=0;
    for(; x>0; x-=(x&-x))
    {
        while(!tree1[x].empty() && !dead1[x].empty() && tree1[x].top()==dead1[x].top()) tree1[x].pop(), dead1[x].pop();
        if(!tree1[x].empty())
        {
            ////printf("QUERY1 %d %d\n", x, tree1[x].top()-y);
            ret=max(ret, tree1[x].top()-y);
        }
    }
    return ret;
}

void erase1(int x, int y)
{
    ////printf("ERASE1 %d %d\n", x, y);
    x=getcomp(x);
    for(; x<=SZ; x+=(x&-x))
    {
        dead1[x].push(y);
    }
}

void insert1(int x, int y)
{
    //printf("INSERT1 %d %d\n", x, y);
    x=getcomp(x);
    for(; x<=SZ; x+=(x&-x))
    {
        tree1[x].push(y);
    }
}

ll query2(int x)
{
    int y=x;
    x=getcomp(x);
    x=SZ-x+1;
    int ret=0;
    for(; x>0; x-=(x&-x))
    {
        while(!tree2[x].empty() && !dead2[x].empty() && tree2[x].top()==dead2[x].top()) tree2[x].pop(), dead2[x].pop();
        if(!tree2[x].empty())
        {
            ////printf("QUERY1 %d %d\n", x, y-tree2[x].top());
            ret=max(ret, y-tree2[x].top());
        }
    }
    return ret;
}

void erase2(int x, int y)
{
    swap(x, y);
    ////printf("ERASE2 %d %d\n", x, y);
    x=getcomp(x);
    x=SZ-x+1;
    for(; x<=SZ; x+=(x&-x))
    {
        dead2[x].push(y);
    }
}

void insert2(int x, int y)
{
    //printf("INSERT2 %d %d\n", x, y);
    swap(x, y);
    x=getcomp(x);
    x=SZ-x+1;
    for(; x<=SZ; x+=(x&-x))
    {
        tree2[x].push(y);
    }
}

int main()
{
    int i, j;

    scanf("%d%d%d", &N, &K, &Q);
    for(i=1; i<=N; i++)
    {
        int x, t, a, b;
        scanf("%d%d%d%d", &x, &t, &a, &b); b++; x*=2;
        query.push_back({a, x, t, 1});
        query.push_back({b, x, t, -1});
        scomp.insert(x);
    }
    for(i=1; i<=Q; i++)
    {
        int l, x;
        scanf("%d%d", &x, &l); x*=2;
        query.push_back({l, x, -i, 0});
        scomp.insert(x);
    }
    sort(query.begin(), query.end());

    scomp.insert(0); scomp.insert(2e8);
    for(auto now : query)
    {
        int x=now.x;
        if(now.p==1)
        {
            if(S[now.k].find(x)==S[now.k].end())
            {
                if(S[now.k].size()!=0)
                {
                    auto it=S[now.k].lower_bound(x);
                    int r=*it, l=*prev(it);
                    if(it==S[now.k].end()) scomp.insert(l+x>>1);
                    else if(it==S[now.k].begin()) scomp.insert(r+x>>1);
                    else
                    {
                        scomp.insert(l+x>>1);
                        scomp.insert(r+x>>1);
                    }
                }
            }
            S[now.k].insert(x);
        }
        else if(now.p==-1)
        {
            S[now.k].erase(S[now.k].find(x));
            if(S[now.k].find(x)==S[now.k].end())
            {
                if(S[now.k].size()!=0)
                {
                    auto it=S[now.k].lower_bound(x);
                    int r=*it, l=*prev(it);
                    if(it==S[now.k].end());
                    else if(it==S[now.k].begin());
                    else scomp.insert(l+r>>1);
                }
            }
        }
    }

    comp.push_back(-1);
    for(auto it : scomp) comp.push_back(it);
    SZ=comp.size()-1;

    for(i=1; i<=K; i++) S[i].clear();

    for(auto now : query)
    {
        //printf("===============\n");
        int x=now.x;
        if(now.p==0)
        {
            if(chk!=K) ans[-now.k]=-1;
            else ans[-now.k]=max(query1(x), query2(x))>>1;
            //printf("!%d %d %d\n", -now.k, query1(x), query2(x));
        }
        else if(now.p==1)
        {
            if(S[now.k].find(now.x)==S[now.k].end())
            {
                if(S[now.k].size()==0)
                {
                    insert1(0, x);
                    insert2(x, 2e8);
                    chk++;
                }
                else
                {
                    auto it=S[now.k].lower_bound(x);
                    int r=*it, l=*prev(it);
                    if(it==S[now.k].end())
                    {
                        erase2(l, 2e8);
                        insert2(l, l+x>>1);
                        insert1(l+x>>1, x);
                        insert2(x, 2e8);
                    }
                    else if(it==S[now.k].begin())
                    {
                        erase1(0, r);
                        insert1(0, x);
                        insert2(x, r+x>>1);
                        insert1(r+x>>1, r);
                    }
                    else
                    {
                        erase2(l, l+r>>1);
                        erase1(l+r>>1, r);
                        insert2(l, l+x>>1);
                        insert1(l+x>>1, x);
                        insert2(x, x+r>>1);
                        insert1(x+r>>1, r);
                    }
                }
            }
            S[now.k].insert(now.x);
        }
        else if(now.p==-1)
        {
            S[now.k].erase(S[now.k].find(now.x));
            if(S[now.k].find(now.x)==S[now.k].end())
            {
                if(S[now.k].size()==0)
                {
                    erase1(0, x);
                    erase2(x, 2e8);
                    chk--;
                }
                else
                {
                    auto it=S[now.k].lower_bound(x);
                    int r=*it, l=*prev(it);
                    if(it==S[now.k].end())
                    {
                        insert2(l, 2e8);
                        erase2(l, l+x>>1);
                        erase1(l+x>>1, x);
                        erase2(x, 2e8);
                    }
                    else if(it==S[now.k].begin())
                    {
                        insert1(0, r);
                        erase1(0, x);
                        erase2(x, r+x>>1);
                        erase1(r+x>>1, r);
                    }
                    else
                    {
                        insert2(l, l+r>>1);
                        insert1(l+r>>1, r);
                        erase2(l, l+x>>1);
                        erase1(l+x>>1, x);
                        erase2(x, x+r>>1);
                        erase1(x+r>>1, r);
                    }
                }
            }
        }
    }
    for(i=1; i<=Q; i++) printf("%d\n", ans[i]);
}

Compilation message

new_home.cpp: In function 'int main()':
new_home.cpp:153:58: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                     if(it==S[now.k].end()) scomp.insert(l+x>>1);
                                                         ~^~
new_home.cpp:154:65: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                     else if(it==S[now.k].begin()) scomp.insert(r+x>>1);
                                                                ~^~
new_home.cpp:157:39: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         scomp.insert(l+x>>1);
                                      ~^~
new_home.cpp:158:39: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         scomp.insert(r+x>>1);
                                      ~^~
new_home.cpp:175:40: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                     else scomp.insert(l+r>>1);
                                       ~^~
new_home.cpp:214:37: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         insert2(l, l+x>>1);
                                    ~^~
new_home.cpp:215:34: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         insert1(l+x>>1, x);
                                 ~^~
new_home.cpp:222:37: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         insert2(x, r+x>>1);
                                    ~^~
new_home.cpp:223:34: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         insert1(r+x>>1, r);
                                 ~^~
new_home.cpp:227:36: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         erase2(l, l+r>>1);
                                   ~^~
new_home.cpp:228:33: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         erase1(l+r>>1, r);
                                ~^~
new_home.cpp:229:37: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         insert2(l, l+x>>1);
                                    ~^~
new_home.cpp:230:34: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         insert1(l+x>>1, x);
                                 ~^~
new_home.cpp:231:37: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         insert2(x, x+r>>1);
                                    ~^~
new_home.cpp:232:34: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         insert1(x+r>>1, r);
                                 ~^~
new_home.cpp:256:36: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         erase2(l, l+x>>1);
                                   ~^~
new_home.cpp:257:33: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         erase1(l+x>>1, x);
                                ~^~
new_home.cpp:264:36: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         erase2(x, r+x>>1);
                                   ~^~
new_home.cpp:265:33: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         erase1(r+x>>1, r);
                                ~^~
new_home.cpp:269:37: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         insert2(l, l+r>>1);
                                    ~^~
new_home.cpp:270:34: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         insert1(l+r>>1, r);
                                 ~^~
new_home.cpp:271:36: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         erase2(l, l+x>>1);
                                   ~^~
new_home.cpp:272:33: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         erase1(l+x>>1, x);
                                ~^~
new_home.cpp:273:36: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         erase2(x, x+r>>1);
                                   ~^~
new_home.cpp:274:33: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         erase1(x+r>>1, r);
                                ~^~
new_home.cpp:121:12: warning: unused variable 'j' [-Wunused-variable]
     int i, j;
            ^
new_home.cpp:123:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d%d", &N, &K, &Q);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~
new_home.cpp:127:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d%d%d", &x, &t, &a, &b); b++; x*=2;
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
new_home.cpp:135:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d", &x, &l); x*=2;
         ~~~~~^~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 200 ms 202528 KB Output is correct
2 Correct 181 ms 202312 KB Output is correct
3 Correct 181 ms 202204 KB Output is correct
4 Correct 182 ms 202320 KB Output is correct
5 Correct 184 ms 202400 KB Output is correct
6 Correct 188 ms 202588 KB Output is correct
7 Correct 182 ms 202488 KB Output is correct
8 Correct 205 ms 202524 KB Output is correct
9 Correct 182 ms 202468 KB Output is correct
10 Correct 187 ms 202632 KB Output is correct
11 Correct 215 ms 202468 KB Output is correct
12 Correct 207 ms 202744 KB Output is correct
13 Correct 184 ms 202488 KB Output is correct
14 Correct 190 ms 202688 KB Output is correct
15 Correct 187 ms 202488 KB Output is correct
16 Correct 184 ms 202616 KB Output is correct
17 Correct 186 ms 202748 KB Output is correct
18 Correct 184 ms 202488 KB Output is correct
19 Correct 183 ms 202488 KB Output is correct
20 Correct 185 ms 202580 KB Output is correct
21 Correct 183 ms 202360 KB Output is correct
22 Correct 182 ms 202492 KB Output is correct
23 Correct 183 ms 202488 KB Output is correct
24 Correct 184 ms 202696 KB Output is correct
25 Correct 183 ms 202540 KB Output is correct
26 Correct 185 ms 202616 KB Output is correct
27 Correct 185 ms 202364 KB Output is correct
28 Correct 185 ms 202600 KB Output is correct
29 Correct 183 ms 202516 KB Output is correct
30 Correct 186 ms 202436 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 200 ms 202528 KB Output is correct
2 Correct 181 ms 202312 KB Output is correct
3 Correct 181 ms 202204 KB Output is correct
4 Correct 182 ms 202320 KB Output is correct
5 Correct 184 ms 202400 KB Output is correct
6 Correct 188 ms 202588 KB Output is correct
7 Correct 182 ms 202488 KB Output is correct
8 Correct 205 ms 202524 KB Output is correct
9 Correct 182 ms 202468 KB Output is correct
10 Correct 187 ms 202632 KB Output is correct
11 Correct 215 ms 202468 KB Output is correct
12 Correct 207 ms 202744 KB Output is correct
13 Correct 184 ms 202488 KB Output is correct
14 Correct 190 ms 202688 KB Output is correct
15 Correct 187 ms 202488 KB Output is correct
16 Correct 184 ms 202616 KB Output is correct
17 Correct 186 ms 202748 KB Output is correct
18 Correct 184 ms 202488 KB Output is correct
19 Correct 183 ms 202488 KB Output is correct
20 Correct 185 ms 202580 KB Output is correct
21 Correct 183 ms 202360 KB Output is correct
22 Correct 182 ms 202492 KB Output is correct
23 Correct 183 ms 202488 KB Output is correct
24 Correct 184 ms 202696 KB Output is correct
25 Correct 183 ms 202540 KB Output is correct
26 Correct 185 ms 202616 KB Output is correct
27 Correct 185 ms 202364 KB Output is correct
28 Correct 185 ms 202600 KB Output is correct
29 Correct 183 ms 202516 KB Output is correct
30 Correct 186 ms 202436 KB Output is correct
31 Correct 1806 ms 272836 KB Output is correct
32 Correct 292 ms 206684 KB Output is correct
33 Correct 1842 ms 273932 KB Output is correct
34 Correct 1749 ms 270972 KB Output is correct
35 Correct 1892 ms 274276 KB Output is correct
36 Correct 1873 ms 276052 KB Output is correct
37 Correct 1453 ms 272172 KB Output is correct
38 Correct 1477 ms 273308 KB Output is correct
39 Correct 1208 ms 271500 KB Output is correct
40 Correct 1249 ms 272588 KB Output is correct
41 Correct 1200 ms 250904 KB Output is correct
42 Correct 1161 ms 252192 KB Output is correct
43 Correct 260 ms 208724 KB Output is correct
44 Correct 1207 ms 250512 KB Output is correct
45 Correct 1186 ms 247344 KB Output is correct
46 Correct 1320 ms 239992 KB Output is correct
47 Correct 801 ms 249176 KB Output is correct
48 Correct 848 ms 250540 KB Output is correct
49 Correct 926 ms 251104 KB Output is correct
50 Correct 936 ms 251624 KB Output is correct
51 Correct 966 ms 249592 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5119 ms 456428 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5041 ms 437112 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 200 ms 202528 KB Output is correct
2 Correct 181 ms 202312 KB Output is correct
3 Correct 181 ms 202204 KB Output is correct
4 Correct 182 ms 202320 KB Output is correct
5 Correct 184 ms 202400 KB Output is correct
6 Correct 188 ms 202588 KB Output is correct
7 Correct 182 ms 202488 KB Output is correct
8 Correct 205 ms 202524 KB Output is correct
9 Correct 182 ms 202468 KB Output is correct
10 Correct 187 ms 202632 KB Output is correct
11 Correct 215 ms 202468 KB Output is correct
12 Correct 207 ms 202744 KB Output is correct
13 Correct 184 ms 202488 KB Output is correct
14 Correct 190 ms 202688 KB Output is correct
15 Correct 187 ms 202488 KB Output is correct
16 Correct 184 ms 202616 KB Output is correct
17 Correct 186 ms 202748 KB Output is correct
18 Correct 184 ms 202488 KB Output is correct
19 Correct 183 ms 202488 KB Output is correct
20 Correct 185 ms 202580 KB Output is correct
21 Correct 183 ms 202360 KB Output is correct
22 Correct 182 ms 202492 KB Output is correct
23 Correct 183 ms 202488 KB Output is correct
24 Correct 184 ms 202696 KB Output is correct
25 Correct 183 ms 202540 KB Output is correct
26 Correct 185 ms 202616 KB Output is correct
27 Correct 185 ms 202364 KB Output is correct
28 Correct 185 ms 202600 KB Output is correct
29 Correct 183 ms 202516 KB Output is correct
30 Correct 186 ms 202436 KB Output is correct
31 Correct 1806 ms 272836 KB Output is correct
32 Correct 292 ms 206684 KB Output is correct
33 Correct 1842 ms 273932 KB Output is correct
34 Correct 1749 ms 270972 KB Output is correct
35 Correct 1892 ms 274276 KB Output is correct
36 Correct 1873 ms 276052 KB Output is correct
37 Correct 1453 ms 272172 KB Output is correct
38 Correct 1477 ms 273308 KB Output is correct
39 Correct 1208 ms 271500 KB Output is correct
40 Correct 1249 ms 272588 KB Output is correct
41 Correct 1200 ms 250904 KB Output is correct
42 Correct 1161 ms 252192 KB Output is correct
43 Correct 260 ms 208724 KB Output is correct
44 Correct 1207 ms 250512 KB Output is correct
45 Correct 1186 ms 247344 KB Output is correct
46 Correct 1320 ms 239992 KB Output is correct
47 Correct 801 ms 249176 KB Output is correct
48 Correct 848 ms 250540 KB Output is correct
49 Correct 926 ms 251104 KB Output is correct
50 Correct 936 ms 251624 KB Output is correct
51 Correct 966 ms 249592 KB Output is correct
52 Correct 471 ms 231860 KB Output is correct
53 Correct 468 ms 230440 KB Output is correct
54 Correct 920 ms 251828 KB Output is correct
55 Correct 959 ms 246744 KB Output is correct
56 Correct 844 ms 243932 KB Output is correct
57 Correct 1126 ms 248728 KB Output is correct
58 Correct 929 ms 246144 KB Output is correct
59 Correct 856 ms 243676 KB Output is correct
60 Correct 1073 ms 249324 KB Output is correct
61 Correct 259 ms 209760 KB Output is correct
62 Correct 471 ms 231988 KB Output is correct
63 Correct 750 ms 245852 KB Output is correct
64 Correct 976 ms 249292 KB Output is correct
65 Correct 1035 ms 252788 KB Output is correct
66 Correct 1164 ms 251868 KB Output is correct
67 Correct 415 ms 218052 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 200 ms 202528 KB Output is correct
2 Correct 181 ms 202312 KB Output is correct
3 Correct 181 ms 202204 KB Output is correct
4 Correct 182 ms 202320 KB Output is correct
5 Correct 184 ms 202400 KB Output is correct
6 Correct 188 ms 202588 KB Output is correct
7 Correct 182 ms 202488 KB Output is correct
8 Correct 205 ms 202524 KB Output is correct
9 Correct 182 ms 202468 KB Output is correct
10 Correct 187 ms 202632 KB Output is correct
11 Correct 215 ms 202468 KB Output is correct
12 Correct 207 ms 202744 KB Output is correct
13 Correct 184 ms 202488 KB Output is correct
14 Correct 190 ms 202688 KB Output is correct
15 Correct 187 ms 202488 KB Output is correct
16 Correct 184 ms 202616 KB Output is correct
17 Correct 186 ms 202748 KB Output is correct
18 Correct 184 ms 202488 KB Output is correct
19 Correct 183 ms 202488 KB Output is correct
20 Correct 185 ms 202580 KB Output is correct
21 Correct 183 ms 202360 KB Output is correct
22 Correct 182 ms 202492 KB Output is correct
23 Correct 183 ms 202488 KB Output is correct
24 Correct 184 ms 202696 KB Output is correct
25 Correct 183 ms 202540 KB Output is correct
26 Correct 185 ms 202616 KB Output is correct
27 Correct 185 ms 202364 KB Output is correct
28 Correct 185 ms 202600 KB Output is correct
29 Correct 183 ms 202516 KB Output is correct
30 Correct 186 ms 202436 KB Output is correct
31 Correct 1806 ms 272836 KB Output is correct
32 Correct 292 ms 206684 KB Output is correct
33 Correct 1842 ms 273932 KB Output is correct
34 Correct 1749 ms 270972 KB Output is correct
35 Correct 1892 ms 274276 KB Output is correct
36 Correct 1873 ms 276052 KB Output is correct
37 Correct 1453 ms 272172 KB Output is correct
38 Correct 1477 ms 273308 KB Output is correct
39 Correct 1208 ms 271500 KB Output is correct
40 Correct 1249 ms 272588 KB Output is correct
41 Correct 1200 ms 250904 KB Output is correct
42 Correct 1161 ms 252192 KB Output is correct
43 Correct 260 ms 208724 KB Output is correct
44 Correct 1207 ms 250512 KB Output is correct
45 Correct 1186 ms 247344 KB Output is correct
46 Correct 1320 ms 239992 KB Output is correct
47 Correct 801 ms 249176 KB Output is correct
48 Correct 848 ms 250540 KB Output is correct
49 Correct 926 ms 251104 KB Output is correct
50 Correct 936 ms 251624 KB Output is correct
51 Correct 966 ms 249592 KB Output is correct
52 Execution timed out 5119 ms 456428 KB Time limit exceeded
53 Halted 0 ms 0 KB -