uoj#186 【UR #13】Yist
orz myy
首先注意到答案有单调性,于是我们可以考虑二分一个\(x\),之后去判断一下每次只使用长度为\(x\)的区间能否删出目标序列
显然我们应该贪心地删除需要删除元素中最小的那一个,感性理解就是先删除最小的能使得接下来删除的限制尽量小
复杂度是\(O(qn^2\log n)\)
再大致理解一下发现我们并不需要二分,对于一个需要删除的元素,需要用到的最大区间长度是可以算出来的;我们搞一个单调栈,处理出每一个需要删除的元素左右两边第一个比它小的不需要删除的\(l_i,r_i\),再减去\((l_i,r_i)\)这个开区间里需要删除的且比\(a_i\)小的元素就是可能的最大区间长度了(根据上面的贪心,这些元素之前就被删除了),答案即所有可能最大区间长度的最小值
由于我们不能将需要删除的元素加入单调栈,所以必须在单调栈上二分求出\(l_i,r_i\),复杂度是\(O(qn\log n)\)
之后还要减掉\((l_i,r_i)\)里需要删除且比\(a_i\)小的元素个数,看起来不是很好处理,但我们只需要减掉\((l_i,r_i)\)里需要删除的元素个数即可,由于我们求得是最小值,这样并不会影响答案
考虑\((l_i,r_i)\)里一个比\(a_i\)大的需要删除元素,这个元素形成的区间一定比\(a_i\)短,能形成的最小值一定比\(a_i\)形成的小
代码
#include<bits/stdc++.h>
#define re register
#define LL long long
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
inline int read() {
char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
const int maxn=1e6+5;
int n,Q,top,cnt;
int st[maxn],a[maxn],l[maxn],r[maxn],pre[maxn];
char S[maxn];
inline int find(int x) {
int L=1,R=top,nw=0;
while(L<=R) {
int mid=L+R>>1;
if(a[st[mid]]<x) nw=st[mid],L=mid+1;else R=mid-1;
}
return nw;
}
int main() {
n=read();a[0]=a[n+1]=-1;
for(re int i=1;i<=n;i++) a[i]=read();
Q=read();
while(Q--) {
scanf("%s",S+1);st[top=1]=0;cnt=0;
for(re int i=1;i<=n;i++)
if(S[i]=='1') {
while(top&&a[st[top]]>a[i]) --top;
st[++top]=i;
}
else l[i]=find(a[i])+1;
st[top=1]=n+1;
for(re int i=n;i;--i)
if(S[i]=='1') {
while(top&&a[st[top]]>a[i]) --top;
st[++top]=i;
}
else r[i]=find(a[i])-1,++cnt;
for(re int i=1;i<=n;i++) pre[i]=pre[i-1]+(S[i]=='0');
int ans=n;
for(re int i=1;i<=n;i++) if(S[i]=='0')
ans=min(ans,r[i]-l[i]+1-pre[r[i]]+pre[l[i]-1]);
printf("%d\n",ans+1);
}
return 0;
}
uoj#186 【UR #13】Yist的更多相关文章
- uoj#187. 【UR #13】Ernd
http://uoj.ac/problem/187 每个点只能从时间,b+a,b-a三维都不大于它的点转移过来,将点按时间分成尽量少的一些段,每段内三维同时非严格单调,每段内的点可能因为连续选一段而产 ...
- UOJ 188 【UR #13】Sanrd——min_25筛
题目:http://uoj.ac/problem/188 令 \( s(n,j)=\sum\limits_{i=1}^{n}[min_i>=p_j]f(j) \) ,其中 \( min_i \) ...
- 【UR #13】Yist
UOJ小清新题表 题目摘要 UOJ链接 给出一个排列 \(A\) 以及它的一个非空子序列 \(B\),给出一个 \(x\) 并进行若干次操作,每一次操作需要在 \(A\) 中选择一个长度恰好为 \(x ...
- uoj#188. 【UR #13】Sanrd(Min_25筛)
题面 传送门 题解 这是一道语文题 不难看出,题目所求即为\(l\)到\(r\)中每个数的次大质因子 我们考虑\(Min\_25\)筛的过程,设 \[S(n,j)=\sum_{i=1}^nsec_p( ...
- UOJ #188. 【UR #13】Sanrd
Description 给定 \(\sum_{i=l}^r f[i]\) \(f[i]=\) 把 \(i\) 的每一个质因子都从小到大排列成一个序列(\(p_i^{c_i}\)要出现 \(c_i\) ...
- 「uoj#188. 【UR #13】Sanrd」
题目 不是很能看懂题意,其实就是求\([l,r]\)区间内所有数的次大质因子的和 这可真是看起来有点鬼畜啊 这显然不是一个积性函数啊,不要考虑什么特殊的函数了 我们考虑Min_25筛的过程 设\(S( ...
- UOJ 241. 【UR #16】破坏发射台 [矩阵乘法]
UOJ 241. [UR #16]破坏发射台 题意:长度为 n 的环,每个点染色,有 m 种颜色,要求相邻相对不能同色,求方案数.(定义两个点相对为去掉这两个点后环能被分成相同大小的两段) 只想到一个 ...
- uoj #118. 【UR #8】赴京赶考 水题
#118. [UR #8]赴京赶考 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/118 Description ...
- uoj #31. 【UR #2】猪猪侠再战括号序列 贪心
#31. [UR #2]猪猪侠再战括号序列 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/31 Descript ...
随机推荐
- C++异常处理的深入理解
1,问题: 1,如果在 main 函数中抛出异常会发生什么? 1,不处理,则崩溃: 2,如果异常不处理,最后会传到哪里? 3,下面的代码输出什么? 4,异常的最终处理编程实验: #include &l ...
- java树的遍历
java二叉树的遍历算法: http://blog.sina.com.cn/s/blog_70600f720100ujnp.html
- Spring学习笔记(13)——aop原理及拦截器
原理 AOP(Aspect Oriented Programming),也就是面向方面编程的技术.AOP基于IoC基础,是对OOP的有益补充. AOP将应用系统分为两部分,核心业务逻辑(Core bu ...
- JavaScript寻找最长的单词算法
返回提供的句子中最长的单词的长度. 返回值应该是一个数字. 第一步,使用String.prototype.split()方法将字符串转换成数组 function findLongestWord(str ...
- SET SESSION AUTHORIZATION - 为当前会话设置会话用户标识符和当前用户标识符
SYNOPSIS SET [ SESSION | LOCAL ] SESSION AUTHORIZATION username SET [ SESSION | LOCAL ] SESSION AUTH ...
- Java网络编程:OSI七层模型和TCP/IP模型介绍
OSI(Open System Interconnection),开放式系统互联参考模型 .是一个逻辑上的定义,一个规范,它把网络协议从逻辑上分为了7层.每一层都有相关.相对应的物理设备,比如常规的路 ...
- ios微信分享的兼容性问题
我微信分享采用的是: 页面初始化时动态加载js-sdk, 然后在需要分享的页面进行sdk的分享初始化 app.vue store.vue 这种方法在安卓上完全正常, 好用得令人发指, 但是!!! io ...
- vue-cli脚手架工具新老版本安装对比
1.老版本 Shift+鼠标右键 选择打开命令窗口 1.创建项目之前,需先确保本机已经安装node 在命令窗口中执行node -v npm -v 2.一般情况下用npm安装东西比较慢,可以使用淘宝 ...
- 51单片机外部中断INT0实例(汇编程序)
;普中51开发板 ;单片机的P3.2(INT0)引脚与按键K3脚连接 ;用汇编语言实现:按一次K1外部中断INT0响应一次,LED显示值加1(十进制), ;前提是共阴数码LED第一位,需要设定,由P0 ...
- 人生苦短_我用Python_list(列表)_002
# coding=utf-8 # 列表 list 列表函数 # 列表的特性: 可以有任何类型的值 可以更改 # 可以更改.增加.删除.修改 # 增加 append 直接在尾巴增加 list_1 = [ ...