【BZOJ4320】Homework
2015-11-20 21:00
369 查看
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;
Source
泥感受一下就知道传统数据结构做不了这题..什么权值BIT权值线段树统统死开..
但是我突然想到了2506的做法…因为插入的数互异而且非常小,所以是否可以像那样做
以上扯淡.以下题解
考虑给300000个数分块,小于sqrt(300000)暴力,大于sqrt(300000)分块维护,对每个y枚举倍数.(不过确实有受2506的启发啦..
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;
Source
泥感受一下就知道传统数据结构做不了这题..什么权值BIT权值线段树统统死开..
但是我突然想到了2506的做法…因为插入的数互异而且非常小,所以是否可以像那样做
以上扯淡.以下题解
考虑给300000个数分块,小于sqrt(300000)暴力,大于sqrt(300000)分块维护,对每个y枚举倍数.(不过确实有受2506的启发啦..
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define MAXN 300010 #define GET (ch>='0'&&ch<='9') using namespace std; int n=300000,cnt,size,T; int first[600],last[600],belong[MAXN]; int ans1[600],ans2[MAXN],ans[600]; char ch[3]; void in(int &x) { char ch=getchar();x=0; while (!GET) ch=getchar(); while (GET) x=x*10+ch-'0',ch=getchar(); } void insert(int x) { for (int i=1;i<=size;i++) ans1[i]=min(ans1[i],x%i); for (int i=first[belong[x]];i<=x;i++) ans2[i]=min(ans2[i],x); for (int i=belong[x]-1;i;i--) ans[i]=min(ans[i],x); } int Min(int x) { if (x==0) x=1;ans2[x]=min(ans2[x],ans[belong[x]]); return min(ans2[x],ans[belong[x]]); } int query(int x) { int ret=MAXN; if (x<size) return ans1[x]; for (int i=0,j=x;i<=n;i=j,j+=x) { j=min(j,n+1);int t=Min(i);ret=min(ret,t-i); } return ret; } int main() { in(T);int x;size=(int)(sqrt(3e5));cnt=n/size+(bool)(n%size); memset(ans1,0x3f,sizeof(ans1));memset(ans2,0x3f,sizeof(ans2));memset(ans,0x3f,sizeof(ans)); for (int i=1;i<=n;i++) belong[i]=(i-1)/size+1; for (int i=1;i<=cnt;i++) first[i]=size*(i-1)+1,last[i]=size*i; for (int i=1;i<=T;i++) { scanf("%s",ch+1);in(x); if (ch[1]=='A') insert(x); else printf("%d\n",query(x)); } }
相关文章推荐
- [BZOJ2038][2009国家集训队][莫队][分块]小z的袜子
- Codeforces538F A Heap of Heaps【分块+差分求前缀和】
- 大矩阵的分块乘法及matlab实现
- bzoj-2741 L
- bzoj-3585 mex
- 【Violet 6】【BZOJ2724】蒲公英
- [2009国家集训队]小Z的袜子(hose) 分块做法
- NBUT 1457 分块
- codeforces #307 E. GukiZ and GukiZiana (分块)
- Codeforces Round #307 (Div. 2)E. GukiZ and GukiZiana(分块)
- 【分块】 CF 551 E GukiZ and GukiZiana
- Codeforces Round #307 (Div. 2) E. GukiZ and GukiZiana (分块)
- Codeforces Gym 100589A Queries on the Tree(树状数组+分块)
- GFS中的数据完整性校验
- HDU 4676 Sum Of Gcd(欧拉函数求区间gcd之和+分块算法)
- Codeforces #307 (div2)
- UVA 12003 Array Transformer (分块)
- CodeChef COUNTARI Arithmetic Progressions FFT + 分块
- Codeforces Gym 100589A Queries on the Tree 树状数组 + 分块
- codeforces 86D. Powerful array(分块)