关于今天洛谷月赛第二题
  • 板块题目总版
  • 楼主NightTide
  • 当前回复6
  • 已保存回复6
  • 发布时间2022/8/6 18:48
  • 上次更新2023/10/27 16:43:16
查看原帖
关于今天洛谷月赛第二题
547908
NightTide楼主2022/8/6 18:48

关于第二题,我用 线段树 + 构图跑拓扑排序做的,但是除了 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;
}
2022/8/6 18:48
加载中...