BZOJ.4320.[ShangHai2006]Homework(根号分治 分块)
\(\mathbb{mod}\)一个数\(y\)的最小值,可以考虑枚举剩余系,也就是枚举区间\([0,y),[y,2y),[2y,3y)...\)中的最小值(求后缀最小值也一样)更新答案,复杂度是\(O(\frac ny)\)的。注意到\(y>\sqrt n\)时,枚举次数\(<\sqrt n\)。
我们可以对\(y\)根号分治,设\(m=\sqrt{V}\)(\(V\)是值域)。
当\(y\leq m\)时,可以维护一个大小为\(m\)的桶\(s_i\)(表示模数为\(i\)时的\(\min\{a\ \mathbb{mod}\ i,a\in S\}\)),插入一个数时更新所有桶的值,查询时直接输出。
当\(y>m\)时,枚举\([0,y),[y,2y),[2y,3y)...\)这些权值区间求最小值,为了方便可以直接求后缀最小值,也就是\(0,y,2y...\)这些位置的后缀最小值。
枚举的复杂度是\(O(\sqrt V)\)的,怎么\(O(1)\)求一个位置的后缀最小值呢。
不妨每次插入\(a\)就对\(1\sim a\)这些位置与\(a\)取\(\min\)。我们对值域分块,这样更新的复杂度是\(O(\sqrt V)\)的,查询某个位置的后缀最小值是\(O(1)\)的。
然后总复杂度就是\(O(n\sqrt V)\)了。
查后缀最小值也就是这个数往后的一个数是多少。因为只有插入,离线之后也可以看成只有删除,右边第一个数是可以并查集维护的。删掉一个数就是合并两个位置。
复杂度\(O(n\sqrt V\alpha(V))\),也可以过。
//3656kb 1208ms
#include <cmath>
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 500000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=3e5+3,INF=1<<30,size=548;//(int)sqrt(3e5); //BZOJ编译器版本低到这样写会CE? = =
//最大值(初值)不能是N!N对一个大数取模后可能还更小。。
int g[size+3],bel[N],tag[size+3],mn[N];
char IN[MAXIN],*SS=IN,*TT=IN;
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-48,c=gc());
return now;
}
inline char GetOpt()
{
register char c=gc();
while(c!='A'&&c!='B') c=gc();
return c;
}
inline void Add(const int x)
{
for(int i=1; i<=size; ++i) g[i]=std::min(g[i],x%i);
for(int i=0,l=bel[x]; i<l; ++i) tag[i]=std::min(tag[i],x);
for(int i=bel[x]*size; i<=x; ++i) mn[i]=std::min(mn[i],x);
}
inline int Query(const int x)
{
if(x<=size) return g[x];
int res=INF;
for(int i=0; i<N; i+=x)
res=std::min(res,std::min(mn[i],tag[bel[i]])-i);
return res;
}
int main()
{
for(int i=0; i<=size; ++i) g[i]=INF, tag[i]=INF;
for(int i=0; i<N; ++i) bel[i]=i/size, mn[i]=INF;
for(int Q=read(); Q--; )
switch(GetOpt())
{
case 'A': Add(read()); break;
case 'B': printf("%d\n",Query(read())); break;
}
return 0;
}
BZOJ.4320.[ShangHai2006]Homework(根号分治 分块)的更多相关文章
- bzoj 4320: ShangHai2006 Homework
4320: ShangHai2006 Homework Time Limit: 10 Sec Memory Limit: 128 MB Description 1:在人物集合 S 中加入一个新的程序员 ...
- bzoj 4320: ShangHai2006 Homework【分块】
按根号300000=m分情况讨论 查询是,当x小于等于m,那么可以暴力记录直接出解:否则,用分块维护区间值,查询的时候以x为步长跳根号m次取最小值即可 还有一种并查集方法,来自https://www. ...
- [BZOJ4320][ShangHai2006]Homework(根号分治+并查集)
对于<=sqrt(300000)的询问,对每个模数直接记录结果,每次加入新数时暴力更新每个模数的结果. 对于>sqrt(300000)的询问,枚举倍数,每次查询大于等于这个倍数的最小数是多 ...
- 4320: ShangHai2006 Homework
4320: ShangHai2006 Homework 链接 分析: 分块.对权值模数进行分块,模数小于$\sqrt V$的($V$为权值上界),暴力处理. 模数大于$\sqrt V$的,设模数是k, ...
- [CF587F]Duff is Mad[AC自动机+根号分治+分块]
题意 给你 \(n\) 个串 \(s_{1\cdots n}\) ,每次询问给出 \(l,r,k\) ,问在 \(s_{l\cdots r}\) 中出现了多少次 \(s_k\) . \(n,q,\su ...
- BZOJ.3351.[IOI2009]Regions(根号分治 差分)
BZOJ 表示非常爽2333 \(Description\) 给定一棵\(n\)个点的树,每个点有一个属性\(1\leq r_i\leq R\). \(Q\)次询问,每次询问给定\(r1,r2\),求 ...
- [CF1083F]The Fair Nut and Amusing Xor[差分+同余分类+根号分治+分块]
题意 给定两个长度为 \(n\) 的序列 \(\{a_i\}\) 与 \(\{b_i\}\),你需要求出它们的相似度.,我们定义这两个序列的相似度为将其中一个序列转化为另一个序列所需的最小操作次数.一 ...
- CF1039E Summer Oenothera Exhibition 贪心、根号分治、倍增、ST表
传送门 感谢这一篇博客的指导(Orzwxh) $PS$:默认数组下标为$1$到$N$ 首先很明显的贪心:每一次都选择尽可能长的区间 不妨设$d_i$表示在取当前$K$的情况下,左端点为$i$的所有满足 ...
- CF1039E Summer Oenothera Exhibition 根号分治,LCT,ST表
CF1039E Summer Oenothera Exhibition LG传送门 根号分治好题. 可以先看我的根号分治总结. 题意就是给出长度为\(n\)的区间和\(q\)组询问以及一个\(w\), ...
随机推荐
- Java 创建一个窗口,使其启动时位于屏幕中间
import java.awt.Toolkit; import javax.swing.JFrame; public class WindowInTheMiddle extends JFrame { ...
- linux学习笔记之 basename, dirname
前言: basename: 用于打印目录或者文件的基本名称 dirname: 去除文件名中的非目录部分,仅显示与目录有关的内容.dirname命令读取指定路径名保留最后一个/及其后面的字符,删除其他部 ...
- vue :基本语法格式
<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>Vu ...
- 阿里云服务器配置SSL证书成功开启Https(记录趟过的各种坑)
环境: 阿里云云服务器 Windows Server 2008 标准版 SP2 中文版(趁1212优惠买的一年的水货配置) 阿里云购买的域名(已备案.已解析) 服务器:phpstudy:php5 ...
- Tensorflow 损失函数及学习率的四种改变形式
Reference: https://blog.csdn.net/marsjhao/article/details/72630147 分类问题损失函数-交叉熵(crossentropy) 交叉熵描述的 ...
- 手机app数据的爬取之mitmproxy安装教程
mitmproxy是一个支持HTTP和HTTPS的抓包程序,类似Fiddler.Charles的功能,只不过它通过控制台的形式操作. 此外,mitmproxy还有两个关联组件,一个是mitmdump, ...
- Faster-RCNN tensorflow 程序细节
tf-faster-rcnn github:https://github.com/endernewton/tf-faster-rcnn backbone,例如vgg,conv层不改变feature大小 ...
- [转]安卓手机google商店的账号切换退出方式
来源:http://blog.csdn.net/bianchengninhao/article/details/42240839 1.设置 2.账户 3.Google 4. 5.点击菜单键 6.最后删 ...
- Docker Client (another java docker client api)
前一篇提到了docker-java,这里介绍另一个docker client 库,Docker Client 版本兼容 兼容17.03.1~ce - 17.12.1~ce (点 [here][1]查看 ...
- [转]Howto: 使用ImageBrush替换PictureMarkerSymbol以加强graphic显示性能
原文地址:http://support.esrichina-bj.cn/2009/0728/1007.html 文章编号 : 37033 软件: ArcGIS API for Microsoft Si ...