IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> P4229-某位歌姬的故事【dp】 -> 正文阅读

[数据结构与算法]P4229-某位歌姬的故事【dp】

正题

题目链接:https://www.luogu.com.cn/problem/P4229


题目大意

求有多少个长度为 n n n的序列 a a a,满足 ? i ∈ [ 1 , n ] , a i ∈ [ 1 , A ] \forall i\in[1,n],a_i\in[1,A] ?i[1,n],ai?[1,A],还有 Q Q Q个限制形如
max ? { a j } ( j ∈ [ l i , r i ] ) = m i \max\{a_j\}(j\in[l_i,r_i])=m_i max{aj?}(j[li?,ri?])=mi?

1 ≤ n , A ≤ 9 × 1 0 8 , 1 ≤ m i ≤ A , 1 ≤ Q ≤ 500 , 1 ≤ T ≤ 20 1\leq n,A\leq 9\times 10^8,1\leq m_i\leq A,1\leq Q\leq 500,1\leq T\leq 20 1n,A9×108,1mi?A,1Q500,1T20


解题思路

首先我们第一步肯定是把每个区间的端点提出来离散化,这样我们的区间数就是 O ( Q ) O(Q) O(Q)级别的了。

然后考虑到对于两个有交的区间 [ l 1 , r 1 ] [l_1,r_1] [l1?,r1?]限制为 m 1 m_1 m1? [ l 2 , r 2 ] [l_2,r_2] [l2?,r2?]限制为 m 2 m_2 m2?,在 m 1 < m 2 m_1<m_2 m1?<m2?时这两个区间交的那一部分显然不会对第二个区间产生影响,因为这个区间肯定合法并且不能是最大值。

那么我们考虑求出每个区间能够到达的最大值 l i m i lim_i limi?,然后对一个所有的限制 [ l , r , w ] [l,r,w] [l,r,w],我们都只需要考虑 l i m i = w lim_i=w limi?=w的区间。

现在相当于对于每个单独的小区间我们可以选择上到最大值或者没有最大值。然后要求是每个区间至少有一个最大值。

考虑 d p dp dp,设 f i , j f_{i,j} fi,j?表示现在做到第 i i i个区间,上一个顶到最大值的区间是 j j j时的方案,因为我们只处理 l i m i = w lim_i=w limi?=w的区间,所以一个区间最多被做一次。

时间复杂度: O ( T Q 2 ) O(TQ^2) O(TQ2)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=2100,P=998244353;
struct node{
	ll l,r,w;
}q[N];
ll T,n,m,A,tot,cnt,b[N];
ll wc[N],bc[N],lim[N],len[N];
ll f[N][N],rim[N],loc[N],pos[N];
ll power(ll x,ll b){
	ll ans=1;
	while(b){
		if(b&1)ans=ans*x%P;
		x=x*x%P;b>>=1;
	}
	return ans;
}
bool cmp(node x,node y){
	if(x.w!=y.w)return x.w<y.w;
	if(x.l!=y.l)return x.l<y.l;
	return x.r<y.r;
}
ll calc(ll w,ll L,ll R){
	tot=0;
	for(ll i=1;i<=cnt;i++){
		if(lim[i]==w)
			loc[++tot]=i,rim[tot]=0;
		pos[i]=tot;
	}
	for(ll i=L;i<=R;i++){
		q[i].r=pos[q[i].r];
		if(loc[pos[q[i].l]]!=q[i].l)
			q[i].l=pos[q[i].l]+1;
		else q[i].l=pos[q[i].l];
		rim[q[i].r]=max(rim[q[i].r],q[i].l);
	}
	ll r=0;f[0][0]=1;
	for(ll i=1;i<=tot;i++){
		for(ll j=0;j<=i;j++)f[i][j]=0;
		for(ll j=rim[i];j<i;j++)
			(f[i][j]+=f[i-1][j]*wc[loc[i]]%P)%=P;
		for(ll j=0;j<i;j++)
			(f[i][i]+=f[i-1][j]*bc[loc[i]]%P)%=P;
	}
	ll ans=0;
	for(ll j=0;j<=tot;j++)
		(ans+=f[tot][j])%=P;
	return ans;
}
void solve(){
	scanf("%lld%lld%lld",&n,&m,&A);
	for(ll i=1;i<=m;i++){
		scanf("%lld%lld%lld",&q[i].l,&q[i].r,&q[i].w);
		q[i].r++;b[++cnt]=q[i].l;b[++cnt]=q[i].r;
	}
	b[++cnt]=1;b[++cnt]=n+1;
	sort(b+1,b+1+cnt);
	sort(q+1,q+1+m,cmp);
	cnt=unique(b+1,b+1+cnt)-b-1;
	for(ll i=1;i<=cnt;i++)lim[i]=A+1;
	for(ll i=1;i<=m;i++){
		q[i].l=lower_bound(b+1,b+1+cnt,q[i].l)-b;
		q[i].r=lower_bound(b+1,b+1+cnt,q[i].r)-b-1;
		bool flag=false;
		for(ll j=q[i].l;j<=q[i].r;j++){
			if(lim[j]>=q[i].w)flag=true;
			lim[j]=min(lim[j],q[i].w);
		}
		if(!flag){puts("0");return;}
	}
	ll ans=1;
	for(ll i=1;i<cnt;i++){
		len[i]=b[i+1]-b[i];
		if(lim[i]==A+1)ans=ans*power(A,len[i])%P;
		wc[i]=power(lim[i]-1,len[i]);
		bc[i]=(power(lim[i],len[i])-wc[i]+P)%P;
	}
	ll L,R=0;cnt--;
	while(R<m){
		L=R+1;R=L;
		while(R<m&&q[R+1].w==q[L].w)R++;
		ans=ans*calc(q[L].w,L,R)%P;
	}
	printf("%lld\n",ans);
	return;
}
signed main()
{
	scanf("%lld",&T);
	while(T--){
		cnt=0;solve();
	}
	return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-13 22:03:13  更:2022-03-13 22:06:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 13:35:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码