当前位置: 首页 > news >正文

P13274 [NOI2025] 三目运算符

P13274 [NOI2025] 三目运算符

提供一个不同的线段树实现。


根据题目我们知道,\(s_i\) 变换后的值仅与 \(s_{i-2},s_{i-1},s_i\) 有关。考虑这三个数的 \(2^3\) 种取值,我们发现只有 101110 会使 \(s_i\) 发生变化。

进一步分析:

  • 101 会使 \(s_i\) 变成 \(0\),这一段不会再变化。

  • 110

    • 1100 会变成 1110
    • 1101 会变成 1110

    换句话说,110 相当于把当前的 \(0\) 向后推了一位。

    这样一路推到最后,如果记 110 的起始位置为 \(p\),则操作次数就是 \(n-p-1\)

综上我们可以得到答案:\(\max([\text{存在 }\texttt{101}],n-p_{\min}-1)\)


我们可以用线段树来动态维护。

我们可以将相邻的三个数压成一个 \([0,7]\) 的整数,扔到大小为 \(n-2\) 的线段树里。

这样我们仅需维护:

  • 是否存在一个位置存有 101
  • 是否存在一个位置存有 010
  • 存有 110 的最小位置。
  • 存有 001 的最小位置。

查询直接查根节点就行了。

修改操作,我们可以转化为区间异或 7,但是因为我们只在叶子节点维护值,所以没必要这样做。直接将需要修改的区间的第 \(1,2\) 条交换,第 \(3,4\) 条交换即可。

需要注意的是,对于 \(l-2,l-1,r-1,r\),它们管辖的区间的修改操作不是完整的。不能参与区修,需要单独点修处理一下。

另外注意特殊处理 \(l=r\) 的情况。

时间复杂度 \(O(T(n+q\log n))\)

码量相比其他题解的做法小了不少。但是受限于能力,还是实现得不怎么好看。权且提供这样一个思路~

点击查看代码
#include<bits/stdc++.h>
#define lc (x<<1)
#define rc (x<<1|1)
using namespace std;
typedef long long ll;
const int N=4e5+5;
int c,t,n,q;ll ans;
string s;
struct SEG{int c[N<<2],p[2][N<<2];bitset<N<<2> tg,a[2];inline int calc(){return max(int(a[0][1]!=0),n-p[0][1]-1);}inline void init(int x,int c,int l){a[0][x]=(c==5),a[1][x]=(c==2);p[0][x]=(c==6?l:1e9),p[1][x]=(c==1?l:1e9);}inline void upd(int x){a[0][x]=a[0][lc]|a[0][rc],a[1][x]=a[1][lc]|a[1][rc];p[0][x]=min(p[0][lc],p[0][rc]),p[1][x]=min(p[1][lc],p[1][rc]);}inline void pushdown(int x){if(tg[x]) tg[x]=0,mktg(lc),mktg(rc);}inline void mktg(int x){tg[x]=tg[x]^1,a[0][0]=a[0][x],a[0][x]=a[1][x],a[1][x]=a[0][0],swap(p[0][x],p[1][x]);}inline void build(int x,int l,int r){tg[x]=0;if(l==r){init(x,c[x]=((s[l-1]&1)<<2)|((s[l]&1)<<1)|(s[l+1]&1),l);return;}int mid=(l+r)>>1;build(lc,l,mid),build(rc,mid+1,r),upd(x);}inline void chp(int x,int p,int v,int l,int r){if(l==r){c[x]^=v;if(tg[x]) tg[x]=0,init(x,c[x]^=7,l);else init(x,c[x],l);return;}int mid=(l+r)>>1;pushdown(x);if(p<=mid) chp(lc,p,v,l,mid);else chp(rc,p,v,mid+1,r);upd(x);}inline void chr(int x,int a,int b,int l,int r){if(a<=l&&r<=b) return mktg(x),void();int mid=(l+r)>>1;pushdown(x);if(a<=mid) chr(lc,a,b,l,mid);if(b>mid) chr(rc,a,b,mid+1,r);upd(x);}
}seg;
inline void chp(int x,int v){if(x>0&&x<n-1) seg.chp(1,x,v,1,n-2);}
signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>c>>t;while(t--){cin>>n>>q>>s;seg.build(1,1,n-2);ans=seg.calc();for(int i=1,l,r;i<=q;i++){cin>>l>>r;if(l==r) chp(l,4),chp(l-1,2),chp(l-2,1);else{if((l+1)^r) seg.chr(1,l,r-2,1,n-2);chp(r,4),chp(r-1,6),chp(l-1,3),chp(l-2,1);}ans^=1ll*(i+1)*seg.calc();}cout<<ans<<"\n";}return 0;
}
http://www.gsyq.cn/news/18360.html

相关文章:

  • B2002 Hello,World!【入门】
  • 华为链路聚合配置
  • iOS 26 软件性能测试全流程,启动渲染资源压力对比与优化策略 - 详解
  • 手机adb 调试自己
  • 2025 年公共/商场/学校/地铁/电影院/会所/机场/卫生间隔断厂家选购指南:优质厂商推荐与实用选择策略
  • Java环境安装备忘录
  • 详细介绍:标准型ELN成主流:定制型为何“遇冷”?
  • 【Linux】Ext系列文件系统(下) - 实践
  • 2025 年水产养殖降氨氮亚盐厂家最新推荐排行榜 ,助力北方对虾鱼塘螃蟹池塘养殖户轻松选购优质产品
  • 2025 年玻璃钢水箱生产厂家最新推荐榜单:含 30 吨 / 订做 / 消防 / 方形 / 拼装式 / 屋顶 / 大型产品,从产能与服务双维度精选优质企业
  • crontab 定时执行python脚本失败,但手动执行却成功问题处理 - hello-*
  • 2025 年不锈钢水箱厂家最新推荐榜:优质厂家实力对比与选购指南,助您选到适配设备矩形/屋顶/定做方形不锈钢水箱厂家推荐
  • 实用指南:Java 后端面试技术文档(参考)
  • 2025 年钢结构厂家最新推荐榜:优质企业全面解析,助力客户精准选择可靠合作伙伴
  • 2025规划馆运营厂家 TOP 榜:苏州金梓树智能科技,专注场馆全周期服务,规划馆运维优质服务商推荐!
  • 2025 高温线缆厂家 TOP 榜:奇温线缆 (上海) 有限公司,专注特种高温领域,定制化高温线缆源头厂家推荐!
  • OI 笑传 #17
  • 实用指南:Python Tkinter构建交互式精灵表切割桌面应用程序:将精灵表分割成单个帧的功能
  • 题解:qoj7979 棋盘
  • 2025 年最新推荐微波干燥设备生产厂家排行榜,覆盖多行业高效干燥解决方案权威推荐黄粉虫/黑水虻/中药材/茶叶微波干燥设备厂家推荐
  • 控制台
  • 2025 年最新三维扫描仪厂家权威排行榜:聚焦高精度与多场景适配,为企业与个人用户精选优质品牌推荐高精度/专业/手持激光/工业/便携式三维扫描仪厂家推荐
  • 2025 年最新推荐!国内优质充电桩厂家排行榜,涵盖多场景适配产品,助用户精准选靠谱品牌智能/新能源/电动车/重卡/电动车直流充电桩厂家推荐
  • 实用指南:【图像算法 - 28】基于YOLO与PyQt5的多路智能目标检测系统设计与实现
  • 常用接口对比
  • 工具网站网址
  • 2025 电缆回收推荐榜:广州龙耀 5 星领跑,这些企业适配绿色循环需求
  • MOE模型
  • 2025航空插头厂家最新推荐榜:M8 航空插头, m12航空插头, 航空插头公母对接, 航空插头5芯, 航空插头三芯, 航空插头4芯, 航空插头12芯等类型全覆盖,专业定制与可靠品质
  • 如何反制免费项目管理软件的套路