제출 #854603

#제출 시각아이디문제언어결과실행 시간메모리
854603Zero_OPLongest beautiful sequence (IZhO17_subsequence)C++14
23 / 100
51 ms3896 KiB
#include<bits/stdc++.h>

using namespace std;

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(NULL); cout.tie(NULL);

    if(fopen("A.INP", "r")){
        freopen("A.INP", "r", stdin);
        freopen("A.OUT", "w", stdout);
    }

    int n; cin>>n;
    vector<int> a(n), k(n);
    for(int i=0; i<n; ++i){
        cin>>a[i];
    }
    for(int i=0; i<n; ++i){
        cin>>k[i];
    }

    if(n<=20){
        int ans=0, ans_mask=1;
        for(int mask=1; mask<(1<<n); ++mask){
            bool ok=true;
            int pre=-1;
            for(int i=0; i<n; ++i){
                if((mask>>i)&1){
                    if(pre==-1){
                        pre=a[i];
                    }
                    else if(__builtin_popcount(a[i]&pre)==k[i]){
                        pre=a[i];
                    }
                    else {
                        ok=false;
                        break;
                    }
                }
            }

            if(ok){
                int cur=__builtin_popcount(mask);
                if(cur>ans){
                    ans=cur;
                    ans_mask=mask;
                }
            }
        }
        cout<<ans<<'\n';
        for(int i=0; i<n; ++i){
            if((ans_mask>>i)&1){
                cout<<i+1<<' ';
            }
        }
        return 0;
    }

    if(n<=5000){
        int end_idx=0;
        vector<int> dp(n, 1), pre(n); iota(pre.begin(), pre.end(), 0);
        for(int i=0; i<n; ++i){
            for(int j=0; j<i; ++j){
                if(__builtin_popcount(a[i]&a[j])==k[i]){
                    if(dp[i]<dp[j]+1){
                        dp[i]=dp[j]+1;
                        pre[i]=j;
                    }
                }

                if(dp[end_idx]<dp[i]){
                    end_idx=i;
                }
            }
        }

        stack<int> st;
        while(end_idx!=pre[end_idx]){
            st.push(end_idx);
            end_idx=pre[end_idx];
        }
        st.push(end_idx);
        cout<<st.size()<<'\n';
        while(!st.empty()){
            cout<<st.top()+1<<' ';
            st.pop();
        }

        return 0;
    }

    if(*max_element(a.begin(), a.end())<(1<<8)){
        int end_idx=0;
        vector<int> dp(n, 1), pre(n);
        iota(pre.begin(), pre.end(), 0);

        int BIT=(1<<8);
        vector<int> f(BIT, 0), g(BIT, 0);
        for(int i=0; i<n; ++i){
            for(int v=0; v<BIT; ++v){
                if(__builtin_popcount(a[i]&v)==k[i]){
                    if(f[v]+1>dp[i]){
                        dp[i]=f[v]+1;
                        pre[i]=g[v];
                    }
                }
            }
            if(dp[i]>f[a[i]]){
                f[a[i]]=dp[i];
                g[i]=i;
            }

            if(dp[end_idx]<dp[i]){
                end_idx=i;
            }
        }

        stack<int> st;
        while(end_idx!=pre[end_idx]){
            st.push(end_idx);
            end_idx=pre[end_idx];
        }
        st.push(end_idx);
        cout<<st.size()<<'\n';
        for(; !st.empty(); st.pop()){
            cout<<st.top()+1<<' ';
        }
        return 0;
    }

    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

subsequence.cpp: In function 'int main()':
subsequence.cpp:10:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   10 |         freopen("A.INP", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
subsequence.cpp:11:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   11 |         freopen("A.OUT", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...