• Codeforces Round #556 (Div. 2)


    Problem  Codeforces Round #556 (Div. 2) - D. Three Religions

    Time Limit: 1000 mSec

    Problem Description

    Input

     

    Output

     

    Sample Input

    5
    1 2 1 2 1

    Sample Output

    1 1 1 2 2

    题解:这个题有做慢了,这种题做慢了和没做出来区别不大。。。

      读题的时候脑子里还意识到素数除了2都是奇数,读完之后就脑子里就只剩欧拉筛了,贪心地构造使得前缀和是连续的素数,那实现就很简单了,将素数序列的差分序列求出来,不断凑出差分序列的每个数即可,但是之后想想,除了2 和 3,每个的间隔不都是偶数么,肯定是连续的2呀,费劲算差分序列干什么,直接先放2再放1不就行了(特殊处理一下2 和 3 即可),写着写着还误以为要输出下标,临时改了改,等到测样例的时候发现是输出1、2,暴风哭泣。

      1 #include <bits/stdc++.h>
      2 
      3 using namespace std;
      4 
      5 #define REP(i, n) for (int i = 1; i <= (n); i++)
      6 #define sqr(x) ((x) * (x))
      7 
      8 const int maxn = 400000 + 10000;
      9 const int maxm = 200000 + 100;
     10 const int maxs = 10000 + 10;
     11 
     12 typedef long long LL;
     13 typedef pair<int, int> pii;
     14 typedef pair<double, double> pdd;
     15 
     16 const LL unit = 1LL;
     17 const int INF = 0x3f3f3f3f;
     18 const double eps = 1e-14;
     19 const double inf = 1e15;
     20 const double pi = acos(-1.0);
     21 const int SIZE = 100 + 5;
     22 const LL MOD = 1000000007;
     23 
     24 LL n;
     25 LL a[maxn];
     26 int cnt[5];
     27 LL cnt1, cnt2;
     28 LL tot, prime[maxn];
     29 bool is_prime[maxn];
     30 
     31 void Euler()
     32 {
     33     memset(is_prime, true, sizeof(is_prime));
     34     is_prime[0] = is_prime[1] = false;
     35     for (LL i = 2; i < maxn; i++)
     36     {
     37         if (is_prime[i])
     38         {
     39             prime[tot++] = i;
     40         }
     41         for (LL j = 0; j < tot && i * prime[j] < maxn; j++)
     42         {
     43             is_prime[prime[j] * i] = false;
     44             if (i % prime[j] == 0)
     45             {
     46                 break;
     47             }
     48         }
     49     }
     50 }
     51 
     52 vector<int> ans;
     53 queue<int> que[3];
     54 
     55 int main()
     56 {
     57     ios::sync_with_stdio(false);
     58     cin.tie(0);
     59     //freopen("input.txt", "r", stdin);
     60     //freopen("output.txt", "w", stdout);
     61     Euler();
     62     cin >> n;
     63     int x;
     64     LL sum = 0;
     65     for (int i = 1; i <= n; i++)
     66     {
     67         cin >> x;
     68         que[x].push(i);
     69         cnt[x]++;
     70         sum += x;
     71     }
     72     cnt1 = cnt[1], cnt2 = cnt[2];
     73     LL pre = 0;
     74     for (int i = 0; i < tot && prime[i] <= sum; i++)
     75     {
     76         LL tmp = prime[i] - pre;
     77         LL x = tmp / 2;
     78         x = min(x, cnt2);
     79         if (tmp - x * 2 <= cnt1)
     80         {
     81             pre = prime[i];
     82             for (int j = 0; j < x; j++)
     83             {
     84                 ans.push_back(2);
     85             }
     86             for (int j = 0; j < tmp - x * 2; j++)
     87             {
     88                 ans.push_back(1);
     89             }
     90             cnt2 -= x;
     91             cnt1 -= (tmp - x * 2);
     92         }
     93     }
     94     for(int i = 0; i < ans.size(); i++)
     95     {
     96         cout << ans[i] << " ";
     97     }
     98     while(cnt1--)
     99     {
    100         cout << 1 << " ";
    101     }
    102     while(cnt2--)
    103     {
    104         cout << 2 << " ";
    105     }
    106     return 0;
    107 }
  • 相关阅读:
    让svn自动更新代码注释中的版本号
    前端开发利器F5
    当inlineblock和textindent遇到IE6,IE7
    DSL与函数式编程
    [译]当Node.js遇上WebMatrix 2
    《大道至简》的读后感
    深度学习之卷积神经网络之一
    ORACLE TRUNC()函数
    oracle rownum
    ORACLE 忽略已有重复值 创建唯一约束
  • 原文地址:https://www.cnblogs.com/npugen/p/10798353.html
Copyright © 2020-2023  润新知