ABC237题解
2025-01-13 ABC237
F. |LIS|= 3
题意:
数列
求满足要求的数列的个数。答案对
解法:
一道 dp,状态设计比较高妙。
设
最终答案即为
G. Range Sort Query
题意:
有一个长
有 1 l r
将区间 2 l r
将区间
输出操作完
解法:
并没有想到,也没做过 P2824,看了题解才会……但是确实是很高妙的方法。
由于题目所求的是
考虑令
具体来说,统计区间和,把左侧或右侧区间修改为
但是我们无法就此得到
Code (C++)
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define il inline
#define pb push_back
#define ls (nw<<1)
#define rs ((nw<<1)|1)
#define mid ((l+r)>>1)
const int N=2e5+10;
int n,a[N],num;
struct Segment_Tree{
int t[N<<2],lz[N<<2];
il void pu(int nw){t[nw]=t[ls]+t[rs];}
il void pd(int l,int r,int nw){
if(lz[nw]==1){
t[ls]=mid-l+1,t[rs]=r-mid;
lz[ls]=lz[rs]=1;
lz[nw]=0;
}
else if(lz[nw]==-1){
t[ls]=t[rs]=0;
lz[ls]=lz[rs]=-1;
lz[nw]=0;
}
}
void bild1(int l,int r,int nw){
if(l==r){
if(a[l]<num)t[nw]=0;
else t[nw]=1;
return;
}
bild1(l,mid,ls);bild1(mid+1,r,rs);
pu(nw);
}
void bild2(int l,int r,int nw){
lz[nw]=0;
if(l==r){
if(a[l]<=num)t[nw]=0;
else t[nw]=1;
return;
}
bild2(l,mid,ls);bild2(mid+1,r,rs);
pu(nw);
}
void modify(int l,int r,int s,int e,int nw,int op){
if(l>r || r<s || l>e)return;
if(s<=l && r<=e){
if(op==1)t[nw]=r-l+1,lz[nw]=1;
else t[nw]=0,lz[nw]=-1;
return;
}
pd(l,r,nw);
if(mid>=s)modify(l,mid,s,e,ls,op);
if(mid<e)modify(mid+1,r,s,e,rs,op);
pu(nw);
}
int sum(int l,int r,int s,int e,int nw){
if(r<s || l>e || l>r)return 0;
if(s<=l && r<=e)return t[nw];
pd(l,r,nw);
return sum(l,mid,s,e,ls)+sum(mid+1,r,s,e,rs);
}
}t;
struct QQ{
int c,l,r;
}q[N];
int Q;
int dy1[N],dy2[N];
void dy(int l,int r,int nw){
if(l==r){dy1[l]=t.t[nw];return;}
t.pd(l,r,nw);
dy(l,mid,ls);
dy(mid+1,r,rs);
}
void dyy(int l,int r,int nw){
if(l==r){dy2[l]=t.t[nw];return;}
t.pd(l,r,nw);
dyy(l,mid,ls);
dyy(mid+1,r,rs);
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(nullptr);
cin>>n>>Q>>num;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=Q;i++)cin>>q[i].c>>q[i].l>>q[i].r;
t.bild1(1,n,1);
for(int i=1;i<=Q;i++){
int cnt=t.sum(1,n,q[i].l,q[i].r,1);
if(q[i].c==1){
t.modify(1,n,q[i].l,q[i].r-cnt,1,0);
t.modify(1,n,q[i].r-cnt+1,q[i].r,1,1);
}
else{
t.modify(1,n,q[i].l,q[i].l+cnt-1,1,1);
t.modify(1,n,q[i].l+cnt,q[i].r,1,0);
}
}
dy(1,n,1);
for(int i=0;i<N<<2;i++)t.t[i]=t.lz[i]=0;
t.bild2(1,n,1);
for(int i=1;i<=Q;i++){
int cnt=t.sum(1,n,q[i].l,q[i].r,1);
if(q[i].c==1){
t.modify(1,n,q[i].l,q[i].r-cnt,1,0);
t.modify(1,n,q[i].r-cnt+1,q[i].r,1,1);
}
else{
t.modify(1,n,q[i].l,q[i].l+cnt-1,1,1);
t.modify(1,n,q[i].l+cnt,q[i].r,1,0);
}
}
dyy(1,n,1);
for(int i=1;i<=n;i++){
if(dy1[i]!=dy2[i]){
cout<<i;
return 0;
}
}
cout<<-1;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端