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

「SCOI2015」小凸解密码题解

一个数据结构题。

首先断环成链,发现对一个值修改只是修改了 4 个点,直接单点修改即可。

这里其实所有非零的值都是一样的,只用 0/1 来表示即可。

考虑查询,可以考虑二分最小长度,只要所有距离大于这个长度的这个区间内有符合条件的零串即可。

即我们需要去求一个区间内是否有被 1 包裹的 0 串,使用一个线段树即可。

#include<bits/stdc++.h>
using namespace std;
const int N=2E5+5;
int n,m,a[N],op[N],opt;struct node{int l,r,c,s;node(bool x=0){l=r=c=x,s=0;}node friend operator + ( node a, node b){node res(0);res.l = a.l ;res.r = b.r ;res.c = a.c + b.c ;res.s = a.s + b.s + (a.c && b.c && (!a.r || !b.l ));return res; } 
};struct SEGT{#define ls p<<1#define rs p<<1|1#define mid (l+r>>1) node c[N<<2];void pushup(int p){c[p]=c[ls]+c[rs];}void change(int p,int l,int r,int x,int w){if(l==r)return c[p]=node(w),void();if(x<=mid)change(ls,l,mid,x,w);else change(rs,mid+1,r,x,w);pushup(p);}node query(int p,int l,int r,int L,int R){if(R<L)return node(0);if(L<=l &&r<=R) return c[p];if(L<=mid && R>mid)return query(ls,l,mid,L,R) + query(rs,mid+1,r,L,R);if(L<=mid )return query(ls,l,mid,L,R);return query(rs,mid+1,r,L,R); }#undef mid 
}seg;
char s[2];
inline int calc(int x,int y,bool op){return op?(x*y%10):(x+y)%10; 
}
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d%s",a+i,s+1);op[i]=(s[1]=='*');a[i+n] = a[i],op[i+n]=op[i];}for(int i=2;i<=2*n;i++)seg.change(1,1,n*2,i,calc(a[i-1],a[i],op[i]));  while(m--){scanf("%d",&opt);if(opt==1){int x,pos,y;scanf("%d%d%s",&pos,&x,s+1);pos++;y=(s[1]=='*'); a[pos]=x;a[pos+n]=x;op[pos]=y,op[pos+n]=y;if(pos>1)seg.change(1,1,n*2,pos,calc(a[pos-1],a[pos],op[pos]));seg.change(1,1,n*2,pos+1,calc(a[pos],a[pos+1],op[pos+1]));seg.change(1,1,n*2,pos+n,calc(a[pos-1+n],a[pos+n],op[pos+n]));if(pos < n)seg.change(1,1,n*2,pos+1+n,calc(a[pos+n],a[pos+1+n],op[pos+1+n]));}else {int pos;scanf("%d",&pos);pos++;if(!a[pos] && !seg.query(1,1,n*2,pos+1,n+pos-1).s){puts("0");continue;} if(!seg.query(1,1,2*n,2,pos-1).s && !seg.query(1,1,2*n,pos+1,2*n).s) {puts("-1");continue; }int l=1,r=n/2,res=1;while(l<=r){int mid=l+r>>1; if(seg.query(1,1,2*n,pos+mid-1,pos-mid+n+1).s)res=mid,l=mid+1;else r=mid-1;}printf("%d\n",res);}}return 0;}
http://www.zskr.cn/news/17409.html

相关文章:

  • ToDo-List EveryDay
  • 完整教程:vue2 项目中 npm run dev 运行98% after emitting CopyPlugin 卡死
  • 2025球墨铸铁管厂家 TOP 企业品牌推荐排行榜,市政球墨铸铁管、球墨铸铁管件、防腐球墨铸铁管、给水球墨铸铁管推荐这十家公司!
  • Say 题选记(10.5 - 10.11)
  • 微信机器人开发最新协议API
  • 不连网也能跑大模型? - 教程
  • 实用指南:go get下载三方库异常
  • 微信机器人制作教程+源码
  • 基于 Rust 的英文数字验证码识别系统实现
  • 初来乍到,发篇博客试试功能
  • 国庆集训游记
  • 25国庆总结
  • 印度乡村AI计划:用JAN AI打造人工智能优先村庄
  • 崩铁壁纸
  • PotPlayer 播放器
  • 极智项目 | 基于PyQT+Whisper实现的语音识别软件设计 - 指南
  • Exp1
  • 20_uv_wsl_installation
  • 表格数据自动机器学习技术解析
  • 10/8
  • [Python/地图] 基于Python绘制地图
  • 【从前端到后端导入excel资料实现批量导入-笔记模仿芋道源码的《系统管理-用户管理-导入-批量导入》】
  • 一款专门为 WPF 打造的开源 Office 风格用户界面控件库
  • tampermonkey油猴脚本, 动画疯评分显示增强脚本
  • 01-方法-课后作业
  • 边缘数据库近期想法(2)
  • 方法-课后作业1
  • AXURE-动态面板 - 实践
  • 把握一个Makefile的脉络
  • io控制方式