BZOJ4320 homework】的更多相关文章

Problem bzoj4320 Solution 前置技能:分块+线段树+卡常+一点小小的数学知识 考试时A的 这种题无论怎么处理总有瓶颈,套路分块,设\(k\)以下的插入时直接暴力预处理,查询时直接调用:\(k\)以上的插入时不管,查询时线段树查找每个模意义下的区间 核心代码: if(opt[0]=='A'){ for(rg int i=1;i<=k;++i)f[i]=min(f[i],x%i); update(1,n,1,x); } else if(x<=k)printf("%…
题面链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4320 令M=sqrt(mx),把询问的Y按M 分成两种不同的处理方式. 1.对于>M的Y,我们发现它的倍数不超过M个,于是可以枚举倍数,找到往后第一个已经被加入集合的值,用差值更新答案. 这个东西我们可以离线,倒序枚举询问,然后用并查集维护. 单次查询O(M),更新O(1). 2.对于<M的Y,倍数肯定是>M,不过这样的Y也就M个,可以直接拿数组存,g[i]表示目前%i最小为多…
Description:给定\(n\)个操作,向集合中加入一个数(保证每个数不同)或者查询集合内\(\text{%Y}\)的最小值 Solution:对于小于\(\sqrt{300000}\)的直接暴力,大于它的跳1,Y,Y的倍数,离Y最近的数,这个可以用并查集维护,离线好维护,我们直接离线,对于加点直接变成删点 写的时候级邪,要么是爆栈,要么是本地对拍没过不敢交,结果网上A了 Code: #include<cstdio> #include<cstring> #include<…
[BZOJ4320]ShangHai2006 Homework Description   1:在人物集合 S 中加入一个新的程序员,其代号为 X,保证 X 在当前集合中不存在.    2:在当前的人物集合中询问程序员的mod Y 最小的值. (为什么统计这个?因为拯救过世界的人太多了,只能取模)  Input 第一行为用空格隔开的一个个正整数 N.  接下来有 N 行,若该行第一个字符为“A” ,则表示操作 1:若为“B”,表示操作 2:  其中 对于 100%的数据:N≤100000, 1≤…
对于<=sqrt(300000)的询问,对每个模数直接记录结果,每次加入新数时暴力更新每个模数的结果. 对于>sqrt(300000)的询问,枚举倍数,每次查询大于等于这个倍数的最小数是多少,这个操作通过将询问逆序使用并查集支持. #include<cstdio> #include<algorithm> #define rep(i,l,r) for (int i=(l); i<=(r); i++) using namespace std; ,M=,B=; char…
考虑根号分块.对于<√3e5的模数,每加入一个数就暴力更新最小值:对于>√3e5的模数,由于最多被分成√3e5块,查询时对每一块找最小值,这用一些正常的DS显然可以做到log,但不太跑得过.考虑并查集在序列上的奇技淫巧.加点不太能做,考虑离线改成删点.并查集维护下一个未删除的点即可. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<…
ShangHai2006 Homework Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 918  Solved: 460[Submit][Status][Discuss] Description   1:在人物集合 S 中加入一个新的程序员,其代号为 X,保证 X 在当前集合中不存在.    2:在当前的人物集合中询问程序员的mod Y 最小的值. (为什么统计这个?因为拯救 过世界的人太多了,只能取模)    Input 第一行为用空格隔开的…
取$M=\sqrt{300000}$. 设$g[i]$表示程序员的$\bmod i$最小的值. 若$Y<M$,那么可以在$O(M)$时间内完成对所有$g[i]$的修改,$O(1)$时间内完成查询. 若$Y\geq M$,那么枚举$Y$的倍数,等价于查询一段区间内的最小值,可以通过分块做到$O(M)$修改,$O(1)$查询. 因为倍数不超过$M$个,所以询问的总复杂度为$O(M)$. 所以总时间复杂度为$O(n\sqrt{300000})$. #include<cstdio> const…
若Y小于等于sqrt(300000),暴力,对所有的插入的数都更新mn[i]. 若Y大于sqrt(300000),枚举kY,用并查集维护>=i的第一个数,这样只支持删除操作是O(1),然后倒着枚举一边,删除一个数x那么就fa[x]=fa[x+1] #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #inclu…
4320: ShangHai2006 Homework Time Limit: 10 Sec Memory Limit: 128 MB Description 1:在人物集合 S 中加入一个新的程序员,其代号为 X,保证 X 在当前集合中不存在. 2:在当前的人物集合中询问程序员的mod Y 最小的值. (为什么统计这个?因为拯救 过世界的人太多了,只能取模) Input 第一行为用空格隔开的一个个正整数 N. 接下来有 N 行,若该行第一个字符为"A" ,则表示操作 1:若为&quo…