답안 #159509

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
159509 2019-10-23T01:06:58 Z arnold518 새 집 (APIO18_new_home) C++14
47 / 100
5000 ms 436464 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[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);
    }
    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 187 ms 202232 KB Output is correct
2 Correct 187 ms 202320 KB Output is correct
3 Correct 185 ms 202272 KB Output is correct
4 Correct 188 ms 202360 KB Output is correct
5 Correct 187 ms 202360 KB Output is correct
6 Correct 191 ms 202616 KB Output is correct
7 Correct 188 ms 202492 KB Output is correct
8 Correct 188 ms 202676 KB Output is correct
9 Correct 189 ms 202536 KB Output is correct
10 Correct 189 ms 202716 KB Output is correct
11 Correct 187 ms 202588 KB Output is correct
12 Correct 190 ms 202628 KB Output is correct
13 Correct 188 ms 202572 KB Output is correct
14 Correct 190 ms 202616 KB Output is correct
15 Correct 222 ms 202652 KB Output is correct
16 Correct 227 ms 202644 KB Output is correct
17 Correct 203 ms 202744 KB Output is correct
18 Correct 218 ms 202604 KB Output is correct
19 Correct 221 ms 202488 KB Output is correct
20 Correct 225 ms 202600 KB Output is correct
21 Correct 224 ms 202400 KB Output is correct
22 Correct 199 ms 202488 KB Output is correct
23 Correct 197 ms 202632 KB Output is correct
24 Correct 225 ms 202688 KB Output is correct
25 Correct 224 ms 202620 KB Output is correct
26 Correct 213 ms 202744 KB Output is correct
27 Correct 228 ms 202548 KB Output is correct
28 Correct 196 ms 202616 KB Output is correct
29 Correct 218 ms 202656 KB Output is correct
30 Correct 219 ms 202524 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 187 ms 202232 KB Output is correct
2 Correct 187 ms 202320 KB Output is correct
3 Correct 185 ms 202272 KB Output is correct
4 Correct 188 ms 202360 KB Output is correct
5 Correct 187 ms 202360 KB Output is correct
6 Correct 191 ms 202616 KB Output is correct
7 Correct 188 ms 202492 KB Output is correct
8 Correct 188 ms 202676 KB Output is correct
9 Correct 189 ms 202536 KB Output is correct
10 Correct 189 ms 202716 KB Output is correct
11 Correct 187 ms 202588 KB Output is correct
12 Correct 190 ms 202628 KB Output is correct
13 Correct 188 ms 202572 KB Output is correct
14 Correct 190 ms 202616 KB Output is correct
15 Correct 222 ms 202652 KB Output is correct
16 Correct 227 ms 202644 KB Output is correct
17 Correct 203 ms 202744 KB Output is correct
18 Correct 218 ms 202604 KB Output is correct
19 Correct 221 ms 202488 KB Output is correct
20 Correct 225 ms 202600 KB Output is correct
21 Correct 224 ms 202400 KB Output is correct
22 Correct 199 ms 202488 KB Output is correct
23 Correct 197 ms 202632 KB Output is correct
24 Correct 225 ms 202688 KB Output is correct
25 Correct 224 ms 202620 KB Output is correct
26 Correct 213 ms 202744 KB Output is correct
27 Correct 228 ms 202548 KB Output is correct
28 Correct 196 ms 202616 KB Output is correct
29 Correct 218 ms 202656 KB Output is correct
30 Correct 219 ms 202524 KB Output is correct
31 Correct 2104 ms 273532 KB Output is correct
32 Correct 297 ms 207080 KB Output is correct
33 Correct 1885 ms 274396 KB Output is correct
34 Correct 1813 ms 271520 KB Output is correct
35 Correct 2059 ms 274932 KB Output is correct
36 Correct 2001 ms 276576 KB Output is correct
37 Correct 1539 ms 272644 KB Output is correct
38 Correct 1471 ms 273740 KB Output is correct
39 Correct 1176 ms 272104 KB Output is correct
40 Correct 1222 ms 273052 KB Output is correct
41 Correct 1216 ms 251276 KB Output is correct
42 Correct 1140 ms 252736 KB Output is correct
43 Correct 261 ms 209244 KB Output is correct
44 Correct 1213 ms 250836 KB Output is correct
45 Correct 1338 ms 248080 KB Output is correct
46 Correct 1444 ms 240604 KB Output is correct
47 Correct 791 ms 249764 KB Output is correct
48 Correct 835 ms 250824 KB Output is correct
49 Correct 929 ms 251752 KB Output is correct
50 Correct 955 ms 252216 KB Output is correct
51 Correct 1048 ms 250168 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4794 ms 409976 KB Output is correct
2 Execution timed out 5124 ms 436464 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5114 ms 433268 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 187 ms 202232 KB Output is correct
2 Correct 187 ms 202320 KB Output is correct
3 Correct 185 ms 202272 KB Output is correct
4 Correct 188 ms 202360 KB Output is correct
5 Correct 187 ms 202360 KB Output is correct
6 Correct 191 ms 202616 KB Output is correct
7 Correct 188 ms 202492 KB Output is correct
8 Correct 188 ms 202676 KB Output is correct
9 Correct 189 ms 202536 KB Output is correct
10 Correct 189 ms 202716 KB Output is correct
11 Correct 187 ms 202588 KB Output is correct
12 Correct 190 ms 202628 KB Output is correct
13 Correct 188 ms 202572 KB Output is correct
14 Correct 190 ms 202616 KB Output is correct
15 Correct 222 ms 202652 KB Output is correct
16 Correct 227 ms 202644 KB Output is correct
17 Correct 203 ms 202744 KB Output is correct
18 Correct 218 ms 202604 KB Output is correct
19 Correct 221 ms 202488 KB Output is correct
20 Correct 225 ms 202600 KB Output is correct
21 Correct 224 ms 202400 KB Output is correct
22 Correct 199 ms 202488 KB Output is correct
23 Correct 197 ms 202632 KB Output is correct
24 Correct 225 ms 202688 KB Output is correct
25 Correct 224 ms 202620 KB Output is correct
26 Correct 213 ms 202744 KB Output is correct
27 Correct 228 ms 202548 KB Output is correct
28 Correct 196 ms 202616 KB Output is correct
29 Correct 218 ms 202656 KB Output is correct
30 Correct 219 ms 202524 KB Output is correct
31 Correct 2104 ms 273532 KB Output is correct
32 Correct 297 ms 207080 KB Output is correct
33 Correct 1885 ms 274396 KB Output is correct
34 Correct 1813 ms 271520 KB Output is correct
35 Correct 2059 ms 274932 KB Output is correct
36 Correct 2001 ms 276576 KB Output is correct
37 Correct 1539 ms 272644 KB Output is correct
38 Correct 1471 ms 273740 KB Output is correct
39 Correct 1176 ms 272104 KB Output is correct
40 Correct 1222 ms 273052 KB Output is correct
41 Correct 1216 ms 251276 KB Output is correct
42 Correct 1140 ms 252736 KB Output is correct
43 Correct 261 ms 209244 KB Output is correct
44 Correct 1213 ms 250836 KB Output is correct
45 Correct 1338 ms 248080 KB Output is correct
46 Correct 1444 ms 240604 KB Output is correct
47 Correct 791 ms 249764 KB Output is correct
48 Correct 835 ms 250824 KB Output is correct
49 Correct 929 ms 251752 KB Output is correct
50 Correct 955 ms 252216 KB Output is correct
51 Correct 1048 ms 250168 KB Output is correct
52 Correct 508 ms 232560 KB Output is correct
53 Correct 498 ms 231104 KB Output is correct
54 Correct 936 ms 252280 KB Output is correct
55 Correct 948 ms 247340 KB Output is correct
56 Correct 827 ms 244444 KB Output is correct
57 Correct 1185 ms 249004 KB Output is correct
58 Correct 1099 ms 246748 KB Output is correct
59 Correct 854 ms 244188 KB Output is correct
60 Correct 1075 ms 249848 KB Output is correct
61 Correct 258 ms 210268 KB Output is correct
62 Correct 479 ms 232460 KB Output is correct
63 Correct 771 ms 246360 KB Output is correct
64 Correct 958 ms 249804 KB Output is correct
65 Correct 1169 ms 253404 KB Output is correct
66 Correct 1154 ms 252448 KB Output is correct
67 Correct 391 ms 218508 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 187 ms 202232 KB Output is correct
2 Correct 187 ms 202320 KB Output is correct
3 Correct 185 ms 202272 KB Output is correct
4 Correct 188 ms 202360 KB Output is correct
5 Correct 187 ms 202360 KB Output is correct
6 Correct 191 ms 202616 KB Output is correct
7 Correct 188 ms 202492 KB Output is correct
8 Correct 188 ms 202676 KB Output is correct
9 Correct 189 ms 202536 KB Output is correct
10 Correct 189 ms 202716 KB Output is correct
11 Correct 187 ms 202588 KB Output is correct
12 Correct 190 ms 202628 KB Output is correct
13 Correct 188 ms 202572 KB Output is correct
14 Correct 190 ms 202616 KB Output is correct
15 Correct 222 ms 202652 KB Output is correct
16 Correct 227 ms 202644 KB Output is correct
17 Correct 203 ms 202744 KB Output is correct
18 Correct 218 ms 202604 KB Output is correct
19 Correct 221 ms 202488 KB Output is correct
20 Correct 225 ms 202600 KB Output is correct
21 Correct 224 ms 202400 KB Output is correct
22 Correct 199 ms 202488 KB Output is correct
23 Correct 197 ms 202632 KB Output is correct
24 Correct 225 ms 202688 KB Output is correct
25 Correct 224 ms 202620 KB Output is correct
26 Correct 213 ms 202744 KB Output is correct
27 Correct 228 ms 202548 KB Output is correct
28 Correct 196 ms 202616 KB Output is correct
29 Correct 218 ms 202656 KB Output is correct
30 Correct 219 ms 202524 KB Output is correct
31 Correct 2104 ms 273532 KB Output is correct
32 Correct 297 ms 207080 KB Output is correct
33 Correct 1885 ms 274396 KB Output is correct
34 Correct 1813 ms 271520 KB Output is correct
35 Correct 2059 ms 274932 KB Output is correct
36 Correct 2001 ms 276576 KB Output is correct
37 Correct 1539 ms 272644 KB Output is correct
38 Correct 1471 ms 273740 KB Output is correct
39 Correct 1176 ms 272104 KB Output is correct
40 Correct 1222 ms 273052 KB Output is correct
41 Correct 1216 ms 251276 KB Output is correct
42 Correct 1140 ms 252736 KB Output is correct
43 Correct 261 ms 209244 KB Output is correct
44 Correct 1213 ms 250836 KB Output is correct
45 Correct 1338 ms 248080 KB Output is correct
46 Correct 1444 ms 240604 KB Output is correct
47 Correct 791 ms 249764 KB Output is correct
48 Correct 835 ms 250824 KB Output is correct
49 Correct 929 ms 251752 KB Output is correct
50 Correct 955 ms 252216 KB Output is correct
51 Correct 1048 ms 250168 KB Output is correct
52 Correct 4794 ms 409976 KB Output is correct
53 Execution timed out 5124 ms 436464 KB Time limit exceeded
54 Halted 0 ms 0 KB -