UR #13 Yist
第一次打UR,打了一个半小时就弃疗了QAQ
这是我唯一一道考试的时候做出来的题目,其他两道连暴力都懒得写了
很容易发现对于每个要删除的点
我们找到左边第一个比他小的不用删除的点,右边第一个比他小的不用删除的点
中间这段区间就是对于这个点被删除时的极大区间
对于所有的区间我们取min就可以了
对于找到某个点左边第一个比他小的不用删除的点
我是这样考虑的:将数从大到小的进行添加,并用并查集维护不用删除的点
那么之后这个点存在的极大区间显然是这段区间里的1的个数+1
这个算法是O(na)的
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
using namespace std; const int maxn=1000010;
int n,T,ans;
int a[maxn],pos[maxn];
char b[maxn];
int L[maxn],R[maxn];
int sum[maxn];
int ufsL(int x){return L[x]==x?x:L[x]=ufsL(L[x]);}
int ufsR(int x){return R[x]==x?x:R[x]=ufsR(R[x]);}
void read(int &num){
num=0;char ch=getchar();
while(ch<'!')ch=getchar();
while(ch>='0'&&ch<='9')num=num*10+ch-'0',ch=getchar();
}
void Solve(){
for(int i=1;i<=n;++i){
if(b[i]=='1')sum[i]=sum[i-1]+1;
else sum[i]=sum[i-1];
}
ans=n;L[0]=0;
for(int i=1;i<=n;++i){
if(b[i]=='1')L[i]=i;
else L[i]=ufsL(i-1);
}R[n+1]=n+1;
for(int i=n;i>=1;--i){
if(b[i]=='1')R[i]=i;
else R[i]=ufsR(i+1);
}
for(int i=n;i>=1;--i){
int p=pos[i];
if(b[p]=='1'){
L[p]=ufsL(p-1);
R[p]=ufsR(p+1);
}else{
int A=ufsL(p);
int B=ufsR(p);
ans=min(ans,sum[B-1]-sum[A]+1);
}
}return;
}
int main(){
read(n);
for(int i=1;i<=n;++i)read(a[i]),pos[a[i]]=i;
scanf("%d",&T);
while(T--){
scanf("%s",b+1);
Solve();
printf("%d\n",ans);
}return 0;
}
题解给出了一种O(n)的做法,还是回顾刚才的思路
我们注意到我们的并查集只有删除操作
也就是说如果一个点扩展的时候访问到之前已经扩展过的点
这个点的区间长度一定比之前扩展的那个点的区间长度要长
由于我们取的是min,所以我们就不用扩展了
这样我们就可以保证每个元素只访问一次,每次暴力扩展即可
时间复杂度显然是O(n)的
UR #13 Yist的更多相关文章
- uoj#186 【UR #13】Yist
题目 orz myy 首先注意到答案有单调性,于是我们可以考虑二分一个\(x\),之后去判断一下每次只使用长度为\(x\)的区间能否删出目标序列 显然我们应该贪心地删除需要删除元素中最小的那一个,感性 ...
- 【UR #13】Yist
UOJ小清新题表 题目摘要 UOJ链接 给出一个排列 \(A\) 以及它的一个非空子序列 \(B\),给出一个 \(x\) 并进行若干次操作,每一次操作需要在 \(A\) 中选择一个长度恰好为 \(x ...
- UR #13 Ernd
考试的时候没有注意到可以将(a,b)放在二维平面上之后旋转坐标系,使得转移变成树状数组二维偏序 这样就算我想出来了第二个转移的斜率优化也没有什么卵用啊(摔西瓜 设g(i)表示当前站在第i个水果下面且第 ...
- UR#13 SRAND
总感觉这位大仙讲的很清楚:bztminamoto 题意 题目讲的是求 l~r 内所有数的次大质因子,这里设 f(x) 为 x 的次大质因子 我们差分一下就变成求两个前缀和信息了 按照套路,我们考虑 S ...
- uoj#188. 【UR #13】Sanrd(Min_25筛)
题面 传送门 题解 这是一道语文题 不难看出,题目所求即为\(l\)到\(r\)中每个数的次大质因子 我们考虑\(Min\_25\)筛的过程,设 \[S(n,j)=\sum_{i=1}^nsec_p( ...
- 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 \) ...
- UOJ #188. 【UR #13】Sanrd
Description 给定 \(\sum_{i=l}^r f[i]\) \(f[i]=\) 把 \(i\) 的每一个质因子都从小到大排列成一个序列(\(p_i^{c_i}\)要出现 \(c_i\) ...
- UOJ188. 【UR #13】Sanrd
传送门 Sol 设 \(f_i\) 表示 \(i\) 的次大质因子 题目就是要求 \[\sum_{i=l}^{r}f_i\] 考虑求 \(\sum_{i=1}^{n}f_i\) 所求的东西和质因子有关 ...
随机推荐
- JQuery验证工具
一.写法一 var Validator = { // 邮箱isEmail : function(s) {var p = "^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z ...
- Oracle常见的问题
1.oracle 中文问号乱码解决方法: 在系统变量里面添加变量名:NLS_LANG 变量值: SIMPLIFIED CHINESE_CHINA.ZHS16GBK 2.查询oracle 里的主键 S ...
- vc++字符转换
测试环境: vs2008 开发语言:C++ #include <iostream>#include <windows.h>#include <string> // ...
- .net 将excel转成html文件
最近在做一个打印预览功能,但是开始没有头绪后来用excel做了一个模板,然后根据excel模板来生成新的excel并将其存储为html,可以通过http请求在浏览器中读取,并且打印,其他的不多说.方法 ...
- js分割文件快速上传
<?php header('Content-type:text/html;charset=UTF-8'); ?> <?php if ($_FILES) { if(!file_exis ...
- php提取字符串中的数字
最近工作中写代码的时候需要在一串字符串中将所有的数字提取出来这么一个小功能,研究了一下发现方法还挺多,值得记录一下,于是对如何使用PHP将字符串中的数字提取出来的功能做了一个小总结,总结三种方法如下: ...
- 在后台对GameObject进行"创建"||"删除"动作
在后台对GameObject进行"创建"||"删除"动作 建立 public GameObject Pre;//在编辑器中用来绑定的Prefabs public ...
- sysfs接口函数到建立_DEVICE_ATTR
sysfs接口函数到建立_DEVICE_ATTR 最近在弄Sensor驱动,看过一个某厂家的成品驱动,里面实现的全都是sysfs接口,hal层利用sysfs生成的接口,对Sensor进行操作. 说道s ...
- 10个优秀的Objective-C和iOS开发在线视频教程
如果你自己开发iOS应用,你肯定会发现网上有很多资源.学习编程的一个最好的方法就是自己写代码,而开始写代码的最快的方式就是看其他人怎么写.我们从海量视频和学习网站中整理出了我 如果你自己开发iOS应用 ...
- git操作技巧(转载)
转载自:https://segmentfault.com/q/1010000000181403 git支持很多种工作流程,我们采用的一般是这样,远程创建一个主分支,本地每人创建功能分支,日常工作流程如 ...