bzoj4447[Scoi2015]小凸解密码
4447: [Scoi2015]小凸解密码
Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 150 Solved: 58
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
0 *
0 *
0 *
0 *
0 *
2 0
1 0 1 +
1 2 1 +
2 3
1 1 1 +
1 3 1 +
1 4 1 +
2 4
Sample Output
2
-1
HINT
脑残的 二分+线段树
化环成链,倍增区间
查询的时候分成左右两段区间查询
二分查询每个点最左边的0在哪个位置,最右边的0在哪个位置,用线段树check
找到最左和最右的0之后,线段树查询当前0所在的区间的另一端点,距离为dis
如果两区间不为查询点的端点都为0,那么查询到的最远的0都是端点了。
说明左右区间拼成环之后,可以构成一个新的跨越了左右区间的0区间,答案取$min{(dis_l,dis_r)}$ 否则取$max{(dis_l,dis_r)}$
WA + TLE
WA估计是写的时候出了点小错误,不想调试啦。
TLE这东西加点常数优化应该是可以卡过的
好像还有set作法貌似挺简单,直接存全为0的区间即可
- #include<bits/stdc++.h>
- #define ls u<<1
- #define rs ls|1
- #define N 200010
- using namespace std;
- int n,m,a[N],b[N],pd[N<<],lz[N<<],lx[N<<],rx[N<<];char s[N];
- void pushup(int u,int l,int r){
- int mid=(l+r)>>;
- pd[u]=pd[ls]|pd[rs];
- lx[u]=lx[ls];rx[u]=rx[rs];
- if(lx[u]==mid-l+)lx[u]+=lx[rs];
- if(rx[u]==r-mid)rx[u]+=rx[ls];
- }
- void build(int u,int l,int r){
- if(l==r){
- if(!b[l])pd[u]=lx[u]=rx[u]=;
- else pd[u]=lx[u]=rx[u]=;
- return;
- }
- int mid=(l+r)>>;
- build(ls,l,mid);
- build(rs,mid+,r);
- pushup(u,l,r);
- }
- void update(int u,int l,int r,int p){
- if(l==r){
- if(!b[l])pd[u]=lx[u]=rx[u]=;
- else pd[u]=lx[u]=rx[u]=;
- return;
- }
- int mid=(l+r)>>;
- if(p<=mid)update(ls,l,mid,p);
- else update(rs,mid+,r,p);
- pushup(u,l,r);
- }
- int query(int u,int L,int R,int l,int r){
- if(l<=L&&R<=r)return pd[u];
- int mid=(L+R)>>,ret=;
- if(l<=mid)ret|=query(ls,L,mid,l,r);
- if(r>mid)ret|=query(rs,mid+,R,l,r);
- return ret;
- }
- int asklx(int u,int L,int R,int l,int r){
- if(l==L&&R==r)return lx[u];
- int mid=(L+R)>>,ret=;
- if(r<=mid)return asklx(ls,L,mid,l,r);
- if(l>mid)return asklx(rs,mid+,R,l,r);
- ret+=asklx(ls,L,mid,l,mid);
- if(!ret)return ;
- if(ret==mid-l+)ret+=asklx(rs,mid+,R,mid+,r);
- return ret;
- }
- int askrx(int u,int L,int R,int l,int r){
- if(l==L&&R==r)return rx[u];
- int mid=(L+R)>>,ret=;
- if(r<=mid)return askrx(ls,L,mid,l,r);
- if(l>mid)return askrx(rs,mid+,R,l,r);
- ret+=askrx(rs,mid+,R,mid+,r);
- if(!ret)return ;
- if(ret==r-mid)ret+=askrx(ls,L,mid,l,mid);
- return ret;
- }
- inline int solve(int x){
- static int t1,t2,x1,x2,L,R,l,r;
- int mid=(+n)>>;
- if(x<mid)x+=n;
- L=x-mid+;R=x+mid;
- if(!((+n)&))R--;
- t1=t2=;
- l=x,r=R;
- while(l<=r){
- mid=(l+r)>>;
- if(query(,,n<<,mid,R))t2=mid,l=mid+;
- else r=mid-;
- }
- l=L,r=x;
- while(l<=r){
- mid=(l+r)>>;
- if(query(,,n<<,L,mid))t1=mid,r=mid-;
- else l=mid+;
- }
- if(!t1&&!t2)return -;
- if(t1==x&&t2==x)return ;
- x1=t1+asklx(,,n<<,t1,x)-;
- x2=t2-askrx(,,n<<,x,t2)+;
- if(x1==x&&x2==x)return ;
- if(t1==L&&t2==R)return min(x2-x,x-x1);
- return max(x2-x,x-x1);
- }
- inline void change(int p,int op){
- static int k;k=p-;if(!k)k=n;
- if(op)b[p]=(a[k]+a[p])%;
- else b[p]=1ll*a[k]*a[p]%;
- if(p>n)b[p-n]=b[p];
- else b[p+n]=b[p];
- }
- int main(){
- scanf("%d%d",&n,&m);
- for(int i=;i<=n;i++)
- scanf("%d %c",&a[i],&s[i]);
- for(int i=;i<=n;i++){
- int j=i-;if(!j)j=n;
- if(s[i]=='+')b[i]=(a[i]+a[j])%;
- else b[i]=1ll*a[i]*a[j]%;
- b[i+n]=b[i];s[i+n]=s[i];a[i+n]=a[i];
- }
- build(,,n<<);
- int x,y,z,p;char op;
- while(m--){
- scanf("%d%d",&x,&y);++y;
- if(x==){
- scanf("%d %c",&z,&op);
- a[y]=a[y+n]=z;s[y]=s[y+n]=op;
- change(y,s[y]=='+'?:);
- update(,,n<<,y);
- update(,,n<<,y+n);
- change(y+,s[y+]=='+'?:);
- update(,,n<<,y+);
- p=y+>n?y+-n:y++n;
- update(,,n<<,p);
- }
- else printf("%d\n",solve(y));
- }
- return ;
- }
bzoj4447[Scoi2015]小凸解密码的更多相关文章
- bzoj4447 SCOI2015 小凸解密码 password
传送门:bzoj4447 题解: 调试简直恶心,不过调完发现其实还是挺好写的. 用\(\mathrm{set}\)维护一段\(0\)区间的左右端点,每次最多修改两个点,所以很好维护. 查询的时候在\( ...
- 2019.03.26 bzoj4447: [Scoi2015]小凸解密码(线段树)
传送门 题意简述:咕咕咕 思路:考虑预处理出bbb数组,然后每次改动aaa都只会对第iii和i+1i+1i+1这两个位置产生影响,于是可以用线段树来维护bbb数组. 现在求答案的方法是断环为链,倍增整 ...
- [bzoj4447] [loj#2010] [Scoi2015] 小凸解密码
Description 小凸得到了一个密码盘,密码盘被等分成 \(N\) 个扇形,每个扇形上有一个数字(0-9),和一个符号("+"或"*") 密码盘解密的方法 ...
- 「SCOI2015」小凸解密码 解题报告
「SCOI2015」小凸解密码 题意:给一个环,定义一段连续的极长\(0\)串为\(0\)区间,定义一个位置的离一个\(0\)区间的距离为这个位置离这个区间中\(0\)的距离的最小值,每次询问一个位置 ...
- bzoj 4447 小凸解密码
bzoj 4447 小凸解密码 先将原始状态的 \(B\) 处理出来,可以发现,若不修改,则每次指定的起始位置不同,对这个环 \(B\) 带来的影响只有 \(B_0\) 不同,即每次 \(B_0=A_ ...
- 【LOJ】#2010. 「SCOI2015」小凸解密码
题解 断环为链,把链复制两份 用set维护一下全是0的区间,然后查找x + n / 2附近的区间,附近各一个过不去,最后弃疗了改为查附近的两个,然后过掉了= = 熟练掌握stl的应用,你值得拥有(雾 ...
- BZOJ_4443_[Scoi2015]小凸玩矩阵_二分+二分图匹配
BZOJ_4443_[Scoi2015]小凸玩矩阵_二分+二分图匹配 Description 小凸和小方是好朋友,小方给小凸一个N*M(N<=M)的矩阵A,要求小秃从其中选出N个数,其中任意两个 ...
- 【BZOJ4445】[Scoi2015]小凸想跑步 半平面交
[BZOJ4445][Scoi2015]小凸想跑步 Description 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸n边形,N个顶点按照逆时针从0-n-l编号.现 ...
- 2018.06.30 BZOJ4443: [Scoi2015]小凸玩矩阵(二分加二分图匹配)
4443: [Scoi2015]小凸玩矩阵 Time Limit: 10 Sec Memory Limit: 128 MB Description 小凸和小方是好朋友,小方给小凸一个N*M(N< ...
随机推荐
- 团队作业7——Beta版本冲刺计划及安排
上一个阶段的总结: 在Alpha阶段,我们小组已近完成了大部分的功能要求,小组的每一个成员都发挥了自己的用处.经过了这么久的磨合,小组的成员之间越来越默契,相信在接下来的合作中,我们的开发速度会越来越 ...
- 在django模板中添加jquery
路径 /project_name /app_name /templates /index.html /project_name setting.py /static /js jquery.js 导入方 ...
- 解决background图片拉伸问题
ImageView中XML属性src和background的区别: background会根据ImageView组件给定的长宽进行拉伸,而src就存放的是原图的大小,不会进行拉伸.src是图片内容(前 ...
- EasyUI 中easyui-textbox和easyui-searchbox文本框的点击事件。
html: <input id="txtsearch" class="easyui-textbox" data-options="buttonT ...
- Python内置函数(50)——issubclass
英文文档: issubclass(class, classinfo) Return true if class is a subclass (direct, indirect or virtual) ...
- React Native学习(九)—— 使用Flexbox布局
本文基于React Native 0.52 Demo上传到Git了,有需要可以看看,写了新内容会上传的.Git地址 https://github.com/gingerJY/React-Native-D ...
- ASP.NET Web API编程——模型验证与绑定
1.模型验证 使用特性约束模型属性 可以使用System.ComponentModel.DataAnnotations提供的特性来限制模型. 例如,Required特性表示字段值不能为空,Range特 ...
- kafka和mqtt的区别是什么?
两者都是从传统的Pub/Sub消息系统演化出来的,但是进化方向不一样,比较如下: Kafka是为了数据集成的场景,与以往Pub/Sub消息总线不一样,通过分布式架构提供了海量消息处理.高容错的方式存储 ...
- 从感知机到 SVM,再到深度学习(一)
在上篇博客中提到,如果想要拟合一些空间中的点,可以用最小二乘法,最小二乘法其实是以样例点和理论值之间的误差最小作为目标.那么换个场景,如果有两类不同的点,而我们不想要拟合这些点,而是想找到一条 ...
- HTML mate标签
META标签分两大部分:HTTP标题信息(http-equiv)和页面描述信息(name). http-equiv http-equiv类似于HTTP的头部协议,它回应给浏览器一些有用的信息,以帮助正 ...