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 & ...
随机推荐
- 获取公网ip,获取用户城市地址
<?php class GetIp { public static $api = 'http://ip.taobao.com/service/getIpInfo.php?ip='; public ...
- 利用纯代码写出一个秒表表盘的方法 —— #DF
@interface ViewController () @property (nonatomic, strong) CALayer *secLayer; // 秒针layer @property ( ...
- mysql处理警告 Warning: Using a password on the command line interface can be insecure.
vim /etc/mysql/my.cnf [mysqldump] user=user_name password=password 格式: [只用密码的命令] user=用户名 password=密 ...
- 网管必须必须知道的知识!ARP攻击与欺骗的原理!
ARP攻击与ARP欺骗原理及应用 1.ARP概述以及攻击原理 2.ARP欺骗原理 3.ARP故障处理 1.什么是ARP协议?将一个已知的IP地址解析成MAC地址.无论是ARP攻击还是ARP欺骗,它们都 ...
- Linux 源码安装Ansible 参考篇
Ansible 源码搭建配置 近期在学习自动化运维相关技术,文章主要模拟内网情况下对Ansible的安装演示,源码安装较为繁琐.枯燥,尤其是在实际安装过程中可能出现各式各样的问题,所有在安装过程中尽量 ...
- webhook触发jenkins进行sonar检测
目的 jenkins仅需创建一个job,git推送后自动进行sonar代码检测并上传到sonarqube jenkins插件 已按社区推荐安装基本插件 Generic Webhook Trigger ...
- P1015 [NOIP1999 普及组] 回文数
点击查看题目 题目描述 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数. 例如:给定一个十进制数 5656,将 5656 加 6565(即把 5656 从右向左读),得到 ...
- log4j和lockback的比较,二者可否同时使用
一.log4j和logback的介绍 log4j: 可以控制日志信息输送的目的地是控制台.文件.GUI组件,甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护进程等:可以控制每一条日志的 ...
- [VSCode] Todo Tree VSCode插件 待办事项树
Todo Tree 一款待办事项插件 我们写程序的时候,难免会遇到一些情况需要标记或者搁置,在写代码的时候会用一些特殊的注释来表示不同的内容,使我们可以快速的定位我们注释的位置. 主要有以下几种: T ...
- Nacos2.X源码阅读总结
前言 Nacos是一个Alibaba出品的高性能微服务时代产出的组件,集注册和配置中心为一体.那么Nacos为什么这么高性能呢?总结以下几点: 1:基于阿里自研的distro协议进行Nacos把不同节 ...