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\) 所求的东西和质因子有关 ...
随机推荐
- Easyui 加载树(easyui-tree)[dotnet]
前台 html: <ul class="easyui-tree" id="ul_Tree" data-options="fit:true,ani ...
- (转)MSSQL 各个发行版本版本号以及Compact 版本号
终于开始写博客了. 不要笑啊. 下面是MSSQL 的发行版本以及版本号.自己整理的. http://support.microsoft.com/kb/321185/zh-cn SQL Server 2 ...
- @Autowired与@Resource用法
官方文档中有这样一段话. If you intend to express annotation-driven injection by name, do not primarily use @Aut ...
- spring3.2以后的cglib的jar包问题
关于cglib的jar包官方的文档上有这么一段话 Note For this dynamic subclassing to work, the class that the Spring contai ...
- Bootstrap学习笔记(三) 网格系统
4-1实现原理 网格系统的实现原理非常简单,仅仅是通过定义容器大小,平分12份(也有平分成24份或32份,但12份是最常见的),再调整内外边距,最后结合媒体查询,就制作出了强大的响应式网格系统.Boo ...
- 暑假集训(5)第一弹——— Super Jumping! Jumping! Jumping!(hdu1087)
题意概括:在上次与娑殚的三次博弈中,你们都取得了胜利.便向娑殚提出要求,借助他的力量,传送到一个安全的地方. 你们的愿望达成了,不过,你和小A似乎失散了. 街上人来人往的特别热闹,每一个人的脸上都洋溢 ...
- KnockoutJS(2)-监控属性
本节主要涉及到3个内容: 1. 监控属性 Observables (这个用的比较多,但是其本身使用比较简单,唯一需要注意就是,它监控的对象是一个方法,所以取值和设置值的时候容易混淆) 2. 计算属性 ...
- c++,C# 转换
//C++中的DLL函数原型为 //extern "C" __declspec(dllexport) bool 方法名一(const char* 变量名1, unsi ...
- 前端encodeURIComponent 和后端http_build_query配合
解决特殊字符不能转义 1. function fixedEncodeURIComponent (str) { return encodeURIComponent(str).replace(/[!' ...
- mvc 之 @Html.DropDownList
Dictionary<string, string> myDic = new Dictionary<string, string>(); myDic.Add(System.DB ...