Solution-P17140
以下称题目中的
树实际上是满足以下两个条件的图:
- 不存在环。
- 连通。
首先将线段按
将线段
考虑设
这个东西看着就很大坨,尝试优化。不难发现
考虑
至此时间复杂度已经为
需要特别注意从
时间复杂度
#include"segment.h"
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
struct node{
int l,r;
inline friend bool operator < (node i,node j){
return i.l<j.l;
}
inline friend bool operator < (int i,node j){
return j.l>i;
}
}x[3001];
int f[2][3001][1001],s,u[1001];
vector<int>g;
inline void add(int& i,int w){
i=i+w>=mod?i+w-mod:i+w;
}
inline void sub(int& i,int w){
i=i-w<0?i-w+mod:i-w;
}
void init(int c,int t){
return;
}
vector<int>segment(int n,int m,int p,vector<int>l,vector<int>r){
g.clear();
g.push_back(0);
for(int i=1;i<=n;i++){
x[i].l=l[i-1];
x[i].r=r[i-1];
}
sort(x+1,x+n+1);
for(int i=1;i<=n;i++){
for(int a=1;a<=m;a++){
f[0][i][a]=0;
}
}
for(int a=1;a<=m;a++){
u[a]=upper_bound(x+1,x+n+1,a)-x-1;
}
for(int i=1;i<=n;i++){
sub(f[0][i][x[i].r],1);
add(f[0][u[x[i].r]][x[i].r],1);
}
g.emplace_back(n);
for(int k=2;k<=p;k++){
for(int i=1;i<=n;i++){
for(int a=1;a<=m;a++){
f[k&1^1][i][a]=0;
}
}
for(int i=n-1;i>=1;i--){
for(int a=1;a<=m;a++){
add(f[k&1][i][a],f[k&1][i+1][a]);
}
}
s=0;
for(int i=1;i<=n;i++){
for(int a=1;a<=m;a++){
add(s,f[k&1][i][a]);
}
}
g.emplace_back(s);
if(k==p){
break;
}
for(int i=1;i<=n;i++){
for(int a=1;a<=m;a++){
sub(f[k&1^1][max(i,u[min(x[i].r,a)])][max(x[i].r,a)],f[k&1][i][a]);
add(f[k&1^1][u[max(x[i].r,a)]][max(x[i].r,a)],f[k&1][i][a]);
}
}
}
return g;
}