답안 #65472

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
65472 2018-08-07T16:27:29 Z knon0501 조화행렬 (KOI18_matrix) C++14
9 / 100
4000 ms 283564 KB
#include <bits/stdc++.h>
using namespace std;
#define f first
#define s second
int n,m;
const int MX=2e5+5;
pair<int,pair<int,int>> a[MX];
map<long long,int> seg;
map<int,int> xx;
map<int,int> yy;
long long nn;
int ans;
int p;
set<int> S1;
set<int> S2;
stack<int> S;
int max2(int x,int y){
    return x>y ? x:y;
}
inline int g(int y,int lev1){
    S.push(1);
    S.push(nn);
    S.push(1);
    int k=0;
    while(!S.empty()){
        int lv=S.top();S.pop();
        int r=S.top();S.pop();
        int l=S.top();S.pop();
        if(l>=y)continue;
        if(r<y)k=max2(k,seg[nn*2*lev1+lv]);
        else{
            if(y>(l+r)/2+1){
                k=max2(k,seg[nn*2*lev1+lv*2]);
                S.push((l+r)/2+1);
                S.push(r);
                S.push(lv*2+1);
            }
            else{
                S.push(l);
                S.push((l+r)/2);
                S.push(lv*2);
            }
        }
    }
    return k;
}
inline int f(int x,int y){

    S.push(1);
    S.push(nn);
    S.push(1);
    int k=0;
    while(!S.empty()){
        int lv=S.top();S.pop();
        int r=S.top();S.pop();
        int l=S.top();S.pop();
        if(l>=x)continue;
        if(r<x)k=max2(k,g(y,lv));
        else{

            if(x>(l+r)/2+1){
                k=max2(k,g(y,lv*2));
                S.push((l+r)/2+1);
                S.push(r);
                S.push(lv*2+1);
            }
            else{
                S.push(l);
                S.push((l+r)/2);
                S.push(lv*2);
            }
        }
    }
    return k;
}


int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>m>>n;
    
    int i,j;
    for(nn=1 ; nn<n ; nn*=2);

    for(i=1 ; i<=n ; i++)cin>>a[i].f;
    for(i=1 ; i<=n ; i++)cin>>a[i].s.f;
    for(i=1 ; i<=n ; i++)cin>>a[i].s.s;
    sort(a+1,a+n+1);
    
    for(i=1 ; i<=n ; i++){
        S1.insert(a[i].s.f);
        S2.insert(a[i].s.s);
    }
    int cnt=0;
    for(auto &i:S1)xx[i]=++cnt;
    cnt=0;
    for(auto &i:S2)yy[i]=++cnt;

    int tx,ty,k;
    
    for(int ii=1 ; ii<=n ; ii++){
        tx=xx[a[ii].s.f];
        ty=yy[a[ii].s.s];
        k=f(tx,ty)+1;
        if(n<=10000){
        for(i=nn+tx-1 ; i>=1 ; i/=2){
            for(j=nn+ty-1 ; j>=1 ; j/=2)
                if(seg[nn*2*i+j]<k)
                    seg[nn*2*i+j]=k;
                else
                    break;
        }
        ans=ans>k?ans:k;
        }
    }

    cout<<ans;
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 212 ms 20216 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 793 ms 52772 KB Output is correct
2 Correct 655 ms 52772 KB Output is correct
3 Correct 1167 ms 73700 KB Output is correct
4 Correct 1735 ms 88968 KB Output is correct
5 Correct 916 ms 88968 KB Output is correct
6 Correct 959 ms 88968 KB Output is correct
7 Correct 1880 ms 88968 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 212 ms 20216 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 793 ms 52772 KB Output is correct
2 Correct 655 ms 52772 KB Output is correct
3 Correct 1167 ms 73700 KB Output is correct
4 Correct 1735 ms 88968 KB Output is correct
5 Correct 916 ms 88968 KB Output is correct
6 Correct 959 ms 88968 KB Output is correct
7 Correct 1880 ms 88968 KB Output is correct
8 Execution timed out 4046 ms 283564 KB Time limit exceeded
9 Halted 0 ms 0 KB -