Advertisement
wym1111

Untitled

May 14th, 2024
448
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.79 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. using ll = long long;
  5. #define endl '\n'
  6.  
  7. const int N = 1e5 + 10;
  8. const ll mod = 998244353;
  9.  
  10. class Segment {
  11. private:
  12.     struct Node {
  13.         ll sum, tag;
  14.     } node[N << 2];
  15. public:
  16.     void push_up (int p) {
  17.         node[p].sum = (node[p << 1].sum + node[p << 1 | 1].sum) % mod;
  18.     }
  19.     void build (int s, int t, int p) {
  20.         node[p].tag = 1;
  21.         if (s == t) {
  22.             node[p].sum = 0;
  23.             return;
  24.         }
  25.         int mid = (s + t) >> 1;
  26.         build(s, mid, p << 1);
  27.         build(mid + 1, t, p << 1 | 1);
  28.         push_up(p);
  29.     }
  30.     void push_down (int p) {
  31.         if (node[p].tag != 1) {
  32.             int ls = p << 1, rs = p << 1 | 1;
  33.             node[ls].tag = node[ls].tag * node[p].tag % mod;
  34.             node[ls].sum = node[ls].sum * node[p].tag % mod;
  35.             node[rs].tag = node[rs].tag * node[p].tag % mod;
  36.             node[rs].sum = node[rs].sum * node[p].tag % mod;
  37.             node[p].tag = 1;
  38.         }
  39.     }
  40.     void update (int x, ll val, int s, int t, int p) {
  41.         if (s == t) {
  42.             node[p].sum = val;
  43.             return;
  44.         }
  45.         int mid = (s + t) >> 1;
  46.         push_down(p);
  47.         if (x <= mid) update(x, val, s, mid, p << 1);
  48.         else update(x, val, mid + 1, t, p << 1 | 1);
  49.         push_up(p);
  50.         return;
  51.     }
  52.     void muti (int l, int r, int s, int t, int p) {
  53.         if (l <= s && t <= r) {
  54.             node[p].sum = node[p].sum * 2 % mod;
  55.             node[p].tag = node[p].tag * 2 % mod;
  56.             return;
  57.         }
  58.         int mid = (s + t) >> 1;
  59.         push_down(p);
  60.         if (l <= mid) muti(l, r, s, mid, p << 1);
  61.         if (mid < r) muti(l, r, mid + 1, t, p << 1 | 1);
  62.         push_up(p);
  63.         return;
  64.     }
  65.     ll query (int l, int r, int s, int t, int p) {
  66.         if (l <= s && t <= r) return node[p].sum;
  67.         int mid = (s + t) >> 1;
  68.         push_down(p);
  69.         ll res = 0;
  70.         if (l <= mid) res = query(l, r, s, mid, p << 1);
  71.         if (mid < r) res += query(l, r, mid + 1, t, p << 1);
  72.         return res % mod;
  73.     }
  74. };
  75. Segment segt[2];
  76.  
  77. int n;
  78. struct str {
  79.     int l, r, col;
  80. } seg[N];
  81.  
  82. void solve() {
  83.     cin >> n;
  84.     for (int i = 1; i <= n; i ++) {
  85.         cin >> seg[i].l >> seg[i].r >> seg[i].col;
  86.     }
  87.     sort(seg + 1, seg + 1 + n, [&](str x, str y) {
  88.         if (x.r == y.r) return x.l < y.l;
  89.         return x.r < y.r;
  90.     });
  91.     segt[0].build(0, n, 1);
  92.     segt[1].build(0, n, 1);
  93.     segt[0].update(0, 1, 0, n, 1);
  94.     segt[1].update(0, 1, 0, n, 1);
  95.     ll ans = 1;
  96.     for (int i = 1; i <= n; i ++) {
  97.         int l = 0, r = i - 1;
  98.         while (l < r) {
  99.             int mid = r - ((r - l) >> 1);
  100.             if (seg[mid].r >= seg[i].l) r = mid - 1;
  101.             else l = mid;
  102.         }
  103.         int c = seg[i].col;
  104.         ll val = segt[c ^ 1].query(0, l, 0, n, 1);
  105.         ans = (ans + val) % mod;
  106.         segt[c].update(i, val, 0, n, 1);
  107.         segt[c ^ 1].muti(0, l, 0, n, 1);
  108.         cout << seg[i].l << ' ' << seg[i].r << ' ' << seg[i].col << ": " << l << ' ' << val << endl;
  109.     }
  110.     cout << ans << endl;
  111. }
  112.  
  113. signed main() {
  114.     ios::sync_with_stdio(false);
  115.     cin.tie(nullptr);
  116.    
  117.     int _ = 1;
  118.     cin >> _;
  119.     while(_--)
  120.         solve();
  121.     return 0;
  122. }
  123.  
  124. /*
  125.  
  126.  */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement