4320: ShangHai2006 Homework
4320: ShangHai2006 Homework
分析:
分块。对权值模数进行分块,模数小于$\sqrt V$的($V$为权值上界),暴力处理。
模数大于$\sqrt V$的,设模数是k,枚举k的倍数,然后查询大于[k,2k]之间的最小的数x,这个区间的mod k最小的数就是x-k。k的倍数共有$\sqrt V$个,每次查询,再对权值进行分块,并维护后缀最小值,做到$O(1)$查询。复杂度$O(n \sqrt V)$
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = , M = , INF = 1e9;
int bel[N + ], tag[N + ], f[N + ], pt[N + ]; void add(int x) {
for (int i = ; i <= M; ++i) f[i] = min(f[i], x % i);
tag[bel[x]] = min(tag[bel[x]], x);
pt[x] = min(pt[x], x);
for (int i = x - , lim = (bel[x] - ) * M; i >= lim; --i) pt[i] = min(pt[i], pt[i + ]);
for (int i = bel[x] - ; i; --i) tag[i] = min(tag[i], tag[i + ]);
}
int query(int x) {
return min(pt[x], tag[bel[x] + ]);
}
int Ask(int x) {
if (x <= M) return f[x];
int ans = query() % x;
for (int i = x; i <= N; i += x) {
int t = query(i) - i;
if (t < x) ans = min(ans, t);
}
return ans;
}
int main() {
memset(f, 0x3f, sizeof(f));
memset(tag, 0x3f, sizeof(tag));
memset(pt, 0x3f, sizeof(pt));
int n = read();
for (int i = ; i <= N; ++i) bel[i] = (i - ) / M + ;
char opt[];
for (int i = ; i <= n; ++i) {
scanf("%s", opt); int x = read();
if (opt[] == 'A') add(x);
else printf("%d\n", Ask(x));
}
return ;
}
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(根号分治 分块)
BZOJ \(\mathbb{mod}\)一个数\(y\)的最小值,可以考虑枚举剩余系,也就是枚举区间\([0,y),[y,2y),[2y,3y)...\)中的最小值(求后缀最小值也一样)更新答案,复 ...
- bzoj 4320: ShangHai2006 Homework【分块】
按根号300000=m分情况讨论 查询是,当x小于等于m,那么可以暴力记录直接出解:否则,用分块维护区间值,查询的时候以x为步长跳根号m次取最小值即可 还有一种并查集方法,来自https://www. ...
- 【BZOJ4320】ShangHai2006 Homework 分段+并查集
[BZOJ4320]ShangHai2006 Homework Description 1:在人物集合 S 中加入一个新的程序员,其代号为 X,保证 X 在当前集合中不存在. 2:在当前的人 ...
- 【bzoj4320】【ShangHai2006 Homework】【并查集+离线处理】
ShangHai2006 Homework Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 918 Solved: 460[Submit][Statu ...
- BZOJ4320 : ShangHai2006 Homework
取$M=\sqrt{300000}$. 设$g[i]$表示程序员的$\bmod i$最小的值. 若$Y<M$,那么可以在$O(M)$时间内完成对所有$g[i]$的修改,$O(1)$时间内完成查询 ...
- [BZOJ4320][ShangHai2006]Homework(根号分治+并查集)
对于<=sqrt(300000)的询问,对每个模数直接记录结果,每次加入新数时暴力更新每个模数的结果. 对于>sqrt(300000)的询问,枚举倍数,每次查询大于等于这个倍数的最小数是多 ...
- BZOJ4320 ShangHai2006 Homework(分块+并查集)
考虑根号分块.对于<√3e5的模数,每加入一个数就暴力更新最小值:对于>√3e5的模数,由于最多被分成√3e5块,查询时对每一块找最小值,这用一些正常的DS显然可以做到log,但不太跑得过 ...
- 【bzoj4320】ShangHai2006 Homework
若Y小于等于sqrt(300000),暴力,对所有的插入的数都更新mn[i]. 若Y大于sqrt(300000),枚举kY,用并查集维护>=i的第一个数,这样只支持删除操作是O(1),然后倒着枚 ...
随机推荐
- Build path entry is missing: config 引起的 The project: configwhich is referenced by the classpath, does not exist.
运行Junit的时候报错, The project: XXXX which is referenced by the classpath, does not exist. 在Java Build Pa ...
- Hadoop HBase概念学习系列之模式设计(十)
Hbase与RDBMS的区别在于:HBase的Cell(每条数据记录中的数据项)是具有版本描述的(versioned),行是有序的,列(qualifier)在所属列簇(Column familie ...
- windows命令行大全
命令简介 cmd是command的缩写.即命令行 . 虽然随着计算机产业的发展,Windows 操作系统的应用越来越广泛,DOS 面临着被淘汰的命运,但是因为它运行安全.稳定,有的用户还在使用,所以一 ...
- setnx redis
使用锁 1)setnx(lockkey, 当前时间+过期超时时间) ,如果返回1,则获取锁成功:如果返回0则没有获取到锁,转向2.2.)get(lockkey)获取值oldExpireTime ,并将 ...
- CR与LF
CR与LF CR(carriage return),中文名称"回车":LF(line feed),中文名称"换行".无论是初学编程的小白还是入行十年的资深,总会 ...
- selenium安装浏览器驱动
3.0以上版本恩的selenium需要安装驱动 pip show selenium 安装驱动 1.下载驱动地址: 火狐:https://github.com/mozilla/geckodriver/r ...
- ceph crush算法和crushmap浅析
1 什么是crushmap crushmap就相当于是ceph集群的一张数据分布地图,crush算法通过该地图可以知道数据应该如何分布:找到数据存放位置从而直接与对应的osd进行数据访问和写入:故障域 ...
- 纯css3云彩动画效果
效果描述: 纯CSS3实现的云彩动画飘动效果 非常逼真实用 使用方法: 1.将body中的代码部分拷贝到你的页面中 2.引入对应的CSS文件即可
- Day2 CSS
什么是CSS 层叠样式表(cascading style sheet) 控制页面元素的显示方式.(添加样式) CSS语法 行间样式 行内式是在标记的style属性中设定CSS样式.这种方式没有体现出C ...
- 记一次ajax交互问题
问题描述:仍然在表单中,像往常一样,异步获取表单内所有输入框的信息,点击提交,确实也走了后台,但是结果却走了ajax的error.这一点使我当时非常疑惑,为什么会走error呢? 一般走error的原 ...