제출 #92045

#제출 시각아이디문제언어결과실행 시간메모리
92045emil_physmathLongest beautiful sequence (IZhO17_subsequence)C++17
23 / 100
685 ms263168 KiB
#include <iostream> #include <stdio.h> #include <stack> using namespace std; const int MAXN=100000+5; int a[MAXN], k[MAXN], dp[MAXN], prevNum[MAXN], maxdp[(1<<9)+5]; // maxdp[k][i] void SubTaskTwo(int n); void SubTaskThree(int n); int NumBits(int); int main() { int n; cin>>n; for (int i=0; i<n; i++) scanf("%d", a+i); for (int i=0; i<n; i++) scanf("%d", k+i); if (n<=5000) SubTaskTwo(n); else SubTaskThree(n); char I; cin >> I; return 0; } void SubTaskTwo(int n) { dp[0]=1; prevNum[0]=-1; for (int i=1; i<n; i++) { dp[i]=1; prevNum[i]=-1; for (int j=0; j<i; j++) if (NumBits(a[i] & a[j])==k[i]) if (dp[j]+1>dp[i]) { dp[i]=dp[j]+1; prevNum[i]=j; } } int bestEnd; for (int i=0; i<n; i++) if (!i || dp[i]>dp[bestEnd]) bestEnd=i; stack<int> ans; int curNum=bestEnd; ans.push(curNum); while (prevNum[curNum]!=-1) { curNum=prevNum[curNum]; ans.push(curNum); } cout<<ans.size()<<'\n'; while (!ans.empty()) { cout<<ans.top()+1<<' '; ans.pop(); } cout<<'\n'; } void SubTaskThree(int n) { for (int j=0; j<(1<<9); j++) maxdp[j]=-1; dp[0]=1; prevNum[0]=-1; maxdp[a[0]]=0; for (int i=1; i<n; i++) { dp[i]=1; prevNum[i]=-1; if (maxdp[a[i]]==-1 || dp[i]>dp[maxdp[a[i]]]) maxdp[a[i]]=i; for (int j=0; j<(1<<9); j++) if (NumBits(a[i] & j)==k[i]) if (maxdp[j]!=-1 && dp[maxdp[j]]+1>dp[i]) { dp[i]=dp[maxdp[j]]+1; prevNum[i]=maxdp[j]; if (maxdp[a[i]]==-1 || dp[i]>dp[maxdp[a[i]]]) maxdp[a[i]]=i; } } int bestEnd; for (int i=0; i<n; i++) if (!i || dp[i]>dp[bestEnd]) bestEnd=i; stack<int> ans; int curNum=bestEnd; ans.push(curNum); while (prevNum[curNum]!=-1) { curNum=prevNum[curNum]; ans.push(curNum); } cout<<ans.size()<<'\n'; while (!ans.empty()) { printf("%d ", ans.top()+1); ans.pop(); } cout<<'\n'; /* cout<<"dp[0...n-1]\n"; for (int i=0; i<n; i++) cout<<dp[i]<<' '; cout<<'\n'; for (int i=0; i<n; i++) cout<<"maxdp["<<a[i]<<"] = "<<maxdp[a[i]]<<'\n'; */ } int NumBits(int n) { int res=0; while (n) { if (n & 1) res++; n>>=1; } return res; }

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

subsequence.cpp: In function 'int main()':
subsequence.cpp:17:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d", a+i);
   ~~~~~^~~~~~~~~~~
subsequence.cpp:19:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d", k+i);
   ~~~~~^~~~~~~~~~~
subsequence.cpp: In function 'void SubTaskTwo(int)':
subsequence.cpp:46:6: warning: 'bestEnd' may be used uninitialized in this function [-Wmaybe-uninitialized]
  int bestEnd;
      ^~~~~~~
subsequence.cpp: In function 'void SubTaskThree(int)':
subsequence.cpp:90:6: warning: 'bestEnd' may be used uninitialized in this function [-Wmaybe-uninitialized]
  int bestEnd;
      ^~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...