結果
問題 |
No.1460 Max of Min
|
ユーザー |
|
提出日時 | 2021-04-01 01:06:35 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,480 bytes |
コンパイル時間 | 1,275 ms |
コンパイル使用メモリ | 85,164 KB |
実行使用メモリ | 33,088 KB |
最終ジャッジ日時 | 2024-12-16 00:44:47 |
合計ジャッジ時間 | 239,724 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 14 TLE * 77 |
コンパイルメッセージ
main.cpp:41:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type] 41 | main() | ^~~~
ソースコード
#include<iostream> #include<algorithm> #include<vector> using namespace std; #include<vector> #include<cassert> template<typename T=int> struct Matrix{ vector<vector<T> >dat; int N,M;//N x M matrix Matrix(){} Matrix(int N_):Matrix(N_,N_){} Matrix(int N_,int M_):N(N_),M(M_),dat(N_,vector<T>(M_)){} vector<T>&operator[](int i){return dat[i];} const vector<T>&operator[](int i)const{return dat[i];} static Matrix eye(int N) { Matrix res(N); for(int i=0;i<N;i++)res[i][i]=1; return res; } Matrix operator*(const Matrix&A)const { assert(M==A.N); Matrix res(N,A.M); for(int i=0;i<N;i++)for(int j=0;j<A.M;j++)for(int k=0;k<M;k++) res[i][j]|=dat[i][k]&A[k][j]; return res; } Matrix pow(long long n)const { assert(N==M); Matrix a=*this,res=eye(N); for(;n;a=a*a,n>>=1)if(n&1)res=res*a; return res; } }; long N; int K; long A[1010],B[1010]; main() { cin>>K>>N; for(int i=0;i<K;i++)cin>>A[i]; for(int i=0;i<K;i++)cin>>B[i]; if(N<K) { cout<<A[N]<<endl; return 0; } vector<long>T;T.reserve(2*K); for(int i=0;i<K;i++)T.push_back(A[i]); for(int i=0;i<K;i++)T.push_back(B[i]); sort(T.begin(),T.end()); T.erase(unique(T.begin(),T.end()),T.end()); int l=0,r=T.size(); while(r-l>1) { int mid=(l+r)/2; Matrix<>X(K); for(int i=0;i<K;i++)X[0][i]=B[K-i-1]>=T[mid]; for(int i=1;i<K;i++)X[i][i-1]=1; X=X.pow(N-K+1); int ok=0; for(int i=0;i<K;i++)if(A[i]>=T[mid])ok|=X[0][K-i-1]; if(ok)l=mid; else r=mid; } cout<<T[l]<<endl; }