제출 #89956

#제출 시각아이디문제언어결과실행 시간메모리
89956VardanyanLongest beautiful sequence (IZhO17_subsequence)C++14
23 / 100
804 ms11772 KiB
// #pragma GCC optimize "-O3"
#include<bits/stdc++.h>
using namespace std;
const int N = 1000*1000+5;
struct elem{
    int val,ind,par;
};
elem ANS[(1<<24)];
int ALL[N];
int PAR[N];
int a[N];
int k[N];
int CNT(int x){
    int ans = 0;
    for(int i = 0;i<22;i++) if((x>>i)&1) ans++;
    return ans;
}
bool have[(1<<21)];
int main()
{
    int n;
    scanf("%d",&n);
    int mx = 0;
    vector<int> bmask;
    for(int i = 1;i<=n;i++){
            scanf("%d",&a[i]);
            mx = max(mx,a[i]);
    }
    for(int i = 1;i<=n;i++) scanf("%d",&k[i]);
    int mx_ans = 0;
    int pos = 0;
    for(int i = 1;i<=n;i++){
        /*if(i == 2){
            cout<<0<<endl;
        }*/
        for(int q = 0;q<bmask.size();q++){
            int mask = bmask[q];
            int now = mask&a[i];
            if(CNT(now) == k[i]){
                if(ANS[a[i]].val<=ANS[mask].val+1){
                    int x =ANS[mask].ind;
                    int y = ANS[mask].val+1;
                    if(i == x) continue;
                    PAR[i] = x;
                    ANS[a[i]].val = y;
                    ANS[a[i]].par = x;
                    ANS[a[i]].ind = i;
                    ALL[i] = ANS[a[i]].val;
                    if(mx_ans<=ANS[a[i]].val){
                        mx_ans = ANS[a[i]].val;
                        pos = i;
                    }
                }
            }
        }
        if(ANS[a[i]].val == 0){
            ANS[a[i]].val = 1;
            ANS[a[i]].ind = i;
            ALL[i] = 1;
            if(mx_ans<1){
                mx_ans = 1;
                pos = i;
            }
        }
        if(!have[a[i]]){
            have[a[i]] = 1;
            bmask.push_back(a[i]);
        }
    }
    vector<int> ans;
    cout<<mx_ans<<endl;
    while(mx_ans--){
      //  cout<<ANS[pos].ind<<" ";
        ans.push_back(pos);
        pos = PAR[pos];
    }
    reverse(ans.begin(),ans.end());
    for(int i = 0;i<ans.size();i++) cout<<ans[i]<<" ";
    cout<<endl;
    return 0;
}

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

subsequence.cpp: In function 'int main()':
subsequence.cpp:36:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int q = 0;q<bmask.size();q++){
                       ~^~~~~~~~~~~~~
subsequence.cpp:78:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0;i<ans.size();i++) cout<<ans[i]<<" ";
                   ~^~~~~~~~~~~
subsequence.cpp:22:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d",&n);
     ~~~~~^~~~~~~~~
subsequence.cpp:26:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
             scanf("%d",&a[i]);
             ~~~~~^~~~~~~~~~~~
subsequence.cpp:29:34: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     for(int i = 1;i<=n;i++) scanf("%d",&k[i]);
                             ~~~~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...