結果
| 問題 | No.992 最長増加部分列の数え上げ |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-07-24 12:14:48 |
| 言語 | C++23(gcc16) (gcc 16.1.0 + boost 1.90.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,634 bytes |
| 記録 | |
| コンパイル時間 | 1,545 ms |
| コンパイル使用メモリ | 230,900 KB |
| 実行使用メモリ | 9,344 KB |
| 最終ジャッジ日時 | 2026-07-24 12:14:56 |
| 合計ジャッジ時間 | 7,094 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge2_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | WA * 24 RE * 18 |
ソースコード
#include <chrono>
#include <iostream>
#include <map>
#include <random>
#include <utility>
using namespace std;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
#define Jungle "subseq"
#define MASK(i) (1 << (i))
#define getbit(x, i) (((x) >> (i)) & 1)
#define cntbit(x) __builtin_popcount(x)
#define _(x) ((x) & -(x))
#define MULTEST \
int numtest; \
read(numtest); \
for (; numtest; --numtest)
template <typename t> void mini(t &a, t b)
{
if (a > b)
a = b;
}
template <typename t> void maxi(t &a, t b)
{
if (a < b)
a = b;
}
const int mod = 1e9 + 7;
int add(const int &x, const int &y)
{
return (1ll * x + y) % mod;
}
int sub(const int &x, const int &y)
{
return (1ll * x - y + mod) % mod;
}
int mul(const int &x, const int &y)
{
return 1ll * x * y % mod;
}
template <typename t> void read(t &x)
{
cin >> x;
}
const bool is_debug = 1;
const int maxn = 1e5 + 5;
int n, a[maxn];
void init(void)
{
cin >> n;
for (int i = 1; i <= n; ++i)
cin >> a[i];
}
void compress(void)
{
map<int, int> store;
for (int i = 1; i <= n; ++i)
store[a[i]] = 1;
int cnt = 0;
for (auto &[v, f] : store)
f = ++cnt;
for (int i = 1; i <= n; ++i)
a[i] = store[a[i]];
}
struct FenwickTree
{
pair<int, int> bit[maxn];
pair<int, int> merge(pair<int, int> a, pair<int, int> b)
{
if (a.first > b.first)
return a;
if (b.first > a.first)
return b;
if (a.first == 0)
return {0, 0};
return {a.first, add(a.second, b.second)};
}
void insert(int x, const pair<int, int> &p)
{
for (; x <= n; x += _(x))
bit[x] = merge(bit[x], p);
}
pair<int, int> get(int x)
{
pair<int, int> ans = {0, 1};
for (; x > 0; x -= _(x))
ans = merge(ans, bit[x]);
return ans;
}
} bit;
void solve(void)
{
init();
compress();
pair<int, int> res = {0, 0};
for (int i = 1; i <= n; ++i)
{
pair<int, int> out = bit.get(a[i] - 1);
++out.first;
if (out.first > res.first)
res = out;
else if (out.first == res.first)
res.second = add(out.second, res.second);
bit.insert(a[i], out);
}
cout << res.second << '\n';
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(nullptr);
cout.tie(nullptr);
if (fopen(Jungle ".inp", "r"))
{
freopen(Jungle ".inp", "r", stdin);
freopen(Jungle ".out", "w", stdout);
}
// MULTEST
solve();
// cerr << "\nTime elapsed: " << 1000.0 * clock() / CLOCKS_PER_SEC << "ms\n";
return 0;
}