답안 #431598

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
431598 2021-06-17T13:26:42 Z tqbfjotld Long Mansion (JOI17_long_mansion) C++14
10 / 100
3000 ms 37592 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){
    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 16 ms 12492 KB Output is correct
2 Correct 24 ms 12852 KB Output is correct
3 Correct 61 ms 13356 KB Output is correct
4 Correct 15 ms 12620 KB Output is correct
5 Correct 25 ms 12480 KB Output is correct
6 Correct 16 ms 12640 KB Output is correct
7 Correct 14 ms 12620 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 12492 KB Output is correct
2 Correct 24 ms 12852 KB Output is correct
3 Correct 61 ms 13356 KB Output is correct
4 Correct 15 ms 12620 KB Output is correct
5 Correct 25 ms 12480 KB Output is correct
6 Correct 16 ms 12640 KB Output is correct
7 Correct 14 ms 12620 KB Output is correct
8 Correct 178 ms 14048 KB Output is correct
9 Correct 158 ms 14008 KB Output is correct
10 Correct 166 ms 14476 KB Output is correct
11 Correct 192 ms 15044 KB Output is correct
12 Correct 143 ms 14012 KB Output is correct
13 Correct 165 ms 14344 KB Output is correct
14 Correct 142 ms 14316 KB Output is correct
15 Correct 178 ms 14312 KB Output is correct
16 Correct 154 ms 14536 KB Output is correct
17 Correct 142 ms 14204 KB Output is correct
18 Correct 148 ms 14320 KB Output is correct
19 Correct 168 ms 14320 KB Output is correct
20 Correct 164 ms 14480 KB Output is correct
21 Correct 154 ms 14532 KB Output is correct
22 Correct 163 ms 14276 KB Output is correct
23 Correct 148 ms 14160 KB Output is correct
24 Correct 185 ms 14176 KB Output is correct
25 Correct 161 ms 14248 KB Output is correct
26 Correct 151 ms 14128 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3068 ms 37592 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 12492 KB Output is correct
2 Correct 24 ms 12852 KB Output is correct
3 Correct 61 ms 13356 KB Output is correct
4 Correct 15 ms 12620 KB Output is correct
5 Correct 25 ms 12480 KB Output is correct
6 Correct 16 ms 12640 KB Output is correct
7 Correct 14 ms 12620 KB Output is correct
8 Correct 178 ms 14048 KB Output is correct
9 Correct 158 ms 14008 KB Output is correct
10 Correct 166 ms 14476 KB Output is correct
11 Correct 192 ms 15044 KB Output is correct
12 Correct 143 ms 14012 KB Output is correct
13 Correct 165 ms 14344 KB Output is correct
14 Correct 142 ms 14316 KB Output is correct
15 Correct 178 ms 14312 KB Output is correct
16 Correct 154 ms 14536 KB Output is correct
17 Correct 142 ms 14204 KB Output is correct
18 Correct 148 ms 14320 KB Output is correct
19 Correct 168 ms 14320 KB Output is correct
20 Correct 164 ms 14480 KB Output is correct
21 Correct 154 ms 14532 KB Output is correct
22 Correct 163 ms 14276 KB Output is correct
23 Correct 148 ms 14160 KB Output is correct
24 Correct 185 ms 14176 KB Output is correct
25 Correct 161 ms 14248 KB Output is correct
26 Correct 151 ms 14128 KB Output is correct
27 Execution timed out 3068 ms 37592 KB Time limit exceeded
28 Halted 0 ms 0 KB -