답안 #431600

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
431600 2021-06-17T13:27:25 Z tqbfjotld Long Mansion (JOI17_long_mansion) C++14
10 / 100
3000 ms 37588 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];

unordered_map<int,int> tempmap;

void rec(int l, int r, vector<int> &thing){
    vector<pair<int,int> > stuff;
    for (int x = l; x<=r; x++){
        stuff.push_back({-(x&-x),x});
    }
    sort(stuff.begin(),stuff.end());
    for (auto x : stuff){
        thing.push_back(x.second);
    }
}

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");
   int num_iter = 0;
    for (int x : order){
        int curl = x;
        int curr = x;
        while (true){
          //  printf("curl,curr = %d %d\n",curl,curr);
          num_iter++;
          assert(num_iter<5*n);
            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:97:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   97 |     scanf("%d",&n);
      |     ~~~~~^~~~~~~~~
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",&walltype[x]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~
long_mansion.cpp:105:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  105 |         scanf("%d",&t);
      |         ~~~~~^~~~~~~~~
long_mansion.cpp:108:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  108 |             scanf("%d",&a);
      |             ~~~~~^~~~~~~~~
long_mansion.cpp:176:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  176 |     scanf("%d",&q);
      |     ~~~~~^~~~~~~~~
long_mansion.cpp:179:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  179 |         scanf("%d%d",&a,&b);
      |         ~~~~~^~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 12492 KB Output is correct
2 Correct 24 ms 12860 KB Output is correct
3 Correct 63 ms 13260 KB Output is correct
4 Correct 14 ms 12660 KB Output is correct
5 Correct 28 ms 12584 KB Output is correct
6 Correct 18 ms 12664 KB Output is correct
7 Correct 13 ms 12620 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 12492 KB Output is correct
2 Correct 24 ms 12860 KB Output is correct
3 Correct 63 ms 13260 KB Output is correct
4 Correct 14 ms 12660 KB Output is correct
5 Correct 28 ms 12584 KB Output is correct
6 Correct 18 ms 12664 KB Output is correct
7 Correct 13 ms 12620 KB Output is correct
8 Correct 173 ms 14088 KB Output is correct
9 Correct 153 ms 13984 KB Output is correct
10 Correct 172 ms 14404 KB Output is correct
11 Correct 201 ms 15020 KB Output is correct
12 Correct 131 ms 14020 KB Output is correct
13 Correct 174 ms 14304 KB Output is correct
14 Correct 148 ms 14368 KB Output is correct
15 Correct 138 ms 14316 KB Output is correct
16 Correct 154 ms 14484 KB Output is correct
17 Correct 184 ms 14308 KB Output is correct
18 Correct 139 ms 14312 KB Output is correct
19 Correct 154 ms 14344 KB Output is correct
20 Correct 151 ms 14504 KB Output is correct
21 Correct 147 ms 14572 KB Output is correct
22 Correct 157 ms 14312 KB Output is correct
23 Correct 151 ms 14244 KB Output is correct
24 Correct 153 ms 14220 KB Output is correct
25 Correct 150 ms 14148 KB Output is correct
26 Correct 160 ms 14196 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3078 ms 37588 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 12492 KB Output is correct
2 Correct 24 ms 12860 KB Output is correct
3 Correct 63 ms 13260 KB Output is correct
4 Correct 14 ms 12660 KB Output is correct
5 Correct 28 ms 12584 KB Output is correct
6 Correct 18 ms 12664 KB Output is correct
7 Correct 13 ms 12620 KB Output is correct
8 Correct 173 ms 14088 KB Output is correct
9 Correct 153 ms 13984 KB Output is correct
10 Correct 172 ms 14404 KB Output is correct
11 Correct 201 ms 15020 KB Output is correct
12 Correct 131 ms 14020 KB Output is correct
13 Correct 174 ms 14304 KB Output is correct
14 Correct 148 ms 14368 KB Output is correct
15 Correct 138 ms 14316 KB Output is correct
16 Correct 154 ms 14484 KB Output is correct
17 Correct 184 ms 14308 KB Output is correct
18 Correct 139 ms 14312 KB Output is correct
19 Correct 154 ms 14344 KB Output is correct
20 Correct 151 ms 14504 KB Output is correct
21 Correct 147 ms 14572 KB Output is correct
22 Correct 157 ms 14312 KB Output is correct
23 Correct 151 ms 14244 KB Output is correct
24 Correct 153 ms 14220 KB Output is correct
25 Correct 150 ms 14148 KB Output is correct
26 Correct 160 ms 14196 KB Output is correct
27 Execution timed out 3078 ms 37588 KB Time limit exceeded
28 Halted 0 ms 0 KB -