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 ...
随机推荐
- SnowFlake --- 分布式id生成算法
转载自:https://segmentfault.com/a/1190000011282426 概述 SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图: 1位,不用.二进 ...
- SpringBoot集成Swagger,Postman,newman,jenkins自动化测试.
环境:Spring Boot,Swagger,gradle,Postman,newman,jenkins SpringBoot环境搭建. Swagger简介 Swagger 是一款RESTFUL接口的 ...
- 2018-2-13-win10-uwp-从-Unity-创建
title author date CreateTime categories win10 uwp 从 Unity 创建 lindexi 2018-2-13 17:23:3 +0800 2018-2- ...
- mysql数据库的水平分表与垂直分表实例讲解
mysql语句的优化有局限性,mysql语句的优化都是围绕着索引去优化的,那么如果mysql中的索引也解决不了海量数据查询慢的状况,那么有了水平分表与垂直分表的出现(我就是记录一下自己的理解) 水平分 ...
- C++ 虚函数和多重继承的内存布局初探
C++ 对象的内存布局 一切以事实说话: 代码: 1: #include <stdio.h> 2: 3: class A { 4: public: 5: int a; 6: int b; ...
- Dubbox管理中心的部署及使用
安装: 我们在开发时,需要知道注册中心都注册了哪些服务,以便我们开发和测试.我们可以通过部署一个管理中心来实现.其实管理中心就是一个web应用,部署到tomcat即可. (1)编译源码,得到war包 ...
- SpringBoot2.0总结
与SpringCloud关系 与SpringMVC关系 与JFinal区别 常用注解: @RestController @EnableAutoConfiguration @ComponentSc ...
- DM9000驱动网卡编程
DM9000数据发送编程: static int dm9000_start_xmit(struct sk_buff *skb, struct net_device *dev) { unsigned l ...
- 深入研究CSS
通常我们在学习CSS的时候,感觉很容易掌握,却常常在实际应用中碰到各式各样难以填补的“坑”,为避免大家受到同样的困惑与不解,本文详细讲解了CSS中优先级和Stacking Context等诸多高级特性 ...
- js的 算法 和 数据结构
js的 算法 1.对一个对象数组按照对象某个属性进行排序 : https://www.cnblogs.com/webcabana/p/7460038.html 在做公交的项目中就碰到过这种算法问题, ...