某位寄吧的故事

下文的 \(m\) 即为题面中的 \(Q\)。

离散化,把序列变成 \(O(2m)\) 个部分,然后对这 \(O(2m)\) 个部分把最大值求出来,每次把最大值相同的部分拉出来,再把限制和这个最大值相同的也拉出来。我们假装这个最值叫 \(c\)。

然后是 \(dp\)。\(dp[n][k]\) 表示推到第 \(n\) 段,上一个最大值在第 \(k\) 段时的合法方案数量。

注意到如果两个区间有包含关系,那么大的那个区间相当于不存在。

设 \(L[n]\) 表示右端点在第 \(n\) 段的区间中,左端点最靠右的那个左端点。如果没有那就是 \(0\)。没说就是零卡

然后设 \((l[n],r[n]]\) 为第 \(n\) 段区间在原序列上的左右端点。

不难发现这题其实是 P5204 的加强版(雾)

\[dp[n][k]=[L[n]\leq k]dp[n-1][k]\times(c-1)^{r[n]-l[n]}
\]
\[dp[n][n]=\sum_{i=1}^{n-1}dp[n-1][i]\times(c^{r[n]-l[n]}-(c-1)^{r[n]-l[n]})
\]

游戏结束。

复杂度 \(O(m\log n)\)。

#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
typedef unsigned ui;
const ui M=505,mod=998244353;
ui n,m,A,s,k[M],V[M],tl[M],tr[M],l[M<<1],r[M<<1];ui len,lsh[M<<1];
std::vector<ui>c[M],q[M];
inline ui max(const ui&a,const ui&b){
return a>b?a:b;
}
inline ui min(const ui&a,const ui&b){
return a>b?b:a;
}
inline ui pow(ui a,ui b){
ui ans(1);for(;b;b>>=1,a=1ull*a*a%mod)if(b&1)ans=1ull*ans*a%mod;return ans;
}
inline ui Solve(const ui&k){
static ui L[M<<1],dp[M<<1],tag[M<<1];
const ui&v=V[k],&len=c[k].size();
for(ui i=0;i<len;++i)L[i]=0,tag[i]=1;
for(ui&id:q[k]){
const ui&l=std::lower_bound(c[k].begin(),c[k].end(),tl[id])-c[k].begin();
const ui&r=std::upper_bound(c[k].begin(),c[k].end(),tr[id])-c[k].begin()-1;
if(l<=r)L[r]=max(L[r],l);else return 0;
}
for(ui i=1;i<len;++i)L[i]=max(L[i],L[i-1]);
ui id(0),sum(1),mul(1);dp[0]=1;
for(ui i=1;i<len;++i){
while(id<L[i-1])mul=1ull*mul*tag[id]%mod,sum=(sum+1ull*(mod-mul)*dp[id++])%mod;
const ui&v1=pow(v-1,r[c[k][i]]-l[c[k][i]]),&v2=pow(v,r[c[k][i]]-l[c[k][i]]);
tag[L[i-1]]=1ull*tag[L[i-1]]*v1%mod;tag[i]=1ull*tag[i]*pow(v1,mod-2)%mod;
dp[i]=1ull*sum*(mod+v2-v1)%mod;sum=(1ull*sum*v1+dp[i])%mod;
}
while(id<L[len-1])mul=1ull*mul*tag[id]%mod,sum=(sum+1ull*(mod-mul)*dp[id++])%mod;
return sum;
}
struct sgt{
ui G,mx[M<<3];
inline void init(const ui&n){
for(G=1;G<=n+1;G<<=1);for(ui i=1;i<=n;++i)mx[G+i]=A;for(ui i=1;i<G;++i)mx[i]=0x7fffffff;
}
inline void Cover(ui l,ui r,const ui&V){
for(l+=G-1,r+=G+1;l^r^1;l>>=1,r>>=1){
if(~l&1)mx[l^1]=min(mx[l^1],V);
if(r&1)mx[r^1]=min(mx[r^1],V);
}
}
inline void pushdown(){
for(ui u=1;u<G;++u)mx[u<<1]=min(mx[u<<1],mx[u]),mx[u<<1|1]=min(mx[u<<1|1],mx[u]);
}
}SGT;
signed main(){
ui T;scanf("%u",&T);
while(T--){
ui ans(1);
scanf("%u%u%u",&n,&m,&A);len=0;lsh[++len]=0;lsh[++len]=n;
for(ui i=1;i<=m;++i)scanf("%u%u%u",tl+i,tr+i,k+i),--tl[i],lsh[++len]=tl[i],lsh[++len]=tr[i];
std::sort(lsh+1,lsh+len+1);len=std::unique(lsh+1,lsh+len+1)-lsh-1;s=len-1;
for(ui i=1;i<=s;++i)l[i]=lsh[i],r[i]=lsh[i+1];SGT.init(s);
for(ui i=1;i<=m;++i){
tl[i]=std::lower_bound(lsh+1,lsh+len+1,tl[i])-lsh;
tr[i]=std::lower_bound(lsh+1,lsh+len+1,tr[i])-lsh-1;
SGT.Cover(tl[i],tr[i],k[i]);
}
SGT.pushdown();len=0;
for(ui i=1;i<=m;++i)lsh[++len]=k[i];lsh[++len]=A;
std::sort(lsh+1,lsh+len+1);len=std::unique(lsh+1,lsh+len+1)-lsh-1;V[len]=A;
for(ui i=1;i<=len;++i)c[i].resize(1);
for(ui i=1;i<=m;++i){
const ui&id=std::lower_bound(lsh+1,lsh+len+1,k[i])-lsh;
q[id].push_back(i);V[id]=k[i];
}
for(ui i=1;i<=s;++i)c[std::lower_bound(lsh+1,lsh+len+1,SGT.mx[SGT.G+i])-lsh].push_back(i);
for(ui i=1;i<=len;++i)ans=1ull*ans*Solve(i)%mod,std::vector<ui>().swap(c[i]),std::vector<ui>().swap(q[i]);
printf("%u\n",ans);
}
}

LGP4229题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. 入门- k8s发布应用服务 (五)

    目标 了解 Kubernetes 的 Service(服务) 了解 Labels(标签)和 LabelSelector(标签选择器)与 Service(服务)的关系 在 kubernetes 集群中, ...

  2. Mac 使用自带php和Apache 安装配置Xdebug 开启本地调试模式

    Mac 安装配置php xdebug 本地调试 0.原理图 https://paper.seebug.org/308/ 测试demo构建方法 新建空白项目,目录选择Apache默认项目目录 1.下载x ...

  3. Jquery--1--选择器分类

    基本选择器 $("#id")            //ID选择器 $("div")            //标签选择器 $(".classname ...

  4. Java-基于JDK的动态代理

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11686615.html 简单的记录一下Java中自带动态代理的用法. 准备材料: 1.一个接口 ...

  5. 推荐一款仿iPhone桌面的代码. ___王朋.

    Demo:https://files.cnblogs.com/files/sixindev/LxGridView-master.zip 这是作者原来的效果图,很多东西还需要慢慢学习.作者用的很多类,根 ...

  6. 一招教你IDEA中Java程序如何打包,以及打包后如何运行

    前言 编写程序 程序打包 测试运行 IDEA作为目前按最主流的Java程序项目编写工具,越来越受到开发人员的青睐.idea因为其五花八门的功能,让你在开发过程中效率显著提高.那么对于初学者来说,如何通 ...

  7. Jetpack的ViewModel与LiveData

    本文基于SDK 29 一.ViewModel与LiveData的作用: 1.viewModel: 数据共享,屏幕旋转不丢失数据,并且在Activity与Fragment之间共享数据. 2.LiveDa ...

  8. Intellij IDEA出现java.lang.ClassNotFoundException: com.mysql.jdbc.Driver处理办法

    菜单-->File-->project structure-->Modules-->Dependencies-->添加MySQL的驱动包:mysql-connector- ...

  9. 【Mock平台】测试开发实战01-开篇PRD和需求详细

    微信搜索[大奇测试开],关注这个坚持分享测试开发干货的家伙. 平台背景 从业务特性上,不少测试的服务很多是依赖第三方的接口的,比如其中的支付场景,就需要很多状态的返回进行验证,但大部分服务提供商没有很 ...

  10. Dapp开发petshop——truffle官方例程

    truffle-pet-shop pet-shop是truffle的官方例程. 之前参考https://learnblockchain.cn/2018/01/12/first-dapp/的中文教程,但 ...