题面链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4320

令M=sqrt(mx),把询问的Y按<M和>M 分成两种不同的处理方式。

1、对于>M的Y,我们发现它的倍数不超过M个,于是可以枚举倍数,找到往后第一个已经被加入集合的值,用差值更新答案。

这个东西我们可以离线,倒序枚举询问,然后用并查集维护。

单次查询O(M),更新O(1).

2、对于<M的Y,倍数肯定是>M,不过这样的Y也就M个,可以直接拿数组存,g[i]表示目前%i最小为多少(即答案),更新的时候直接遍历M个位置取min即可。

单次查询O(1),更新O(M).

所以总时间复杂度为O(n*sqrt(n))的。

#include<bits/stdc++.h>
using namespace std;
const int N = 300005;
#define rep(i,a,b) for(register int i=(a);i<=(b);++i)
#define dwn(i,a,b) for(register int i=(a);i>=(b);--i)
typedef long long ll;
int n,X[N],Y[N],ans[N],fa[N],g[N],kua,mx,mn;
bool vis[N];
char s[2];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
int main(){
memset(ans,-1,sizeof(ans));
scanf("%d",&n);
rep(i,1,n){
scanf("%s%d",s,&Y[i]);
if(s[0]=='A')X[i]=1,vis[Y[i]]=1;
else X[i]=2;
mx=max(mx,Y[i]);
}
kua=sqrt(mx)+1;
rep(i,0,mx+1)fa[i]=i;
dwn(i,mx,0){
if(vis[i])continue;
fa[find(i)]=find(i+1);
}
memset(g,0x3f,sizeof(g));
rep(i,1,n){
if(X[i]==1){
rep(j,1,kua){
g[j]=min(g[j],Y[i]%j);
}
}
else if(Y[i]<=kua)ans[i]=g[Y[i]];
}
dwn(i,n,1){
if(X[i]==1){
fa[find(Y[i])]=find(Y[i]+1);
}
else if(Y[i]>kua){
mn=1e9;
for(int j=0;j<=mx;j+=Y[i]){
if(find(j)>mx)continue;
mn=min(mn,find(j)-j);
}
ans[i]=mn;
}
}
rep(i,1,n)if(~ans[i])printf("%d\n",ans[i]);
return 0;
}

bzoj4320 homework 题解的更多相关文章

  1. 题解-bzoj4320 Homework

    Problem bzoj4320 Solution 前置技能:分块+线段树+卡常+一点小小的数学知识 考试时A的 这种题无论怎么处理总有瓶颈,套路分块,设\(k\)以下的插入时直接暴力预处理,查询时直 ...

  2. BZOJ4320 homework

    Description:给定\(n\)个操作,向集合中加入一个数(保证每个数不同)或者查询集合内\(\text{%Y}\)的最小值 Solution:对于小于\(\sqrt{300000}\)的直接暴 ...

  3. Sweet Round 1题解

    感谢各位参赛者,所有的题解如下: T1 syx的奖励 这题明显是签到题了吧,随便猜猜结论就A掉了 先说怎么做吧,把所有的可走的数gcd起来,然后再与n求gcd 如果为1,则输出n,若不为1,则输出-1 ...

  4. 【BZOJ4320】ShangHai2006 Homework 分段+并查集

    [BZOJ4320]ShangHai2006 Homework Description   1:在人物集合 S 中加入一个新的程序员,其代号为 X,保证 X 在当前集合中不存在.    2:在当前的人 ...

  5. HDU1789(Doing Homework again)题解

    HDU1789(Doing Homework again)题解 以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定任务分数和其截止日期,每日可完成一任务,输出当罚分尽可能小时 ...

  6. 【题解】HDU Homework(倍增)

    [题解]HDU Homework(倍增) 矩阵题一定要多多检查一下是否行列反了... 一百个递推项一定要存101个 说多了都是泪啊 一下午就做了这一道题因为实在是太菜了太久没写这种矩阵的题目... 设 ...

  7. Hdoj 1789 Doing Homework again 题解

    Problem Description Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of h ...

  8. [BZOJ4320][ShangHai2006]Homework(根号分治+并查集)

    对于<=sqrt(300000)的询问,对每个模数直接记录结果,每次加入新数时暴力更新每个模数的结果. 对于>sqrt(300000)的询问,枚举倍数,每次查询大于等于这个倍数的最小数是多 ...

  9. BZOJ4320 ShangHai2006 Homework(分块+并查集)

    考虑根号分块.对于<√3e5的模数,每加入一个数就暴力更新最小值:对于>√3e5的模数,由于最多被分成√3e5块,查询时对每一块找最小值,这用一些正常的DS显然可以做到log,但不太跑得过 ...

随机推荐

  1. 优化实例- not in 和 not exists

    客户运行一个SQL,非常慢.于是进行了一下改写.速度飞快,首先看一下原来的SQL. original sql SQL> explain plan for 2 select count(*) fr ...

  2. 你还在苦逼地findViewById吗?使用ButterKnife从此轻松定义控件

    前段时间笔者在苦逼地撸代码~最后发现有些复杂的界面在写了一屏幕的findviewbyid~~~另一堆setOnXXXListener~有没有方便一点的方法让我们简单点不用每次都定义一次.find一次, ...

  3. PHP array_intersect_key()

    定义和用法 array_intersect_key() 函数使用键名比较计算数组的交集. array_intersect_key() 返回一个数组,该数组包含了所有出现在被比较的数组中并同时出现在所有 ...

  4. MSP430WARE++的使用2:RSP1 driver的调用方法

        MSP430WARE是一套基于C++语言的开源的MSP430层次化软件架构,支持多种外设.本文将介绍雷达測速芯片RSP1驱动程序的调用方法.     1.硬件原理图      採用下图所看到的 ...

  5. Android 高亮指示层提示

    此库出自翔神之手   用起来绝对方便 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0J ...

  6. java js url传参中文乱码

    String item = this.getRequest().getParameter("item"); item = new String(item.getBytes(&quo ...

  7. U4704 函数

    U4704 函数 题目背景 设gcd(a,b)为a和b的最大公约数,xor(a,b)为a异或b的结果. 最大公约数 异或 题目描述 kkk总是把gcd写成xor.今天数学考试恰好出到了gcd(a,b) ...

  8. PCB拼板之单一矩形排样算法

    算法实现相关内容整理如下: 一.排样变量与关系 此算法,基于固定4边的尺寸遍历每个单只板的长宽得到最优解. 二.条件约束 基本约束条件(参考上图变量) 三.排样图形相同类型规律 由于计算量大,为了有效 ...

  9. Ruby 各种离奇运算符

    创建: 20170717 更新: 改变分类 Rails ---> Ruby 更新: 2017/10/16 增加&., #try 参考: 传送门  ||=   a ||= b相当于 a = ...

  10. bzoj3297[USACO2011 Open]forgot(dp + string)

    3297: [USACO2011 Open]forgot Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 137  Solved: 94[Submit] ...