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的更多相关文章

  1. BZOJ.4320.[ShangHai2006]Homework(根号分治 分块)

    BZOJ \(\mathbb{mod}\)一个数\(y\)的最小值,可以考虑枚举剩余系,也就是枚举区间\([0,y),[y,2y),[2y,3y)...\)中的最小值(求后缀最小值也一样)更新答案,复 ...

  2. bzoj 4320: ShangHai2006 Homework【分块】

    按根号300000=m分情况讨论 查询是,当x小于等于m,那么可以暴力记录直接出解:否则,用分块维护区间值,查询的时候以x为步长跳根号m次取最小值即可 还有一种并查集方法,来自https://www. ...

  3. 4320: ShangHai2006 Homework

    4320: ShangHai2006 Homework 链接 分析: 分块.对权值模数进行分块,模数小于$\sqrt V$的($V$为权值上界),暴力处理. 模数大于$\sqrt V$的,设模数是k, ...

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

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

  5. 【bzoj4320】【ShangHai2006 Homework】【并查集+离线处理】

    ShangHai2006 Homework Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 918  Solved: 460[Submit][Statu ...

  6. BZOJ4320 : ShangHai2006 Homework

    取$M=\sqrt{300000}$. 设$g[i]$表示程序员的$\bmod i$最小的值. 若$Y<M$,那么可以在$O(M)$时间内完成对所有$g[i]$的修改,$O(1)$时间内完成查询 ...

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

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

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

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

  9. 【bzoj4320】ShangHai2006 Homework

    若Y小于等于sqrt(300000),暴力,对所有的插入的数都更新mn[i]. 若Y大于sqrt(300000),枚举kY,用并查集维护>=i的第一个数,这样只支持删除操作是O(1),然后倒着枚 ...

随机推荐

  1. Guava学习-缓存

    Guava的缓存是本地缓存,所以我觉得在使用场景上适合那种并非是高一致性的场景中,而且他的实现和ConcurrentHashMap很类似.但是毕竟是缓存嘛,肯定有自动清除的功能.外加一些什么清除策略等 ...

  2. js中eval详解,用Js的eval解析JSON中的注意点

    先来说eval的用法,内容比较简单,熟悉的可以跳过eval函数接收一个参数s,如果s不是字符串,则直接返回s.否则执行s语句.如果s语句执行结果是一个值,则返回此值,否则返回undefined. 需要 ...

  3. 自制一个能显示helloworld的最简单OS

    <自己动手写操作系统> org 07c00h mov ax,cs mov ds,ax mov es,ax call DispStr jmp $ DispStr: mov ax,BootMe ...

  4. NPO与X7R、X5R、Y5V、Z5U神马的有啥区别

    主要是介质材料不同.不同介质种类由于它的主要极化类型不一样,其对电场变化的响应速度和极化率亦不一样. 在相同的体积下的容量就不同,随之带来的电容器的介质损耗.容量稳定性等也就不同.介质材料划按容量的温 ...

  5. poj3159 最短路(差分约束)

    题意:现在需要分糖果,有n个人,现在有些人觉得某个人的糖果数不能比自己多多少个,然后问n最多能在让所有人都满意的情况下比1多多少个. 这道题其实就是差分约束题目,根据题中给出的 a 认为 b 不能比 ...

  6. [POJ1852]Ants

    Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 12431   Accepted: 5462 Description An a ...

  7. Android学习笔记(二)Git和Github

    一.添加SSH Key ssh-keygen -t rsa -C "email@example.com" 遇到提示只需要一直确认.用户目录(如/root)下会生成一个.ssh文件夹 ...

  8. 第一周作业.四则运算生成器(基于python)

    题目 从<构建之法>第一章的 "程序" 例子出发,像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 "软件",满足以下需求: 除了整数 ...

  9. BZOJ_1179_[Apio2009]Atm_tarjan+spfa

    BZOJ_1179_[Apio2009]Atm_tarjan+spfa 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1179 分析: 显然有环 ...

  10. golang包管理工具glide安装

    1:下载安装glide go get github.com/Masterminds/glide glide的源码以及exe文件在第一个gopath目录,如果不知道哪个是第一个gopath,echo一下 ...