【BZOJ4320】ShangHai2006 Homework

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; 

题解:第一眼看题就想到分段,看题解要用并查集一下子就怂了,不过点进去之后发现还是分段。。。

设m表示x的最大值,对于y<=sqrt(m)的询问,我们可以开个桶,每次暴力维护,对于y>sqrt(m)的询问,我们可以枚举(x/y)*y的位置,然后找到比它大的,最近的x,这就要用到并查集。考虑离线处理,将加点变成删点,每删除一个点就相当于把两个小区间合并。我们查找的时候找的就是区间的右端点。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int n,m,siz;
int f[300010],ans[100010],q[100010],vis[300010],st[410];
char str[10];
int find(int x)
{
return (f[x]==x)?x:(f[x]=find(f[x]));
}
int main()
{
scanf("%d",&n);
siz=400;
int i,j;
memset(st,0x3f,sizeof(st));
for(i=1;i<=n;i++)
{
scanf("%s%d",str,&q[i]);
if(str[0]=='A')
{
for(j=1;j<=siz;j++) st[j]=min(st[j],q[i]%j);
m=max(m,q[i]),vis[q[i]]=1,q[i]=-q[i];
}
else if(q[i]<=siz) ans[i]=st[q[i]];
}
for(i=0;i<=m+1;i++) f[i]=(vis[i])?i:i+1;
for(i=n;i>=1;i--)
{
if(q[i]<0) f[-q[i]]=find(-q[i]+1);
else
{
if(q[i]>siz)
{
ans[i]=1<<30;
for(j=0;j<=m;j+=q[i]) ans[i]=min(ans[i],find(j)%q[i]);
}
}
}
for(i=1;i<=n;i++) if(q[i]>0) printf("%d\n",ans[i]);
return 0;
}

【BZOJ4320】ShangHai2006 Homework 分段+并查集的更多相关文章

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

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

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

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

  3. BZOJ4320 : ShangHai2006 Homework

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

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

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

  5. 【bzoj4320】ShangHai2006 Homework

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

  6. bzoj 4320: ShangHai2006 Homework

    4320: ShangHai2006 Homework Time Limit: 10 Sec Memory Limit: 128 MB Description 1:在人物集合 S 中加入一个新的程序员 ...

  7. POJ 1456 (贪心+并查集) Supermarket

    有n件商品,每件商品有它的利润和售出的最后期限,问能够得到的最大利润是多少 这道题和 HDU 1789 Doing Homework again 几乎一模一样,只不过这个是求最的扣分,本题是求最大利润 ...

  8. hdu6109(并查集+set/倍增)

    题目 http://acm.hdu.edu.cn/showproblem.php?pid=6109 分析 对于相同的条件,明显直接并查集 对于不同的条件,可以用set来保存,并查集合并的时候也要对se ...

  9. 【BZOJ2342】双倍回文(manacher,并查集)

    题意: 思路:From http://blog.sina.com.cn/s/blog_8d5d2f04010196bh.html 首先我可以看出: (1)我们找到的串的本身也是一个回文串(显然) (2 ...

随机推荐

  1. ylbtech_dbs_article_五大主流数据库模型

    ylbtech_dbs_article 摘要:什么是数据模型? 访问数据库中的数据取决于数据库实现的数据模型.数据模型会影响客户端通过API对数据的操作.不同的数据模型可能会提供或多或少的功能.一般而 ...

  2. rsync数据同步工具的配置

    rsync数据同步工具的配置 1. rsync介绍 1.1.什么是rsync rsync是一款开源的快速的,多功能的,可实现全量及增量的本地或远程数据同步备份的优秀工具.Rsync软件适用于 unix ...

  3. 修改PHP上传文件的大小限制(post)

    在PHP的默认配置情况下,当上传的文件大小超出一定的限制时,我们将得到如下的错误提示信息: Warning: POST Content-Length of 625523488 bytes exceed ...

  4. 飘逸的python - 实现一个pretty函数美丽的输出嵌套字典

    演示样例: d = { "root": { "folder2": { "item2": None, "item1": N ...

  5. PS 如何制作球面化文字效果

    球面化文字效果图....   00newopen-a   00newopen-b     01mew+channel   02ctrl+L   03ctrl+I   04new+wenzi   05R ...

  6. 解决ie7下overflow:hidden失效问题

    但父亲元素下面的子节点或者孙子节点有position:relative:或者absolute时,父亲即使设置了overflow:hidden:依然会溢出 解决方法可以: 在父亲元素上加上*positi ...

  7. js 导入json配置文件

    import AA from './menu.json' console.log(AA) 匹配好路径

  8. jquery ui widget 源代码分析

    jquery ui 的全部组件都是基于一个简单,可重用的widget. 这个widget是jquery ui的核心部分,有用它能实现一致的API.创建有状态的插件,而无需关心插件的内部转换. $.wi ...

  9. 原生JS实现的h5小游戏-植物大战僵尸

    代码地址如下:http://www.demodashi.com/demo/12755.html 项目介绍 本项目是利用原生js实现的h5小游戏-植物大战僵尸,主要结合了一下自己对于h5小游戏的理解,结 ...

  10. Shell计算器

    #!/bin/bash # filename : jisuan.sh # description : add, subtract, multiply, and divide print_usage() ...