結果
| 問題 |
No.992 最長増加部分列の数え上げ
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-02-07 06:12:54 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 187 ms / 2,000 ms |
| コード長 | 792 bytes |
| コンパイル時間 | 719 ms |
| コンパイル使用メモリ | 73,868 KB |
| 実行使用メモリ | 32,072 KB |
| 最終ジャッジ日時 | 2024-09-25 07:11:35 |
| 合計ジャッジ時間 | 8,054 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 42 |
ソースコード
#include<iostream>
#include<vector>
using namespace std;
int N;
vector<int>s[2<<17];
vector<long>ss[2<<17];
long mod=1e9+7;
int main()
{
cin>>N;
for(int i=0;i<=N;i++)
{
s[i].push_back(2e9);
ss[i].push_back(0);
}
s[0].push_back(-2e9);
ss[0].push_back(1);
for(int i=0;i<N;i++)
{
int A;cin>>A;
int id;
{
int l=0,r=N+1;
while(r-l>1)
{
int m=l+r>>1;
if(s[m].back()>=A)r=m;
else l=m;
}
id=r;
}
long now=ss[id-1].back();
{
int l=0,r=ss[id-1].size();
while(r-l>1)
{
int m=l+r>>1;
if(s[id-1][m]>=A)l=m;
else r=m;
}
now-=ss[id-1][l];
}
s[id].push_back(A);
now+=ss[id].back();
ss[id].push_back((now%mod+mod)%mod);
}
for(int i=N;i;i--)
{
if(s[i].back()<2e9)
{
cout<<ss[i].back()<<endl;
return 0;
}
}
}