比赛 2025.9.13 评测结果 AAAAEAATTTTTEEEEEEEE
题目名称 The Best Subsequence 最终得分 30
用户昵称 LikableP 运行时间 16.428 s
代码语言 C++ 内存使用 4.04 MiB
提交时间 2025-09-13 11:56:41
显示代码纯文本
#include <iostream>
//#include <format>
#include <algorithm>
using namespace std;

const int MAXN = 2e5 + 10;
const long long MOD = 1e9 + 7;

int N, M, Q;
int mask[MAXN];
int preone[MAXN];
bool a[MAXN];

// bin -> dec
long long trans(string str) {
  reverse(str.begin(), str.end());
  long long val = 1, res = 0;
  for (auto ch : str) {
    res = (res + (ch - '0') * val) % MOD;
    (val <<= 1) %= MOD;
  }
  return res;
}

int main() {
  freopen("Subsequence.in", "r", stdin);
  freopen("Subsequence.out", "w", stdout);
  cin.tie(0)->sync_with_stdio(false), cout.tie(0);
  // read
  cin >> N >> M >> Q;
  for (int i = 1, l, r; i <= M; ++i) {
    cin >> l >> r;
    mask[l]++, mask[r + 1]--;
  }
  
  // handle reverse by using pre-sum
  for (int i = 1; i <= N; ++i) {
    mask[i] += mask[i - 1];
    a[i] = mask[i] & 1;
    preone[i] = a[i - 1] ? i - 1 : preone[i - 1];
  }
  
  // fix preone
  for (int i = 1; i <= N; ++i) {
    if (a[i] & 1) preone[preone[i]] = i;
  }
  for (int i = 1; i <= N; ++i) {
    if ((a[i] & 1) == 0) preone[i] = preone[preone[i]];
  }
  for (int i = 1; i <= N; ++i) {
    if (a[i] & 1) preone[i] = i;
  }
  
  // calc ans
  for (int l, r, k; Q--; ) {
    string ans = "";
    cin >> l >> r >> k;
    for (int i = preone[l];k;i = preone[i + 1]) {
      if (r - i + 1 <= k) {
        for (int j = r - k + 1; j <= r; ++j) {
          ans += to_string(a[j]);
        }
        break;
      }
      ans += "1";
      k--;
    }
    cout << trans(ans) << endl;
  }
  return 0;
}