某位寄吧的故事

下文的 \(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. iOS中属性 (nonatomic, copy, strong, weak)的使用 By hL

    以下内容来自Stackflow的详解 1.Nonatomicnonatomic is used for multi threading purposes. If we have set the non ...

  2. Git配置多个github账号免密登录

    在公司开发中,有时候会存在公司账户跟私人账户共存,并随时需要切换的情况,这种情况下git可以配置多个ssh-key,无缝切换账号. 假如有两个github账号,一个是私人github账号,一个是公司g ...

  3. 基于单XCVU9P+双DSP C6678的双FMC接口 100G光纤传输加速计算卡

    一.板卡概述 板卡包括一片Xilinx FPGA  XCVU9P,两片 TI 多核DSP TMS320C6678及其控制管理芯片CFPGA.设计芯片满足工业级要求. FPGA VU9P 需要外接4路Q ...

  4. Solution -「NOI 2012」「洛谷 P2050」美食节

    \(\mathcal{Description}\)   Link.   美食节提供 \(n\) 种菜品,第 \(i\) 种的需求量是 \(p_i\),菜品由 \(m\) 个厨师负责制作,第 \(j\) ...

  5. html特殊字符(css3 content)

    由于偶尔用到,又经常忘记,所以把网上的资料考下来记录一下. <!DOCTYPE html> <html lang="en"> <head> &l ...

  6. 通过Dapr实现一个简单的基于.net的微服务电商系统(十八)——服务保护之多级缓存

    很久没有更新dapr系列了.今天带来的是一个小的组件集成,通过多级缓存框架来实现对服务的缓存保护,依旧是一个简易的演示以及对其设计原理思路的讲解,欢迎大家转发留言和star 目录:一.通过Dapr实现 ...

  7. 2020年的第一天-我的IDEA出现This license ... has been cancelled

    IDEA激活在1月3日的早上,激活码被取消了.提示:This license ... has been cancelled. 经过查询.解决方法教程无非是. ¥%--&*(激活码... 210 ...

  8. 对于计算正确率时 logits.argmax(dim=1),torch.eq(pre_label,label)

    额  好像是一句非常简单的代码 ,但是作为新手 ,我是完全看不懂哎 前十眼. 首先 这里的logits是一个 (a,b)维的张量.其中a是你的全连接输出维度,b是一个batch中的样本数量. 我们经过 ...

  9. Install VMware Tools in CentOS 7 command line mode

    1.首先启动CentOS 7,在VMware中点击上方"VM",点击"Install VMware Tools..."(如已安装则显示"Reinsta ...

  10. 企业环境下用脚本设置ubuntu防火墙

    ubuntu防火墙设置 初始状态下直接设置即可,尽量不要尝试 重装 iptables 以及ufw,很容易导致 防火墙崩掉,最后可能只能重装系统. 配置脚本 firewall.sh #/bin/bash ...