답안 #159497

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
159497 2019-10-23T00:58:15 Z arnold518 새 집 (APIO18_new_home) C++14
47 / 100
4931 ms 543840 KB
#include <bits/stdc++.h>
#pragma gcc optimize "03"
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[4*MAXN+10];
priority_queue<int, vector<int>, less<int>> dead1[4*MAXN+10];

priority_queue<int, vector<int>, greater<int>> tree2[4*MAXN+10];
priority_queue<int, vector<int>, greater<int>> dead2[4*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);
    }
    int last=0;
    for(i=1; i<=Q; i++)
    {
        int l, x;
        scanf("%d%d", &x, &l); x*=2;
        query.push_back({l, x, -i, 0});
        last=max(last, l);
        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=scomp.size();

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

    for(auto now : query)
    {
        //printf("===============\n");
        if(last<now.t) break;
        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:2:0: warning: ignoring #pragma gcc optimize [-Wunknown-pragmas]
 #pragma gcc optimize "03"
 
new_home.cpp: In function 'int main()':
new_home.cpp:156:58: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                     if(it==S[now.k].end()) scomp.insert(l+x>>1);
                                                         ~^~
new_home.cpp:157:65: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                     else if(it==S[now.k].begin()) scomp.insert(r+x>>1);
                                                                ~^~
new_home.cpp:160:39: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         scomp.insert(l+x>>1);
                                      ~^~
new_home.cpp:161:39: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         scomp.insert(r+x>>1);
                                      ~^~
new_home.cpp:178:40: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                     else scomp.insert(l+r>>1);
                                       ~^~
new_home.cpp:218:37: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         insert2(l, l+x>>1);
                                    ~^~
new_home.cpp:219:34: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         insert1(l+x>>1, x);
                                 ~^~
new_home.cpp:226:37: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         insert2(x, r+x>>1);
                                    ~^~
new_home.cpp:227:34: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         insert1(r+x>>1, r);
                                 ~^~
new_home.cpp:231:36: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         erase2(l, l+r>>1);
                                   ~^~
new_home.cpp:232:33: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         erase1(l+r>>1, r);
                                ~^~
new_home.cpp:233:37: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         insert2(l, l+x>>1);
                                    ~^~
new_home.cpp:234:34: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         insert1(l+x>>1, x);
                                 ~^~
new_home.cpp:235:37: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         insert2(x, x+r>>1);
                                    ~^~
new_home.cpp:236:34: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         insert1(x+r>>1, r);
                                 ~^~
new_home.cpp:260:36: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         erase2(l, l+x>>1);
                                   ~^~
new_home.cpp:261:33: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         erase1(l+x>>1, x);
                                ~^~
new_home.cpp:268:36: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         erase2(x, r+x>>1);
                                   ~^~
new_home.cpp:269:33: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         erase1(r+x>>1, r);
                                ~^~
new_home.cpp:273:37: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         insert2(l, l+r>>1);
                                    ~^~
new_home.cpp:274:34: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         insert1(l+r>>1, r);
                                 ~^~
new_home.cpp:275:36: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         erase2(l, l+x>>1);
                                   ~^~
new_home.cpp:276:33: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         erase1(l+x>>1, x);
                                ~^~
new_home.cpp:277:36: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         erase2(x, x+r>>1);
                                   ~^~
new_home.cpp:278:33: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                         erase1(x+r>>1, r);
                                ~^~
new_home.cpp:122:12: warning: unused variable 'j' [-Wunused-variable]
     int i, j;
            ^
new_home.cpp:124: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:128: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:137: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 149 ms 164816 KB Output is correct
2 Correct 150 ms 164880 KB Output is correct
3 Correct 149 ms 164728 KB Output is correct
4 Correct 150 ms 164744 KB Output is correct
5 Correct 149 ms 164728 KB Output is correct
6 Correct 172 ms 165180 KB Output is correct
7 Correct 176 ms 164912 KB Output is correct
8 Correct 176 ms 164984 KB Output is correct
9 Correct 183 ms 164856 KB Output is correct
10 Correct 181 ms 165052 KB Output is correct
11 Correct 171 ms 164984 KB Output is correct
12 Correct 163 ms 165008 KB Output is correct
13 Correct 151 ms 164956 KB Output is correct
14 Correct 167 ms 164968 KB Output is correct
15 Correct 150 ms 164956 KB Output is correct
16 Correct 152 ms 164956 KB Output is correct
17 Correct 151 ms 164976 KB Output is correct
18 Correct 176 ms 164952 KB Output is correct
19 Correct 180 ms 164984 KB Output is correct
20 Correct 167 ms 164984 KB Output is correct
21 Correct 150 ms 164808 KB Output is correct
22 Correct 149 ms 164888 KB Output is correct
23 Correct 151 ms 165004 KB Output is correct
24 Correct 152 ms 164984 KB Output is correct
25 Correct 154 ms 164984 KB Output is correct
26 Correct 164 ms 165172 KB Output is correct
27 Correct 166 ms 164984 KB Output is correct
28 Correct 153 ms 164984 KB Output is correct
29 Correct 154 ms 164984 KB Output is correct
30 Correct 162 ms 164968 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 149 ms 164816 KB Output is correct
2 Correct 150 ms 164880 KB Output is correct
3 Correct 149 ms 164728 KB Output is correct
4 Correct 150 ms 164744 KB Output is correct
5 Correct 149 ms 164728 KB Output is correct
6 Correct 172 ms 165180 KB Output is correct
7 Correct 176 ms 164912 KB Output is correct
8 Correct 176 ms 164984 KB Output is correct
9 Correct 183 ms 164856 KB Output is correct
10 Correct 181 ms 165052 KB Output is correct
11 Correct 171 ms 164984 KB Output is correct
12 Correct 163 ms 165008 KB Output is correct
13 Correct 151 ms 164956 KB Output is correct
14 Correct 167 ms 164968 KB Output is correct
15 Correct 150 ms 164956 KB Output is correct
16 Correct 152 ms 164956 KB Output is correct
17 Correct 151 ms 164976 KB Output is correct
18 Correct 176 ms 164952 KB Output is correct
19 Correct 180 ms 164984 KB Output is correct
20 Correct 167 ms 164984 KB Output is correct
21 Correct 150 ms 164808 KB Output is correct
22 Correct 149 ms 164888 KB Output is correct
23 Correct 151 ms 165004 KB Output is correct
24 Correct 152 ms 164984 KB Output is correct
25 Correct 154 ms 164984 KB Output is correct
26 Correct 164 ms 165172 KB Output is correct
27 Correct 166 ms 164984 KB Output is correct
28 Correct 153 ms 164984 KB Output is correct
29 Correct 154 ms 164984 KB Output is correct
30 Correct 162 ms 164968 KB Output is correct
31 Correct 1932 ms 235240 KB Output is correct
32 Correct 271 ms 169028 KB Output is correct
33 Correct 1925 ms 236260 KB Output is correct
34 Correct 1764 ms 233452 KB Output is correct
35 Correct 1833 ms 236728 KB Output is correct
36 Correct 1901 ms 238528 KB Output is correct
37 Correct 1536 ms 234472 KB Output is correct
38 Correct 1415 ms 235528 KB Output is correct
39 Correct 1166 ms 233912 KB Output is correct
40 Correct 1216 ms 234824 KB Output is correct
41 Correct 1175 ms 213148 KB Output is correct
42 Correct 1057 ms 214652 KB Output is correct
43 Correct 223 ms 171100 KB Output is correct
44 Correct 1217 ms 212844 KB Output is correct
45 Correct 1160 ms 209956 KB Output is correct
46 Correct 1372 ms 202560 KB Output is correct
47 Correct 826 ms 211584 KB Output is correct
48 Correct 856 ms 212896 KB Output is correct
49 Correct 914 ms 213788 KB Output is correct
50 Correct 912 ms 214112 KB Output is correct
51 Correct 963 ms 212048 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4931 ms 372196 KB Output is correct
2 Runtime error 2854 ms 543840 KB Execution killed with signal 11 (could be triggered by violating memory limits)
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 2719 ms 526788 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 149 ms 164816 KB Output is correct
2 Correct 150 ms 164880 KB Output is correct
3 Correct 149 ms 164728 KB Output is correct
4 Correct 150 ms 164744 KB Output is correct
5 Correct 149 ms 164728 KB Output is correct
6 Correct 172 ms 165180 KB Output is correct
7 Correct 176 ms 164912 KB Output is correct
8 Correct 176 ms 164984 KB Output is correct
9 Correct 183 ms 164856 KB Output is correct
10 Correct 181 ms 165052 KB Output is correct
11 Correct 171 ms 164984 KB Output is correct
12 Correct 163 ms 165008 KB Output is correct
13 Correct 151 ms 164956 KB Output is correct
14 Correct 167 ms 164968 KB Output is correct
15 Correct 150 ms 164956 KB Output is correct
16 Correct 152 ms 164956 KB Output is correct
17 Correct 151 ms 164976 KB Output is correct
18 Correct 176 ms 164952 KB Output is correct
19 Correct 180 ms 164984 KB Output is correct
20 Correct 167 ms 164984 KB Output is correct
21 Correct 150 ms 164808 KB Output is correct
22 Correct 149 ms 164888 KB Output is correct
23 Correct 151 ms 165004 KB Output is correct
24 Correct 152 ms 164984 KB Output is correct
25 Correct 154 ms 164984 KB Output is correct
26 Correct 164 ms 165172 KB Output is correct
27 Correct 166 ms 164984 KB Output is correct
28 Correct 153 ms 164984 KB Output is correct
29 Correct 154 ms 164984 KB Output is correct
30 Correct 162 ms 164968 KB Output is correct
31 Correct 1932 ms 235240 KB Output is correct
32 Correct 271 ms 169028 KB Output is correct
33 Correct 1925 ms 236260 KB Output is correct
34 Correct 1764 ms 233452 KB Output is correct
35 Correct 1833 ms 236728 KB Output is correct
36 Correct 1901 ms 238528 KB Output is correct
37 Correct 1536 ms 234472 KB Output is correct
38 Correct 1415 ms 235528 KB Output is correct
39 Correct 1166 ms 233912 KB Output is correct
40 Correct 1216 ms 234824 KB Output is correct
41 Correct 1175 ms 213148 KB Output is correct
42 Correct 1057 ms 214652 KB Output is correct
43 Correct 223 ms 171100 KB Output is correct
44 Correct 1217 ms 212844 KB Output is correct
45 Correct 1160 ms 209956 KB Output is correct
46 Correct 1372 ms 202560 KB Output is correct
47 Correct 826 ms 211584 KB Output is correct
48 Correct 856 ms 212896 KB Output is correct
49 Correct 914 ms 213788 KB Output is correct
50 Correct 912 ms 214112 KB Output is correct
51 Correct 963 ms 212048 KB Output is correct
52 Correct 457 ms 195160 KB Output is correct
53 Correct 436 ms 193640 KB Output is correct
54 Correct 910 ms 215000 KB Output is correct
55 Correct 934 ms 209952 KB Output is correct
56 Correct 832 ms 207104 KB Output is correct
57 Correct 1083 ms 211760 KB Output is correct
58 Correct 900 ms 209372 KB Output is correct
59 Correct 793 ms 206904 KB Output is correct
60 Correct 1014 ms 212444 KB Output is correct
61 Correct 223 ms 172992 KB Output is correct
62 Correct 443 ms 195224 KB Output is correct
63 Correct 718 ms 209148 KB Output is correct
64 Correct 838 ms 212568 KB Output is correct
65 Correct 1022 ms 216328 KB Output is correct
66 Correct 1116 ms 214980 KB Output is correct
67 Correct 365 ms 181216 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 149 ms 164816 KB Output is correct
2 Correct 150 ms 164880 KB Output is correct
3 Correct 149 ms 164728 KB Output is correct
4 Correct 150 ms 164744 KB Output is correct
5 Correct 149 ms 164728 KB Output is correct
6 Correct 172 ms 165180 KB Output is correct
7 Correct 176 ms 164912 KB Output is correct
8 Correct 176 ms 164984 KB Output is correct
9 Correct 183 ms 164856 KB Output is correct
10 Correct 181 ms 165052 KB Output is correct
11 Correct 171 ms 164984 KB Output is correct
12 Correct 163 ms 165008 KB Output is correct
13 Correct 151 ms 164956 KB Output is correct
14 Correct 167 ms 164968 KB Output is correct
15 Correct 150 ms 164956 KB Output is correct
16 Correct 152 ms 164956 KB Output is correct
17 Correct 151 ms 164976 KB Output is correct
18 Correct 176 ms 164952 KB Output is correct
19 Correct 180 ms 164984 KB Output is correct
20 Correct 167 ms 164984 KB Output is correct
21 Correct 150 ms 164808 KB Output is correct
22 Correct 149 ms 164888 KB Output is correct
23 Correct 151 ms 165004 KB Output is correct
24 Correct 152 ms 164984 KB Output is correct
25 Correct 154 ms 164984 KB Output is correct
26 Correct 164 ms 165172 KB Output is correct
27 Correct 166 ms 164984 KB Output is correct
28 Correct 153 ms 164984 KB Output is correct
29 Correct 154 ms 164984 KB Output is correct
30 Correct 162 ms 164968 KB Output is correct
31 Correct 1932 ms 235240 KB Output is correct
32 Correct 271 ms 169028 KB Output is correct
33 Correct 1925 ms 236260 KB Output is correct
34 Correct 1764 ms 233452 KB Output is correct
35 Correct 1833 ms 236728 KB Output is correct
36 Correct 1901 ms 238528 KB Output is correct
37 Correct 1536 ms 234472 KB Output is correct
38 Correct 1415 ms 235528 KB Output is correct
39 Correct 1166 ms 233912 KB Output is correct
40 Correct 1216 ms 234824 KB Output is correct
41 Correct 1175 ms 213148 KB Output is correct
42 Correct 1057 ms 214652 KB Output is correct
43 Correct 223 ms 171100 KB Output is correct
44 Correct 1217 ms 212844 KB Output is correct
45 Correct 1160 ms 209956 KB Output is correct
46 Correct 1372 ms 202560 KB Output is correct
47 Correct 826 ms 211584 KB Output is correct
48 Correct 856 ms 212896 KB Output is correct
49 Correct 914 ms 213788 KB Output is correct
50 Correct 912 ms 214112 KB Output is correct
51 Correct 963 ms 212048 KB Output is correct
52 Correct 4931 ms 372196 KB Output is correct
53 Runtime error 2854 ms 543840 KB Execution killed with signal 11 (could be triggered by violating memory limits)
54 Halted 0 ms 0 KB -