关于第二题,我用 线段树 + 构图跑拓扑排序做的,但是除了 Sub 1 都 WA 了,求大佬 Hank
Q: 为什么发两遍
A:因为第一次的帖子放错代码了,放的是 T1 的代码。QWQ
#include<bits/stdc++.h>
#define MAXN 500010
#define MAXX 100010
#define lson now << 1
#define rson now << 1 | 1
#define MOD 998244353ll
using namespace std;
typedef long long ll;
struct island{
ll l, r, h, u, v;
};
struct node{
ll l, r;
ll res, lazy_tag;
};
struct edge{
ll pre, to;
};
bool operator < (island a, island b){
if(a.h == b.h){
if(a.l == b.l) return a.r < b.r;
return a.l < a.l;
}
return a.h < b.h;
}
bool operator > (island a, island b){
if(a.h == b.h){
if(a.l == b.l) return a.r > b.r;
return a.l > a.l;
}
return a.h > b.h;
}
island a[MAXN];
edge e[MAXN << 3];
node tree[MAXX << 2];
ll n, m, mx, tot, cnt;
ll head[MAXN << 2], six[MAXN], id[MAXN], deg[MAXN], dp[MAXN << 2];
void push_up(ll now){
tree[now].res = tree[lson].res + tree[rson].res;
}
void push_down(ll now){
if(tree[now].lazy_tag != -1){
tree[lson].lazy_tag = tree[now].lazy_tag;
tree[rson].lazy_tag = tree[now].lazy_tag;
tree[lson].res = (tree[lson].r - tree[lson].l + 1) * tree[now].lazy_tag;
tree[rson].res = (tree[rson].r - tree[rson].l + 1) * tree[now].lazy_tag;
tree[now].lazy_tag = -1;
}
}
void build(ll now, ll l, ll r){
tree[now].l = l; tree[now].r = r;
tree[now].lazy_tag = -1;
if(tree[now].l == tree[now].r){
tree[now].res = 0;
return ;
}
ll mid = (tree[now].l + tree[now].r) >> 1;
build(lson, l, mid); build(rson, mid + 1, r);
push_up(now);
}
void update(ll now, ll l, ll r, ll x){
if(tree[now].l >= l && tree[now].r <= r){
tree[now].lazy_tag = x;
tree[now].res = (tree[now].r - tree[now].l + 1) * x;
return ;
}
push_down(now);
ll mid = (tree[now].l + tree[now].r) >> 1;
if(r <= mid) update(lson, l, r, x);
else if(l > mid) update(rson, l, r, x);
else update(lson, l, mid, x), update(rson, mid + 1, r, x);
push_up(now);
}
ll query(ll now, ll pos){
if(tree[now].l == pos && tree[now].r == pos){
return tree[now].res;
}
push_down(now);
ll mid = (tree[now].l + tree[now].r) >> 1;
if(pos <= mid) return query(lson, pos);
else return query(rson, pos);
}
void add_edge(ll u, ll v){
e[++cnt].pre = head[u];
e[cnt].to = v;
head[u] = cnt;
deg[v]++;
}
void topsort(){
queue<ll> q;
for(int i = 0; i <= tot; i++){
if(deg[i] == 0){
q.push(i);
dp[i] = 1;
}
}
while(!q.empty()){
ll now = q.front(); q.pop();
for(ll i = head[now]; i; i = e[i].pre){
(dp[e[i].to] += dp[now]) %= MOD;
deg[e[i].to]--;
if(deg[e[i].to] == 0){
q.push(e[i].to);
}
}
}
}
int main(){
scanf("%lld%lld",&n,&m);
for(ll i = 1; i <= m; i++){
scanf("%lld%lld%lld",&a[i].l,&a[i].r,&a[i].h);
mx = max(mx, a[i].r);
}
for(ll i = 1; i <= n; i++) scanf("%lld",&six[i]);
build(1, 0, mx);
sort(a + 1, a + m + 1);
for(ll i = 1; i <= m; i++){
a[i].u = ++tot; a[i].v = ++tot;
ll x = query(1, a[i].l), y = query(1, a[i].r);
if(x == 0) add_edge(a[i].u, 0);
else add_edge(a[i].u, a[x].u), add_edge(a[i].u, a[x].v);
if(y == 0) add_edge(a[i].v, 0);
else add_edge(a[i].v, a[y].u), add_edge(a[i].v, a[y].v);
update(1, a[i].l, a[i].r, i);
}
for(ll i = 1; i <= n; i++){
ll x = query(1, six[i]); id[i] = ++tot;
if(x == 0) add_edge(tot, 0);
else add_edge(tot, a[x].u), add_edge(tot, a[x].v);
}
topsort();
printf("%lld\n",dp[0] % MOD);
return 0;
}