bzoj 4320: ShangHai2006 Homework
4320: ShangHai2006 Homework
Time Limit: 10 Sec Memory Limit: 128 MB
Description
1:在人物集合 S 中加入一个新的程序员,其代号为 X,保证 X 在当前集合中不存在。
2:在当前的人物集合中询问程序员的mod Y 最小的值。 (为什么统计这个?因为拯救
过世界的人太多了,只能取模)
Input
第一行为用空格隔开的一个个正整数 N。
接下来有 N 行,若该行第一个字符为“A” ,则表示操作 1;若为“B”,表示操作 2;
其中 对于 100%的数据:N≤100000, 1≤X,Y≤300000,保证第二行为操作 1。
Output
对于操作 2,每行输出一个合法答案。
Sample Input
5
A 3
A 5
B 6
A 9
B 4
Sample Output
3
1
HINT
【样例说明】
在第三行的操作前,集合里有 3、5 两个代号,此时 mod 6 最小的值是 3 mod 6 = 3;
在第五行的操作前,集合里有 3、5、9,此时 mod 4 最小的值是 5 mod 4 = 1;
题目分析
首先,当\(Y \le \sqrt {MaxY}\),我们可以暴力更新\(ans\)数组。当\(Y \gt \sqrt {MaxY}\)时,我们可以按倍数进行枚举。这样我们就可以保证每次查询都在\(O(\sqrt Y)\)以内。
不过我们在枚举大的\(Y\)时,还要能迅速求出答案,显然我们需要找到\(\le k*Y\)的最小数,显然可以用set水过。
#include <set>
#include <cstdio>
#include <cstring>
using namespace std;
set<int>s;
set<int>::iterator it;
int ans[550];
int main() {
int i,j,n,a,t,res; char op[3];
for(scanf("%d",&n),memset(ans,127,sizeof ans),i=0;i<n;++i) {
scanf("%s%d",op,&a);
if(*op=='A') {
for(j=1;j<550;++j) (t=a%j)<ans[j]?ans[j]=t:1;
s.insert(a);
} else
if(a<550) printf("%d\n",ans[a]);
else { for(j=0,res=0x7f7f7f7f;j<300001;j+=a) {
it=s.lower_bound(j);
if(it==s.end()) continue;
t=*it%a,t<res?res=t:1;
}
printf("%d\n",res);
}
}
return 0;
}
不过,我们也可以用并查集来求出这个数,而且速度更快。
#include <cstdio>
#include <cstring>
#define M 300005
#define N 100005
int fa[M],ans[N],val[N],d[550];
char op[N],ts[4],mark[M];
int find(int u) {return (fa[u]^u)?(fa[u]=find(fa[u])):u;}
void Union(int x,int y) {
x=find(x),y=find(y);
(x<y)?fa[x]=y:fa[y]=x;
}
int main() {
int n,i,j,t; memset(d,127,sizeof d);
for(scanf("%d",&n),i=1;i<=n;++i) {
scanf("%s%d",ts,val+i);
if((op[i]=*ts)=='A') {
for(j=1;j<550;++j) ((t=val[i]%j)<d[j])?d[j]=t:1;
mark[val[i]]=1;
} else ans[i]=d[val[i]];
}fa[300001]=300001;
for(i=300000;i;--i) (mark[i])?fa[i]=i:fa[i]=find(fa[i+1]);
for(i=n;i;--i) {
if(op[i]=='A') Union(val[i],val[i]+1);
else if(val[i]>=550) {
t=find(1),ans[i]=(t==300001)?val[i]-1:(t%val[i]);
for(j=val[i];j<300001;j+=val[i])
(((t=find(j))==300001)?t=val[i]-1:t%=val[i]),(t<ans[i])?ans[i]=t:1;
}
}
for(i=1;i<=n;++i)
if(op[i]=='B') printf("%d\n",ans[i]);
return 0;
}
bzoj 4320: ShangHai2006 Homework的更多相关文章
- 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. ...
- 4320: ShangHai2006 Homework
4320: ShangHai2006 Homework 链接 分析: 分块.对权值模数进行分块,模数小于$\sqrt V$的($V$为权值上界),暴力处理. 模数大于$\sqrt V$的,设模数是k, ...
- 【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),然后倒着枚 ...
随机推荐
- Java基础知识【上】(转载)
http://blog.csdn.net/silentbalanceyh/article/details/4608272 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...
- 初识IOS,Label控件的应用。
初识IOS,Label控件的应用. // // ViewController.m // Gua.test // // Created by 郭美男 on 16/5/31. // Copyright © ...
- 离开Autodesk,开启新篇章
我已经离开了Autodesk,开启新篇章.在过去7年多时间中,我先后支持Autodesk 基础设施相关产品的开发,包括MapGuide/AIMS,Map3D,Civil 3D,Infraworks等, ...
- How To Join XLA_AE_HEADERS and RCV_TRANSACTIONS? [ID 558514.1]
Applies to: Oracle Inventory Management - Version: 12.0.6<max_ver> and later [Release: 12 an ...
- iOS从零开始学习直播之音频1.播放本地音频文件
现在直播越来越火,俨然已经成为了下一个红海.作为一个资深码农(我只喜欢这样称呼自己,不喜欢别人这样称呼我),我必须赶上时代的潮流,开始研究视频直播.发现视屏直播类的文章上来就讲拉流.推流.采集.美 ...
- [Erlang 0122] Erlang Resources 2014年1月~6月资讯合集
虽然忙,有些事还是要抽时间做; Erlang Resources 小站 2014年1月~6月资讯合集,方便检索. 小站地址: http://site.douban.com/204209/ ...
- JavaScript 事件
事件 概念:事件是可以被 JavaScript 侦测到的行为. JavaScript 使我们有能力创建动态页面.事件是可以被 JavaScript 侦测到的行为. 网页中的每个元素都可以产生某些可以触 ...
- MySQL 索引
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是 ...
- DOS下windows系统查看wifi密码
DOS下windows系统查看wifi密码 首先,按win+R键,win键如下 弹出框中输入cmd 在弹出界面输入 netsh wlan show profiles 你可以看到你链接过的所有wifi名 ...
- 堆排序(python实现)
堆排序是利用最大最或最小堆,废话不多说: 先给出几个概念: 二叉树:二叉树是每个节点最多有两个子树的树结构.通常子树被称作“左子树”(left subtree)和“右子树” 完全二叉树:除最后一层外, ...