ARC115E-LEQ and NEQ【容斥,dp,线段树】
正题
题目链接:https://atcoder.jp/contests/arc115/tasks/arc115_d
题目大意
\(n\)个数字的序列\(x\),第\(x_i\in [1,A_i]\cap Z\)。要求相邻的不同,求方案数。
\(1\leq n\leq 5\times 10^5,1\leq A_i\leq 10^9\)
解题思路
考虑容斥,如果有\(k\)个相邻的相等那么容斥系数就是\((-1)^k\)。那我们把\(n\)分为若干个连续的相同段,然后每一段的容斥系数分开算就好了,这样就是一个可以\(dp\)的式子了。
设\(f_i\)表示以\(i\)结尾的段时的值,那么有转移方程
\]
这个\(min\{A_k\}\)每次加入一个新的时候会影响一个后缀,用单调栈找到这个后缀,然后把\(f_i\)丢进线段树里。
而那个容斥系数就是每次整个线段树乘上一个\((-1)\),这个丢到外面处理就好了。
时间复杂度\(O(n\log n)\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=5e5+10,M=N<<2,P=998244353;
ll n,a[N],q[N],f[N];
ll w[M],lazy[M],v[M];
void Downdata(ll x){
if(!lazy[x])return;
w[x*2]=v[x*2]*lazy[x]%P;
w[x*2+1]=v[x*2+1]*lazy[x]%P;
lazy[x*2]=lazy[x*2+1]=lazy[x];
return;
}
void Change(ll x,ll L,ll R,ll l,ll r,ll c){
if(L==l&&R==r){lazy[x]=c;w[x]=v[x]*c%P;return;}
ll mid=(L+R)>>1;Downdata(x);
if(r<=mid)Change(x*2,L,mid,l,r,c);
else if(l>mid)Change(x*2+1,mid+1,R,l,r,c);
else Change(x*2,L,mid,l,mid,c),Change(x*2+1,mid+1,R,mid+1,r,c);
w[x]=(w[x*2]+w[x*2+1])%P;v[x]=(v[x*2]+v[x*2+1])%P;return;
}
void Insert(ll x,ll L,ll R,ll pos,ll c){
if(L==R){v[x]=c;w[x]=c*lazy[x]%P;return;}
ll mid=(L+R)>>1;Downdata(x);
if(pos<=mid)Insert(x*2,L,mid,pos,c);
else Insert(x*2+1,mid+1,R,pos,c);
w[x]=(w[x*2]+w[x*2+1])%P;v[x]=(v[x*2]+v[x*2+1])%P;return;
}
signed main()
{
scanf("%lld",&n);
ll top=1;Insert(1,1,n,1,P-1);
for(ll i=1;i<=n;i++){
scanf("%lld",&a[i]);
while(top>0&&a[i]<a[q[top]])top--;
Change(1,1,n,q[top]+1,i,a[i]);q[++top]=i;
f[i]=(i&1)?(P-w[1]):w[1];
if(i!=n)Insert(1,1,n,i+1,P-w[1]);
}
printf("%lld\n",f[n]);
return 0;
}
ARC115E-LEQ and NEQ【容斥,dp,线段树】的更多相关文章
- HDU 5794 A Simple Chess (容斥+DP+Lucas)
A Simple Chess 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5794 Description There is a n×m board ...
- [CF1086E]Beautiful Matrix(容斥+DP+树状数组)
给一个n*n的矩阵,保证:(1)每行都是一个排列 (2)每行每个位置和上一行对应位置不同.求这个矩阵在所有合法矩阵中字典序排第几.考虑类似数位DP的做法,枚举第几行开始不卡限制,那么显然之前的行都和题 ...
- 【BZOJ3622】已经没有什么好害怕的了 容斥+DP
[BZOJ3622]已经没有什么好害怕的了 Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output ...
- $bzoj2560$ 串珠子 容斥+$dp$
正解:容斥+$dp$ 解题报告: 传送门$QwQ$ $umm$虽然题目蛮简练的了但还是有点难理解,,,我再抽象一点儿,就说有$n$个点,点$i$和点$j$之间有$a_{i,j}$条无向边可以连,问有多 ...
- ZOJ 3349 Special Subsequence 简单DP + 线段树
同 HDU 2836 只不过改成了求最长子串. DP+线段树单点修改+区间查最值. #include <cstdio> #include <cstring> #include ...
- hdu 3016 dp+线段树
Man Down Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- cf834D(dp+线段树区间最值,区间更新)
题目链接: http://codeforces.com/contest/834/problem/D 题意: 每个数字代表一种颜色, 一个区间的美丽度为其中颜色的种数, 给出一个有 n 个元素的数组, ...
- Codeforces Round #620 F2. Animal Observation (hard version) (dp + 线段树)
Codeforces Round #620 F2. Animal Observation (hard version) (dp + 线段树) 题目链接 题意 给定一个nm的矩阵,每行取2k的矩阵,求总 ...
- AGC 005D.~K Perm Counting(容斥 DP 二分图)
题目链接 \(Description\) 给定\(n,k\),求 满足对于所有\(i\),\(|a_i-i|\neq k\)的排列的个数. \(2\leq n\leq 2000,\quad 1\leq ...
随机推荐
- Specification排序orderby
废话不多说直接贴代码 Specification<Course> sf = new Specification<Course>() { @Override public Pre ...
- spring boot 的JPA项目
pom 文件 -------------------------------------------------------------------------- <dependencies&g ...
- asp.net MVC 数据的验证
join 操作
- 【java虚拟机】jvm调优原则
转自:https://www.cnblogs.com/xiaopaipai/p/10522794.html 合理规划jvm性能调优 JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考 ...
- RabbitMQ(二):交换机
前言 学习自bili尚硅谷-RabbitMQ 发布确认 之前的消息应答,队列持久化是为了保证 -> 消息从rabbitmq队列到消费者的过程中不会丢失:消息持久化则是为了保证 -> 消息从 ...
- 新东方APP技术架构演进, 分布式系统架构经验分享
今天的演讲题目是"新东方APP技术架构演进, C端技术经验分享" 作者:张建鑫, 曾任IBM高级软件架构师, 滴滴高级技术专家, 现任新东方集团高级技术总监 古代东西方的思想家都产 ...
- MySQL-存储引擎-Myisam
mysql> create table myisam_char(name char(10)) engine=myisam; Query OK, 0 rows affected (0.01 sec ...
- centos7 配置 ftp 服务器(本地用户)
2021-09-02 1. 安装 # 安装 vsftpd yum -y install vsftpd 2. 启动服务并添加到开机自启 # 启动 vsftpd systemctl start vsftp ...
- JavaScript——字符串——模板字符串
JavaScript--字符串--模板字符串 字符串可以用反引号包裹起来,其中的${expression}表示特殊的含义,JavaScript会将expression代表的变量的值和反引号中的其它普通 ...
- shell循环语句for
1.方式1 for i in {list[0]} {list[1]} .. do 执行命令 done 2.方式2(三要素循环) for (( 初始值; 判断值; 步长; )) do 执行命令 done