結果
| 問題 |
No.1996 <><
|
| コンテスト | |
| ユーザー |
MasKoaTS
|
| 提出日時 | 2023-09-03 15:49:09 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 72 ms / 2,000 ms |
| コード長 | 2,034 bytes |
| コンパイル時間 | 2,065 ms |
| コンパイル使用メモリ | 205,676 KB |
| 最終ジャッジ日時 | 2025-02-16 18:24:45 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 29 |
ソースコード
#include <bits/stdc++.h>
#define mod 1000000007ll
#define lb(a, x) lower_bound(a.begin(), a.end(), x) - a.begin()
using namespace std;
using ll = long long;
template <typename T>
struct BinaryIndexedTree {
int N;
vector<T> data;
BinaryIndexedTree(void){
};
BinaryIndexedTree(int size) {
N = size + 2;
data = vector<T>(size + 1);
}
T sum(int r) {
if (r <= 0) {
return 0;
}
T ret(0);
for (r = r; r > 0; r -= r & -r){
ret += data[r];
}
return ret;
}
T sum(int l, int r) {
return sum(r) - sum(l);
}
T operator[](int k) {
return sum(k + 1) - sum(k);
}
void add(int k, T x) {
for (++k; k < N; k += k & -k) {
data[k] += x;
}
}
void range_add(int l, int r, T x) {
add(l, x);
add(r, -x);
}
int lower_bound(T w) {
if (w <= 0) {
return 0;
}
int x = 0;
for (int k = 1 << __lg(N); k; k >>= 1) {
if (x + k <= N - 1 && data[x + k] < w) {
w -= data[x + k];
x += k;
}
}
return x;
}
int upper_bound(T w) {
return lower_bound(w + 1);
}
};
int main(){
int N, K; cin >> N >> K;
vector<ll> a(N);
for(auto& x : a){
cin >> x;
}
string s; cin >> s;
vector<ll> st = a; sort(st.begin(), st.end());
st.erase(unique(st.begin(), st.end()), st.end());
for(auto& x : a){
x = lb(st, x);
}
vector<vector<ll> > dp(K + 1, vector<ll>(N, 1));
for(int i = 1; i < K + 1; ++i){
BinaryIndexedTree<ll> bt(N);
for(int j = 0; j < N; ++j){
int k = (int)a[j];
bt.add(k, dp[i - 1][j]);
if(s[i - 1] == '<'){
dp[i][j] = bt.sum(k) % mod;
}
else{
dp[i][j] = bt.sum(k + 1, N) % mod;
}
}
}
ll ans = 0;
for (ll t : dp[K]) {
ans += t;
ans %= mod;
}
cout << ans << endl;
return 0;
}
MasKoaTS