首页 > 其他分享 >AT_abc262_h [ABC262Ex] Max Limited Sequence 题解

AT_abc262_h [ABC262Ex] Max Limited Sequence 题解

时间:2024-12-01 23:10:20浏览次数:6  
标签:Limited Sequence int 题解 ll mxn ans size define

首先容易确定每个位置的上界,接下来考虑对每种上界分别求方案数,再乘起来。

对每一种上界将其对应的位置提出来,由于是区间 \(\max\),只需要关注每个位置的值是否到达这个上界 \(x\)。枚举一个前缀,考虑维护 \(f_i\) 表示最后一个达到上界位置为 \(i\),确定完这个前缀中所有数的方案数。考虑确定当前枚举到的数 \(p\):

  1. \(<x\),则将所有 \(f_i\leftarrow f_i\cdot (x-1)\)。
  2. \(=x\),则将 \(f_p\leftarrow f_p+\sum f_i\)

接下来只需要处理掉区间的限制,对于一个右端点为 \(p\) 的区间 \([l,p]\),此时 \(\forall i<l,f_i\leftarrow 0\) 即可,时间复杂度 \(\mathcal O(n\log n)\),线段树或者双指针都可以实现。

参考代码:

#include<bits/stdc++.h>
#define ll long long
#define mxn 200003
#define md 998244353
#define pb push_back
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define rept(i,a,b) for(int i=(a);i<(b);++i)
#define drep(i,a,b) for(int i=(a);i>=(b);--i)
using namespace std;
struct node{
	int l,r,x;
}d[mxn];
int n,m,q,a[mxn],c[mxn];
vector<int>p[mxn],s1[mxn],s2[mxn];
vector<node>as[mxn];
multiset<int>s;
ll ans=1,t[mxn<<2],f[mxn<<2];
void build(int p,int l,int r){
	t[p]=!l,f[p]=1;
	if(l==r)return;
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
}
inline void tag(int p,ll x){
	t[p]=t[p]*x%md,f[p]=f[p]*x%md;
}
inline void push_down(int p){
	if(f[p]!=1){
		tag(p<<1,f[p]),tag(p<<1|1,f[p]);
		f[p]=1;
	}
}
void add(int p,int x,int y,int l,int r){
	t[p]=(t[p]+y)%md;
	if(l==r)return;
	int mid=(l+r)>>1;
	push_down(p);
	if(x<=mid)add(p<<1,x,y,l,mid);
	else add(p<<1|1,x,y,mid+1,r);
}
void upd(int p,int l,int r,int L,int R){
	if(l<=L&&R<=r){t[p]=f[p]=0;return;}
	int mid=(L+R)>>1;
	push_down(p);
	if(l<=mid)upd(p<<1,l,r,L,mid);
	if(r>mid)upd(p<<1|1,l,r,mid+1,R);
	t[p]=(t[p<<1]+t[p<<1|1])%md;
}
void solve(int x){
	rept(i,0,p[x].size())c[i]=-1;
	for(node i:as[x]){
		int l=lower_bound(p[x].begin(),p[x].end(),i.l)-p[x].begin(),r=upper_bound(p[x].begin(),p[x].end(),i.r)-p[x].begin()-1;
		if(l>r){
			puts("0");
			exit(0);
		}
		c[r]=max(c[r],l);
	}
	build(1,0,p[x].size());
	rept(i,0,p[x].size()){
		ll s=t[1];tag(1,a[x]);
		add(1,i+1,s,0,p[x].size());
		if(c[i]>=0)upd(1,0,c[i],0,p[x].size());
	}
	ans=ans*t[1]%md;
}
signed main(){
	scanf("%d%d%d",&n,&m,&q);
	for(int i=0,l,r,x;i<q;++i){
		scanf("%d%d%d",&l,&r,&x);
		s1[l].pb(x),s2[r+1].pb(x);
		d[i]={l,r,x};
		a[i]=x;
	}
	a[q]=m;sort(a,a+q+1);
	rep(i,1,n){
		for(int j:s1[i])s.insert(j);
		for(int j:s2[i])s.erase(s.find(j));
		int mx=s.size()?*s.begin():m;
		p[lower_bound(a,a+q+1,mx)-a].pb(i);
	}
	rept(i,0,q)as[lower_bound(a,a+q+1,d[i].x)-a].pb(d[i]);
	rep(i,0,q)if(as[i].size()||p[i].size())solve(i);
	cout<<ans;
	return 0;
}

标签:Limited,Sequence,int,题解,ll,mxn,ans,size,define
From: https://www.cnblogs.com/zifanoi/p/18580589

相关文章

  • CF2034 A-E题解
    A.KingKeykhosrow'sMystery题意可以转化为存在\(k_1,k_2\)使得\(m=a\timesk_1+n=b\timesk_2+n\)。消去余数\(n\)得到\(a\timesk_1=b\timesk_2\),即\(a,b\)的公倍数。所以最小的\(m\)就是\(a,b\)的最小公倍数,余数为0。最小公倍数的计算方法是\(\text{lcm}(......
  • [CF603E] Pastoral Oddities 题解
    注意力惊人的注意到我们可以将问题转化为所有联通块大小全部为偶数。假如已经确认了所有加入的边,那么我们可以通过类似\(K\)算法的方式求解。考虑到答案单调不升,所以每条边都有一个影响的区间。考虑线段树分治。我们倒序枚举,遇到要加入的边,若当前时间为\(t\),边的加入时间为......
  • 【学校训练记录】12月个人训练赛1个人题解
    A对于n本书拿出k本较为难实现,但是从n本书里拿出n-k本就容易多了对于n本书里拿一本为特殊情况,不管怎么拿都为0对于n本书里拿n-k本的话,我们假设拿的最后一本为i那么他就是拿出n-k-1本书的情况再加上拿出第i本的情况其中差值变化为拿出n-k-1本书的值,加上我abs(w[i]-w[j])(j为拿......
  • odoo18运行报错问题解决
    File"/Users/melon/.pyenv/versions/3.11.9/lib/python3.11/code.py",line90,inruncodeexec(code,self.locals)File"<input>",line1,in<module>File"/Applications/PyCharm.app/Contents/plugins/python/helpers/p......
  • P11024 [COTS 2020] 定序 Redoslijed 题解
    先把是否有色的约束处理掉。累一个前缀和,对每个位置判一下即可。考察区间覆盖的性质,显然最后一个操作的区间内的颜色一定与其覆盖的颜色相同。考虑从后往前确定操作的顺序,一个操作只要满足这个条件就可以作为当前的最后一个操作,如果有多个满足条件的操作,随便取一个都合法。考虑......
  • 【题解】ABC382D Keep Distance
    题目描述你需要求出所有长度为\(n\),且满足以下条件的序列的个数,并按照字典序输出:首项大于等于\(1\),每一项比前一项至少大\(10\),最后一项小于等于\(m\)。题目分析爆搜,用vector存储答案和个数,输出。代码实现#include<iostream>#include<algorithm>#include<vector......
  • 洛谷P1880 [NOI1995] 石子合并 题解
    此题解以纪念我终于差不多大概搞懂区间dp了(插个存档点,到时候忘了再回来看看)。P1880[NOI1995]石子合并题解在做这道题之前,可以看看P1775石子合并(弱化版)(一道题解帮你搞定两道题,多划算)。P1775石子合并(弱化版)形式化的题面一堆石头摆在你面前,让你把他们扔到一起,每次扔......
  • 【Q1~Q6题解】第七届传智杯全国IT技能大赛-程序设计赛道第一场院校赛(初赛)思路+解题代
    本文为作者的题解解析。Q1~Q6,思路仅供参考文章目录Q1:汤姆和杰瑞解题代码解题思路Q2:游游的重组偶数解题代码解题思路Q3:小红的四子棋解题代码解题思路Q4:小欧的平面连线解题代码解题思路Q5:小红的数组操作解题代码解题思路Q6:游......
  • 国产化硬件系统上,部署视频监控平台系统软件出现的脚本问题解决
    目录一、问题描述二、解决方法        1、检查部署脚本权限        2、检查脚本中语法是否有问题        3、使用tee命令对文件进行修改        4、查看银河麒麟系统的安全设置        在国产系统银河麒麟硬件设备上部署视频......
  • P1135 奇怪的电梯 JAVA题解
    题目描述呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第 ii 层楼(1≤i≤N1≤i≤N)上有一个数字 KiKi​(0≤Ki≤N0≤Ki​≤N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例......