2793 [Poi2012]Vouchers

我们直接模拟就可以了= =

now[x]表示x的倍数已经取到x * i了,于是每次读入x,直接向上枚举x个没取过的数即可。

 1 /**************************************************************
 2     Problem: 2793
 3     User: rausen
 4     Language: C++
 5     Result: Accepted
 6     Time:5296 ms
 7     Memory:14476 kb
 8 ****************************************************************/
 9
10 #include <cstdio>
11 #include <algorithm>
12
13 using namespace std;
14 typedef long long ll;
15 const int N = 1000005;
16
17 int n, m, mx;
18 int now[N];
19 ll tot, ans[N], cnt;
20 bool f[N], vis[N];
21
22 inline int read() {
23     int x = 0, sgn = 1;
24     char ch = getchar();
25     while (ch < ‘0‘ || ‘9‘ < ch) {
26         if (ch == ‘-‘) sgn = -1;
27         ch = getchar();
28     }
29     while (‘0‘ <= ch && ch <= ‘9‘) {
30         x = x * 10 + ch - ‘0‘;
31         ch = getchar();
32     }
33     return sgn * x;
34 }
35
36 int main() {
37     int i, x, t, C;
38     for (m = read(), i = 1; i <= m; ++i) {
39         x = read();
40         f[x] = 1, mx = max(mx, x);
41     }
42
43     n = read();
44     while (n--) {
45         x = t = read();
46         for (i = now[x] + x, C = 0; i <= mx; i += x) {
47             if (!vis[i]) {
48                 ++cnt, --t, vis[i] = 1;
49                 if (f[i]) ans[++tot] = cnt;
50                 if (++C == x) break;
51             }
52             now[x] = i;
53         }
54         cnt += t;
55     }
56     printf("%lld\n", tot);
57     for (i = 1; i <= tot; ++i)
58         printf("%lld\n", ans[i]);
59 }

(p.s. 没有的搞懂,一开始各种WA,把ans数组改成long long就AC了?蒟蒻跪求大神求教)

时间: 2024-08-09 19:51:38

2793 [Poi2012]Vouchers的相关文章

[BZOJ2793][Poi2012]Vouchers

2793: [Poi2012]Vouchers Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 316  Solved: 148[Submit][Status][Discuss] Description 考虑正整数集合,现在有n组人依次来取数,假设第i组来了x人,他们每个取的数一定是x的倍数,并且是还剩下的最小的x个.正整数中有m个数被标成了幸运数,问有哪些人取到了幸运数. Input 第一行一个正整数m (m<=1,000,000),下面m行每行一

【BZOJ2793】【数学】[Poi2012]Vouchers

Description 考虑正整数集合,现在有n组人依次来取数,假设第i组来了x人,他们每个取的数一定是x的倍数,并且是还剩下的最小的x个. 正整数中有m个数被标成了幸运数,问有哪些人取到了幸运数. Input 第一行一个正整数m (m<=1,000,000),下面m行每行一个正整数x (x<=1,000,000),表示x是一个幸运数. 接下来一行一个正整数n (n<=1,000,000),下面n行每行一个正整数x (x<=1,000,000),表示这一组来了x个人. Output

【bzoj2793】[Poi2012]Vouchers 暴力

题目描述 考虑正整数集合,现在有n组人依次来取数,假设第i组来了x人,他们每个取的数一定是x的倍数,并且是还剩下的最小的x个.正整数中有m个数被标成了幸运数,问有哪些人取到了幸运数. 输入 第一行一个正整数m (m<=1,000,000),下面m行每行一个正整数x (x<=1,000,000),表示x是一个幸运数.接下来一行一个正整数n (n<=1,000,000),下面n行每行一个正整数x (x<=1,000,000),表示这一组来了x个人. 输出 第一行输出一个非负整数k,表示

Bzoj 2789: [Poi2012]Letters 树状数组,逆序对

2789: [Poi2012]Letters Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 278  Solved: 185[Submit][Status][Discuss] Description 给出两个长度相同且由大写英文字母组成的字符串A.B,保证A和B中每种字母出现的次数相同. 现在每次可以交换A中相邻两个字符,求最少需要交换多少次可以使得A变成B. Input 第一行一个正整数n (2<=n<=1,000,000),表示字符串的长度

[BZOJ2797][Poi2012]Squarks

2797: [Poi2012]Squarks Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 211  Solved: 89[Submit][Status][Discuss] Description 设有n个互不相同的正整数{X1,X2,...Xn},任取两个Xi,Xj(i≠j),能算出Xi+Xj.现在所有取法共n*(n-1)/2个和,要你求出X1,X2,...Xn. Input 第一行一个正整数n (3<=n<=300).第二行n*(n-1)/2

POI2012 (持续更新中)

Distance Well Vouchers Cloakroom A Horrible Poem Rendezvous Fibonacci Representation Squarks

[BZOJ2791][Poi2012]Rendezvous

2791: [Poi2012]Rendezvous Time Limit: 25 Sec  Memory Limit: 128 MBSubmit: 95  Solved: 71[Submit][Status][Discuss] Description 给定一个n个顶点的有向图,每个顶点有且仅有一条出边.对于顶点i,记它的出边为(i, a[i]).再给出q组询问,每组询问由两个顶点a.b组成,要求输出满足下面条件的x.y:1. 从顶点a沿着出边走x步和从顶点b沿着出边走y步后到达的顶点相同.2.

[BZOJ2795][Poi2012]A Horrible Poem

2795: [Poi2012]A Horrible Poem Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 261  Solved: 150[Submit][Status][Discuss] Description 给出一个由小写英文字母组成的字符串S,再给出q个询问,要求回答S某个子串的最短循环节.如果字符串B是字符串A的循环节,那么A可以由B重复若干次得到. Input 第一行一个正整数n (n<=500,000),表示S的长度.第二行n个小

[BZOJ2792][Poi2012]Well

2792: [Poi2012]Well Time Limit: 40 Sec  Memory Limit: 64 MBSubmit: 137  Solved: 61[Submit][Status][Discuss] Description 给出n个正整数X1,X2,...Xn,可以进行不超过m次操作,每次操作选择一个非零的Xi,并将它减一. 最终要求存在某个k满足Xk=0,并且z=max{|Xi - Xi+1|}最小. 输出最小的z和此时最小的k. Input 第一行两个正整数n, m (1<=