codeforces Toy Sum

题意:给你x个集合的数,然后根据求y集合的数。

思路:根据对称性,先找出对称出现的个数cnt,然后对称位置的中如果出现一个的把另一个加入到y集合中,再找出cnt个对应位置都不出现的加入到y集合中。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <set>
 4 #include <algorithm>
 5 #define ll long long
 6 #define maxn 5000100
 7 using namespace std;
 8
 9 int n;
10 int x[maxn];
11 bool vis[maxn];
12
13 int main()
14 {
15     scanf("%d",&n);
16     ll s=1000000;
17     set<int>q;
18     set<int>::iterator it;
19     int cnt=0;
20     for(int i=1; i<=n; i++)
21     {
22         scanf("%d",&x[i]);
23         vis[x[i]]=true;
24     }
25     for(int i=1; i<=s/2; i++)
26     {
27         int xx=s-(i-1);
28         if(vis[i]&&vis[xx])
29         {
30             cnt++;
31         }
32     }
33     int j=1;
34     ll cc=s-(j-1);
35     while(j<=s/2)
36     {
37         if((!vis[j])&&vis[cc])
38         {
39             q.insert(j);
40         }
41         else if(vis[j]&&(!vis[cc]))
42         {
43             q.insert(cc);
44         }
45         j++;
46         cc=s-(j-1);
47     }
48     j=1;
49     cc=s-(j-1);
50     int t1=0;
51     while(j<=s/2&&t1<cnt)
52     {
53         if((!vis[j])&&(!vis[cc]))
54         {
55             q.insert(j);
56             q.insert(cc);
57             t1++;
58         }
59         if(t1==cnt) break;
60         j++;
61         cc=s-(j-1);
62     }
63     printf("%d\n",(int)q.size());
64     for(it=q.begin(); it!=q.end(); it++)
65     {
66         printf("%d ",(*it));
67     }
68     printf("\n");
69     return 0;
70 }

时间: 2024-10-18 08:16:19

codeforces Toy Sum的相关文章

codeforces 85D. Sum of Medians

二次联通门 : codeforces 85D. Sum of Medians /* codeforces 85D. Sum of Medians 正解线段树或是平衡树 结果用vector暴力卡过去了 */ #include <algorithm> #include <iostream> #include <cstdio> #include <vector> using namespace std; void read (int &now) { reg

Codeforces 85D Sum of Medians(线段树)

85D Sum of Medians 题目链接 题意:一个集合有添加,删除元素,每次查询输出集合位置为i % 5 == 3的位置和 思路:线段树,线段树记录下% 5 == 0, 1, 2, 3, 4的和,并且记录一个mov表示右移多少,每次添加一个值的时候,就当前位置之后的一整段位置都要右移一个单位,这样去搞线段树维护一下即可 代码: #include <cstdio> #include <cstring> #include <cstdlib> #include <

Codeforces 920F. SUM and REPLACE

题目大意: 一个数列 支持两种操作 1 把区间内的数变成他们自己的约数个数 2 求区间和 思路: 可以想到每个数最终都会变成2或1 然后我们可以线段树 修改的时候记录一下每段有没有全被修改成1或2 是的话就不修改了 不是就暴力修改 因为每个数被修改的次数很小 1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstdlib> 5 #include<cstring&g

CodeForces - 920F SUM and REPLACE (线段树)

题意:给N个数M次操作,(1<=N,M<=3e5, 1<=ai<=1e6),1是使[L,R]中的每个元素变成其因子的个数之和:2是求[L,R]区间之和 分析:看上去就很线段树的一题,但是却思考了很久.发现1和2即使对其,也不会改变二者的值.而且一个大于2的数进行多次1操作,也最终会退化到2. 先预处理筛出1e6以内各数的质因子个数和.在线段树的节点中维护两个值:区间和以及区间最大值.在update函数中,如果该区间的最大值不超过2,那么该区间没有更新的必要:若超过2,则递归向下找到

codeforces CF920F SUM and REPLACE 线段树 线性筛约数

$ \Rightarrow $ 戳我进CF原题 F. SUM and REPLACE time limit per test: 2 seconds memory limit per test: 256 megabytes input: standard input output: standard output Let $ D(x) $ be the number of positive divisors of a positive integer $ x $ . For example, $

[Codeforces 1242C]Sum Balance

Description 题库链接 给你 \(k\) 个盒子,第 \(i\) 个盒子中有 \(n_i\) 个数,第 \(j\) 个数为 \(x_{i,j}\).现在让你进行 \(k\) 次操作,第 \(i\) 次操作要求从第 \(i\) 个盒子中取出一个元素(这个元素最开始就在该盒子中),放入任意一个你指定的盒子中,要求经过 \(k\) 次操作后 所有盒子元素个数和最开始相同: 所有盒子元素总和相等 询问是否存在一种操作方式使之满足,若存在,输出任意一种方案即可. \(1\leq k\leq 15

CodeForces - 1327A Sum of Odd Integers(数学+思维)

Example input Copy 6 3 1 4 2 10 3 10 2 16 4 16 5 output Copy YES YES NO YES YES NO Note In the first test case, you can represent 3 as 3. In the second test case, the only way to represent 4 is 1+3. In the third test case, you cannot represent 10 as

codeforces 616E. Sum of Remainders 数学

题目链接 给两个数n, m. 求n%1+n%2+.......+n%m的值. 首先, n%i = n-n/i*i, 那么原式转化为n*m-sigma(i:1 to m)(n/i*i). 然后我们可以发现  1/4 = 2/4 = 3/4 = 0, 4/4 = 5/4 = 6/4 = 7/4 = 1. 所以可以将这些结果分成很多块, 按块算结果. 注意计算过程中时刻避免爆longlong. #include <iostream> #include <vector> #include

Codeforces Round #238 (Div. 1)

感觉这场题目有种似曾相识感觉,C题还没看,日后补上.一定要坚持做下去. A Unusual Product 题意: 给定一个n*n的01矩阵,3种操作, 1 i 将第i行翻转 2 i 将第i列翻转 3 询问矩阵第i行和第i列做向量乘法之和. 分析: 分析发现对于3的结果取决于对角线上1的个数num,即num%2,然后就很好做了,对于每次操作,只需要改变该行或该列后,对角线上仍然有多少个1. 代码: 1 #pragma comment(linker, "/STACK:16777216")