月赛 T2 95pts 求调
  • 板块学术版
  • 楼主sixrc
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/8/6 18:09
  • 上次更新2023/10/27 16:43:42
查看原帖
月赛 T2 95pts 求调
552376
sixrc楼主2022/8/6 18:09

RT,第一个点 WA。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define lc(x) x<<1
#define rc(x) x<<1|1
const int maxn = 100000;
const int mo = 998244353;
int n, m, ans, x, f[500010], d[2000010], tag[2000010];
struct node{
	int l, r, h;
	bool operator < (const node &A) const{
		if (h == A.h) return l < A.l;
		return h < A.h;
	}
}a[500010];
void pushdown(int k){
	if (tag[k]){
		d[lc(k)] = tag[k];
		d[rc(k)] = tag[k];
		tag[lc(k)] = tag[k];
		tag[rc(k)] = tag[k];
		tag[k] = 0;
	}
}
void modify(int k, int l, int r, int x, int y, int p){
	if (x <= l && r <= y){
		d[k] = p;
		tag[k] = p;
		return ;
	}
	int mid = l + r >> 1;
	pushdown(k);
	if (x <= mid) modify(lc(k), l, mid, x, y, p);
	if (y > mid) modify(rc(k), mid+1, r, x, y, p);
}
int query(int k, int l, int r, int x){
	if (l == r) return d[k];
	int mid = l + r >> 1, ret = 0;
	pushdown(k);
	if (x <= mid) ret = query(lc(k), l, mid, x);
	else ret = query(rc(k), mid+1, r, x);
	return ret;
}
signed main(){
	scanf ("%lld%lld", &n, &m);
	for (int i=1; i<=m; i++){
		scanf ("%lld%lld%lld", &a[i].l, &a[i].r, &a[i].h);
	}
	sort (a+1, a+m+1);
	for (int i=1; i<=m; i++){
		int L = a[i].l, R = a[i].r;
		int ql = query(1, 0, maxn, L), qr = query(1, 0, maxn, R);
		if (ql == 0 && qr == 0) f[i] = 2;
		else if (ql == 0 || qr == 0) f[i] = (f[ql] + f[qr] + 1) % mo;
		else f[i] = (f[ql] + f[qr]) % mo;
		modify(1, 0, maxn, L, R, i);
	}
	for (int i=1; i<=n; i++){
		scanf ("%lld", &x);
		ans += f[query(1, 0, maxn, x)];
		ans %= mo;
	}
	printf ("%lld\n", ans);
	return 0;
}

2022/8/6 18:09
加载中...