4320: 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,每行输出一个合法答案。
Orz..PoPoQQQ
#include
#include
#include
#include
#define maxn 300010
using namespace std;
void read(int &num){
num = 0;char ch = getchar();
for(; ch < '!'; ch = getchar());
for(; ch > '!'; ch = getchar())
num = (num << 3) + (num << 1) + (ch ^ 48);
}
int n;
struct Qry{
int type, val, ans;
}q[maxn];
bool mark[maxn];
int fa[maxn];
int getfa(int x){
if(fa[x] == 0 || fa[x] == x)
return fa[x] = x;
return fa[x] = getfa(fa[x]);
}
int main(){
read(n);
int mx = 0;
for(int i = 1; i <= n; i ++){
char ch = getchar();
for(; ch < '!'; ch = getchar());
q[i].type = ch == 'B';
read(q[i].val);
if(ch == 'A')mark[q[i].val] = true;
mx = max(mx, q[i].val);
}
for(int i = mx; i >= 0; i --){
if(mark[i])fa[i] = i;
else fa[i] = i + 1;
}
int blo = 600;
for(int i = n; i >= 1; i --){
if(q[i].type && q[i].val > blo){
int ret = 0x7fffffff;
for(int j = 0; j <= mx; j += q[i].val){
int p = getfa(j);
if(p <= mx)//HERE!!
ret = min(ret, p % q[i].val);
}
q[i].ans = ret;
}
if(!q[i].type)
fa[q[i].val] = q[i].val + 1;
}
static int mod[610];
memset(mod, 0x7f, sizeof mod);
mod[1] = 0;
for(int i = 1; i <= n; i ++){
if(q[i].type && q[i].val <= blo)
q[i].ans = mod[q[i].val];
if(!q[i].type){
for(int j = 2; j <= blo; j ++)
mod[j] = min(mod[j], q[i].val % j);
}
}
for(int i = 1; i <= n; i ++)
if(q[i].type)printf("%d\n", q[i].ans);
return 0;
}