LGP4229题解
某位寄吧的故事
下文的 \(m\) 即为题面中的 \(Q\)。
离散化,把序列变成 \(O(2m)\) 个部分,然后对这 \(O(2m)\) 个部分把最大值求出来,每次把最大值相同的部分拉出来,再把限制和这个最大值相同的也拉出来。我们假装这个最值叫 \(c\)。
然后是 \(dp\)。\(dp[n][k]\) 表示推到第 \(n\) 段,上一个最大值在第 \(k\) 段时的合法方案数量。
注意到如果两个区间有包含关系,那么大的那个区间相当于不存在。
设 \(L[n]\) 表示右端点在第 \(n\) 段的区间中,左端点最靠右的那个左端点。如果没有那就是 \(0\)。没说就是零卡
然后设 \((l[n],r[n]]\) 为第 \(n\) 段区间在原序列上的左右端点。
不难发现这题其实是 P5204 的加强版(雾)
\]
\]
游戏结束。
复杂度 \(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题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- 用curl发起https请求
使用curl发起https请求 使用curl如果想发起的https请求正常的话有2种做法: 方法一.设定为不验证证书和host. 在执行curl_exec()之前.设置option $ch = cur ...
- 自定义的类实现copy操作
1.自定义类实现copy操作 让类遵守NSCopying协议 实现 copyWithZone:方法,在该方法中返回一个对象的副本即可. 在copyWithZone方法中,创建一个新的对象,并设置该对象 ...
- js变量类型判断 严格通用 Object.prototype.toString.call()
Object.prototype.toString.call()判断结果: Object.prototype.toString.call(true) "[object Boolean]&qu ...
- 红色小圆点+数字的badge自定义小方法 by Nicky.Tsui
效果如图. 实现方法比较简单,在view上增加一个label label设置: 1 badgeLabel = [[UILabel alloc]initWithFrame:CGRectMake(CGRe ...
- 在Linux中设置php变量的方法
默认情况下已经安装好了PHP环境,并且知道安装好后的PHP文件路径,然后可以通过以下的方式设置PHP变量,快速执行PHP命令运行PHP文件. 环境:centos 第一步:vi ~/.bash_prof ...
- Deformable Templates For Eye Detection
1 Abstract This approach was published On "Deformable Templates for Face Recognition" by A ...
- 【Azure 应用服务】部署Jar到App Service for Linux,因启动命令路径配置错误而引起:( Application Error 问题
问题描述 App Service for Linux 资源创建完成后,通过FTP方式把 .jar包(logdemo.jar)包上传到 /site/wwwroot/ 文件夹后,在App Service的 ...
- jdk、jre、jvm分别是什么?有什么联系?
JDK:是Java Development Kit的缩写,是Java的开发工具包,JDK是整个JAVA的核心.它提供了编译.运行Java程序所需的各种工具和资源.有了它,Java开发者就可以编译和运行 ...
- IMIX功能测试——网络测试仪实操
在真实的网络环境中,用户产生的网络数据报文的长度并不是固定的,也就要求我们在评估DUT转发能力时,不能仅仅测试固定长度的报文,而是需要测试多种不同报文长度的组合. 信而泰RENIX测试仪中的iMIX报 ...
- 为什么说国产BI更适合国内企业?
就算国外BI发展迅速,产品更加完善成熟,但对国内的企业来说,使用起来难免"水土不服",何况还有服务对接过程中的繁琐程.今天就来讨论一下,国内BI和国外BI到底该怎么选择? 国外B ...