P4229-某位歌姬的故事【dp】

正题

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


题目大意

求有多少个长度为nnn的序列aaa,满足∀i∈[1,n],ai∈[1,A]\forall i\in[1,n],a_i\in[1,A]i[1,n],ai[1,A],还有QQQ个限制形如
max⁡{aj}(j∈[li,ri])=mi\max\{a_j\}(j\in[l_i,r_i])=m_imax{aj}(j[li,ri])=mi

1≤n,A≤9×108,1≤mi≤A,1≤Q≤500,1≤T≤201\leq n,A\leq 9\times 10^8,1\leq m_i\leq A,1\leq Q\leq 500,1\leq T\leq 201n,A9×108,1miA,1Q500,1T20


解题思路

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

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

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

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

考虑dpdpdp,设fi,jf_{i,j}fi,j表示现在做到第iii个区间,上一个顶到最大值的区间是jjj时的方案,因为我们只处理limi=wlim_i=wlimi=w的区间,所以一个区间最多被做一次。

时间复杂度:O(TQ2)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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Most Powerful

Most Powerful 题意&#xff1a; n个原子&#xff0c;当其中两个原子碰撞时&#xff0c;其中一个会消失&#xff0c;产生大量能量。现在知道每两个原子的碰撞表现&#xff0c;求出产生的能量总和的最大值 题解: 设dp[i]表示i状态下所获得的能量 i为二进制&#xff0c;第x位…

[树套树] 网络管理

A&#xff1a;[CTSC2008]网络管理 此题本来是平衡树板块的&#xff0c;但俺写的是树套树&#xff0c;平衡树会多个log 题目 查询第kkk大&#xff0c;天然主席树可以维护 就不用了平衡树二分&#xff0c;多个logloglog了 将树上(u,v)(u,v)(u,v)的路径转化为 uuu到根 vvv到根…

[翻译] Entity Framework Core in Action 关于这本书

Entityframework Core in action是 Jon P smith 所著的关于Entityframework Core 书籍。原版地址. 是除了官方文档外另一个学习EF Core的不错途径, 书中由浅入深的讲解的EF Core的相关知识。因为没有中文版,所以本人对其进行翻译。 预计每两天一篇更新 PS: 翻译难免限于本人水平…

CF573E-Bear and Bowling【dp,平衡树】

正题 题目链接:https://www.luogu.com.cn/problem/CF573E 题目大意 给出一个长度为nnn的序列aaa&#xff0c;求它的一个子序列bbb&#xff0c;要求最大化 ∑i1∣b∣bii\sum_{i1}^{|b|}b_i\times ii1∑∣b∣​bi​i 1≤n≤105,∣ai∣≤1071\leq n\leq 10^5,|a_i|\leq 10^71≤n…

NC51189 Mondriaan‘s Dream

NC51189 Mondriaan’s Dream 题意&#xff1a; n * m的矩阵&#xff0c;用1 * 2和2 * 1的砖快密铺&#xff0c;问多少种方法&#xff1a; 题解&#xff1a; 方法1&#xff1a; 我们现在规定砖头的竖放的上部分为1&#xff0c;砖头的横放或者是竖放的下部分为0 我们每两层进…

CF1408D:Searchlights

解析 滥用数据结构了属于是 本题的思路和题解还是差不多的 暴力枚举灯和海盗乱搞即可 但是最后对fif_ifi​的维护我使用了树状数组&#xff0c;凭空多了个log… 尽管树状数组跑的飞快 其实直接倒着扫一遍就行了 特殊数据下我这个算法是可以跑满n方log1e6的 过2000我在想peach…

[LCT动态树] [NOI2014]魔法森林,[ZJOI2018]历史

[NOI2014] 魔法森林 题目 按照aaa精灵从小到大排序 按顺序插入每一条边 加入第iii条边后的最小代价为a[i]a[i]a[i]加上从111到nnn的所有路径中最大bbb最小的路径代价 维护边权 把边在LCTLCTLCT中理解为点&#xff1f;——看题解代码其实就是建虚点 出现环时 选择最大的bb…

《小团队构建大网站:中小研发团队架构实践》送书活动结果公布

截止到1月25日24&#xff1a;00&#xff0c;本次送书活动共收到75位同学参与回复&#xff0c;本次很多同学在看到活动的书十年IT老兵带你通过案例学架构&#xff0c;附C#代码&#xff0c;自行就到各大网络商店上购买了书&#xff0c;据反馈这个书很不错.下面把Top 2的留言截图给…

P6466-分散层叠算法(Fractional Cascading)【模板】

正题 题目链接:https://www.luogu.com.cn/problem/P6466 题目大意 给出kkk个长度为nnn的有序序列&#xff0c;qqq次询问给出xxx&#xff0c;求所有序列中xxx的后继的异或和。 强制在线 1≤k≤100,1≤n≤104,1≤q≤51051\leq k\leq 100,1\leq n\leq 10^4,1\leq q\leq 5\times…

11.13模拟:总结

文章目录总结题目update&#xff08;solution of T3&#xff09;&#xff1a;代码230pts100100300总结 不要先入为主&#xff01;如果某种算法受阻&#xff0c;要尝试一下别的路子&#xff01;&#xff01; 本次的主要问题&#xff1a; T2花费时间略长&#xff08;指2h&#…

Strategic game(树的最小点覆盖)

Strategic game 题意&#xff1a; 一个树&#xff0c;在一个节点放兵&#xff0c;周围的边就被守护&#xff0c;守护所有的边&#xff0c;问最少放多少兵 题解&#xff1a; 这种问题又称树的最小点覆盖 dp[x][1]以x为根的子树全被看住且在x上放置士兵的最少所需的士兵数量 …

test6 3-21 2021省选模拟赛six

文章目录考试复盘rnglgpm考试复盘 第一题&#xff0c;乍一看期望&#xff0c;又不会做了&#xff0c;乍二看&#xff0c;暴力好像可以202020跑路&#xff0c;屁颠屁颠敲完死活过不了这个简单的样例&#xff1b;开始(⊙⊙?)乍三看&#xff0c;实数&#xff1f;&#xff1f;完了…

如何为 .NET Core CLI 启用 TAB 自动补全功能

Intro在 Linux 下经常可以发现有些目录/文件名&#xff0c;以及有些工具可以命令输入几个字母之后按 TAB 自动补全&#xff0c;最近发现其实 dotnet cli 也可以&#xff0c;从.NET Core 2.0 SDK 开始&#xff0c;NET Core CLI 支持 tab 自动补全。你如果已经装了 dotnet Core S…

P8215-[THUPC2022 初赛]分组作业【网络流】

正题 题目链接:https://www.luogu.com.cn/problem/P8215 题目大意 有2n2\times n2n个人&#xff0c;第2i−12\times i-12i−1和第2i2\times i2i个人一组&#xff0c;然后每个人可以选择愿不愿意合作&#xff0c;愿意需要付出cic_ici​代价&#xff0c;不愿意是did_idi​代价&…

.NET IdentityServer4实战-开篇介绍与规划

一.开篇寄语由于假期的无聊&#xff0c;我决定了一个非常有挑战性的活动&#xff0c;也就是在年假给大家带来一个基于OAuth 2.0的身份授权框架&#xff0c;它就是 IdentityServer4 &#xff0c;如果没有意外的话&#xff0c;一定可以顺利的写完的&#xff0c;如果两天写一篇的话…

CF1408G:Clusterization Counting(区间dp、克鲁斯卡尔重构树)

解析 很妙的一道题 看这两个南辕北辙的标签就知道这题不简单 看见dp思路还是得打开 一开始其实想到按边权排序了 但卡在了重构树上 遇到dp一定要敢想 勇于和图论等结合 考虑正解 按照边权升序排序 依次加边到图中 并查集维护连通性和集合内的边数 发现&#xff0c;一个联通块…

test5 3-20 2021省选模拟赛five

考试复盘 第一题&#xff1f;&#xff1f;是个什么互动哦&#xff0c;直接乱来的(&#xffe3;&#xffe3;)σ…(&#xff3f;&#xff3f;)ノ&#xff5c;壁 第二题是前几天考过的&#xff0c;所以知道是polyapolyapolya&#xff0c;但是式子推到最后的二项式定理没推对&am…

Cell Phone Network

Cell Phone Network 题意: 每个牧场的电塔可以覆盖与该牧场相邻的电塔&#xff0c;为了让所有牛都可以打电话&#xff0c;求建的电塔的最小数量 题解&#xff1a; 树的最小支配集 dp[x][0]&#xff1a;选点i&#xff0c;并且以点i为根的子树都被覆盖 dp[x][1]&#xff1a;不…

P8207-[THUPC2022 初赛]最小公倍树【Kruskal】

正题 题目链接:https://www.luogu.com.cn/problem/P8207 题目大意 有编号为[L,R][L,R][L,R]区间的点&#xff0c;连接两个点x,yx,yx,y边权的为LCM(x,y)LCM(x,y)LCM(x,y)&#xff0c;求这张图的最小生成树。 1≤L≤R≤106,R−L≤1051\leq L\leq R\leq 10^6,R-L\leq 10^51≤L≤…

微信小程序开发必看,《使用 .NET Core + DevOps 开发微信跨平台应用》,苏州.NET俱乐部课程分享...

【课程名称】《使用 .NET Core DevOps 开发微信跨平台应用》【老师介绍】苏震巍&#xff0c;苏州盛派网络CEO&#xff0c;微软最有价值专家&#xff08;MVP&#xff09;、微软 Ignite 技术大会讲师&#xff0c;Senparc.Weixin作者&#xff0c;《微信开发深度解析》等书作者。苏…