답안 #431474

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
431474 2021-06-17T12:05:33 Z tqbfjotld Long Mansion (JOI17_long_mansion) C++14
10 / 100
3000 ms 36872 KB
#include <bits/stdc++.h>
using namespace std;

struct node{
    int s,e;
    int minv,maxv;
    node *l,*r;
    node (int _s, int _e){
        s = _s; e = _e;
        if (s!=e){
            l = new node(s,(s+e)/2);
            r = new node((s+e)/2+1,e);
        }
        minv = 999999999;
        maxv = -1;
    }
    void upd(int pos, int val){
        minv = min(minv,val);
        maxv = max(maxv,val);
        if (s==e) return;
        if (pos<=(s+e)/2) l->upd(pos,val);
        else r->upd(pos,val);
    }
    int querymin(int a, int b){
        if (a<=s && e<=b){
            return minv;
        }
        else if (b<=(s+e)/2) return l->querymin(a,b);
        else if (a>(s+e)/2) return r->querymin(a,b);
        else return min(l->querymin(a,b),r->querymin(a,b));
    }
    int querymax(int a, int b){
        if (a<=s && e<=b){
            return maxv;
        }
        else if (b<=(s+e)/2) return l->querymax(a,b);
        else if (a>(s+e)/2) return r->querymax(a,b);
        else return max(l->querymax(a,b),r->querymax(a,b));
    }
    int rightblock(int minpos, int val){
       // printf("call rightblock %d %d on %d %d\n",minpos,val,s,e);
        if (s==e){
            return minv<val?s:999999999;
        }
        if (minpos==s){
            if (l->minv<val) return l->rightblock(minpos,val);
            else return r->rightblock((s+e)/2+1,val);
        }
        if (minpos>(s+e)/2){
            return r->rightblock(minpos,val);
        }
        int t = l->rightblock(minpos,val);
        if (t==999999999){
            return r->rightblock((s+e)/2+1,val);
        }
        else return t;
    }
    int leftblock(int maxpos, int val){
        if (s==e){
            return maxv>val?s:-1;
        }
        if (maxpos==e){
            if (r->maxv>val) return r->leftblock(maxpos,val);
            else return l->leftblock(maxpos,val);
        }
        if (maxpos<=(s+e)/2) return l->leftblock(maxpos,val);
        int t = r->leftblock(maxpos,val);
        if (t==-1) return l->leftblock(maxpos,val);
        else return t;
    }
}*root1,*root2;

int walltype[500005];
vector<int> keys[500005];

int intervall[500005];
int intervalr[500005];

int walll[500005];
int wallr[500005];

map<int,int> tempmap;

void rec(int l, int r, vector<int> &thing){
    thing.push_back((l+r)/2);
    if (l==r) return;
    if (l<(l+r)/2) rec(l,(l+r)/2-1,thing);
    if (r>(l+r)/2) rec((l+r)/2+1,r,thing);
}

int main(){
    int n;
    scanf("%d",&n);
    root1 = new node(0,n+1);
    root2 = new node(0,n+1);
    for (int x = 1; x<n; x++){
        scanf("%d",&walltype[x]);
    }
    for (int x = 1; x<=n; x++){
        int t;
        scanf("%d",&t);
        for (int y = 0; y<t; y++){
            int a;
            scanf("%d",&a);
            keys[x].push_back(a);
        }
    }
    for (int x = 1; x<n; x++){
        for (auto y : keys[x]){
            tempmap[y] = x;
        }
        walll[x] = tempmap[walltype[x]];
    }
    tempmap.clear();
    for (int x = n-1; x>0; x--){
        for (auto y : keys[x+1]){
            tempmap[y] = x+1;
        }
        if (tempmap.count(walltype[x])) wallr[x] = tempmap[walltype[x]];
        else wallr[x] = n+1;
    }
    for (int x = 1; x<n; x++){
        root1->upd(x,walll[x]);
        root1->upd(x,wallr[x]);
    }
    vector<int> order;
    rec(1,n,order);
   // printf("wall preproc done\n");
    for (int x : order){
        int curl = x;
        int curr = x;
        while (true){
          //  printf("curl,curr = %d %d\n",curl,curr);
            int newr = root1->rightblock(curr,curl);
            newr = min(newr,n);
           // printf("rightblock %d %d = %d\n",curr,curl,newr);
            int newl = root1->leftblock(curl-1,newr)+1;
            newl = max(newl,1);
            //printf("leftblock %d %d = %d\n",curl-1,curr,newl);
            if (newl==curl&& newr==curr) {
                intervall[x] = curl;
                intervalr[x] = curr;
                break;
            }
            if (newl<curl){
                int te = root2->querymax(newl,x-1);
                if (te>=x){
                    intervalr[x] = te;
                    intervall[x] = root2->querymin(newl,x-1);
                    break;
                }
            }
            if (newr>curr){
                int te = root2->querymin(x+1,newr);
                if (te<=x){
                    intervall[x] = te;
                    intervalr[x] = root2->querymax(x+1,newr);
                    break;
                }
            }
            curl = newl;
            curr = newr;
        }
        root2->upd(x,intervalr[x]);
        root2->upd(x,intervall[x]);
      //  printf("interval[%d] = %d %d\n",x,intervall[x],intervalr[x]);
    }
    int q;
    scanf("%d",&q);
    for (int x = 0; x<q; x++){
        int a,b;
        scanf("%d%d",&a,&b);
        if (b<=intervalr[a] && b>=intervall[a]){
            printf("YES\n");
        }
        else{
            printf("NO\n");
        }
    }
}

Compilation message

long_mansion.cpp: In function 'int main()':
long_mansion.cpp:93:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   93 |     scanf("%d",&n);
      |     ~~~~~^~~~~~~~~
long_mansion.cpp:97:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   97 |         scanf("%d",&walltype[x]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~
long_mansion.cpp:101:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  101 |         scanf("%d",&t);
      |         ~~~~~^~~~~~~~~
long_mansion.cpp:104:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  104 |             scanf("%d",&a);
      |             ~~~~~^~~~~~~~~
long_mansion.cpp:169:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  169 |     scanf("%d",&q);
      |     ~~~~~^~~~~~~~~
long_mansion.cpp:172:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  172 |         scanf("%d%d",&a,&b);
      |         ~~~~~^~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 12492 KB Output is correct
2 Correct 25 ms 12816 KB Output is correct
3 Correct 67 ms 13292 KB Output is correct
4 Correct 17 ms 12620 KB Output is correct
5 Correct 26 ms 12560 KB Output is correct
6 Correct 17 ms 12620 KB Output is correct
7 Correct 16 ms 12620 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 12492 KB Output is correct
2 Correct 25 ms 12816 KB Output is correct
3 Correct 67 ms 13292 KB Output is correct
4 Correct 17 ms 12620 KB Output is correct
5 Correct 26 ms 12560 KB Output is correct
6 Correct 17 ms 12620 KB Output is correct
7 Correct 16 ms 12620 KB Output is correct
8 Correct 178 ms 14032 KB Output is correct
9 Correct 182 ms 14112 KB Output is correct
10 Correct 182 ms 14400 KB Output is correct
11 Correct 198 ms 15008 KB Output is correct
12 Correct 138 ms 14008 KB Output is correct
13 Correct 137 ms 14232 KB Output is correct
14 Correct 173 ms 14240 KB Output is correct
15 Correct 162 ms 14372 KB Output is correct
16 Correct 184 ms 14440 KB Output is correct
17 Correct 174 ms 14192 KB Output is correct
18 Correct 156 ms 14280 KB Output is correct
19 Correct 186 ms 14344 KB Output is correct
20 Correct 164 ms 14472 KB Output is correct
21 Correct 178 ms 14444 KB Output is correct
22 Correct 169 ms 14352 KB Output is correct
23 Correct 159 ms 14212 KB Output is correct
24 Correct 178 ms 14172 KB Output is correct
25 Correct 189 ms 14152 KB Output is correct
26 Correct 147 ms 14104 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3072 ms 36872 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 12492 KB Output is correct
2 Correct 25 ms 12816 KB Output is correct
3 Correct 67 ms 13292 KB Output is correct
4 Correct 17 ms 12620 KB Output is correct
5 Correct 26 ms 12560 KB Output is correct
6 Correct 17 ms 12620 KB Output is correct
7 Correct 16 ms 12620 KB Output is correct
8 Correct 178 ms 14032 KB Output is correct
9 Correct 182 ms 14112 KB Output is correct
10 Correct 182 ms 14400 KB Output is correct
11 Correct 198 ms 15008 KB Output is correct
12 Correct 138 ms 14008 KB Output is correct
13 Correct 137 ms 14232 KB Output is correct
14 Correct 173 ms 14240 KB Output is correct
15 Correct 162 ms 14372 KB Output is correct
16 Correct 184 ms 14440 KB Output is correct
17 Correct 174 ms 14192 KB Output is correct
18 Correct 156 ms 14280 KB Output is correct
19 Correct 186 ms 14344 KB Output is correct
20 Correct 164 ms 14472 KB Output is correct
21 Correct 178 ms 14444 KB Output is correct
22 Correct 169 ms 14352 KB Output is correct
23 Correct 159 ms 14212 KB Output is correct
24 Correct 178 ms 14172 KB Output is correct
25 Correct 189 ms 14152 KB Output is correct
26 Correct 147 ms 14104 KB Output is correct
27 Execution timed out 3072 ms 36872 KB Time limit exceeded
28 Halted 0 ms 0 KB -