zoukankan      html  css  js  c++  java
  • 2018-2019 ICPC, NEERC, Northern Eurasia Finals (Unrated, Online Mirror, ICPC Rules, Teams Preferred) Solution

    A. Alice the Fan

    Solved.

    题意:

    两个人打网球,要求teamA 的得分与其他队伍拉开尽量大

    输出合法的方案

    思路:

     $dp[i][j][k][l] 表示 A 赢i局,其他队伍赢j局,两个人比分为k : l 的时候的方案$

      1 #include<bits/stdc++.h>
      2 
      3 using namespace std;
      4 
      5 int dp[5][5][210][210];
      6 vector<pair<int, int> >out[5][5][210][210];
      7 
      8 void Init()
      9 {
     10     dp[0][0][0][0] = 1;
     11     for(int sum = 0; sum <= 4; ++sum)
     12     {
     13         for(int l = 0; l <= sum; ++l)
     14         {
     15             for(int i = 0; i <= 200; ++i)
     16             {
     17                 for(int j = 0; j <= 200; ++j)
     18                 {
     19                     int r = sum - l;
     20                     if(!dp[l][r][i][j]) continue;
     21                     if(max(l, r) >= 3) continue;
     22                     int limit = 25;
     23                     if(sum == 4) limit = 15;
     24                     for(int tmp = limit; tmp <= 200; ++tmp)
     25                     {
     26                         if(i + tmp <= 200 && j + tmp - 2 <= 200 && !dp[l + 1][r][i + tmp][j + tmp - 2])
     27                         {
     28                             dp[l + 1][r][i + tmp][j + tmp - 2] = 1;
     29                             out[l + 1][r][i + tmp][j + tmp - 2] = out[l][r][i][j];
     30                             out[l + 1][r][i + tmp][j + tmp - 2].push_back(make_pair(tmp, tmp - 2));
     31                         }
     32                         if(i + tmp - 2 <= 200 && j + tmp <= 200 && !dp[l][r + 1][i + tmp - 2][j + tmp])
     33                         {
     34                             dp[l][r + 1][i + tmp - 2][j + tmp] = 1;
     35                             out[l][r + 1][i + tmp - 2][j + tmp] = out[l][r][i][j];
     36                             out[l][r + 1][i + tmp - 2][j + tmp].push_back(make_pair(tmp - 2, tmp));
     37                         }
     38                     }
     39 
     40                     for(int tmp = 0; tmp <= limit - 2; ++tmp)
     41                     {
     42                         if(i + limit <= 200 && j + tmp <= 200 && !dp[l + 1][r][i + limit][j + tmp])
     43                         {
     44                             dp[l + 1][r][i + limit][j + tmp] = 1;
     45                             out[l + 1][r][i + limit][j + tmp] = out[l][r][i][j];
     46                             out[l + 1][r][i + limit][j + tmp].push_back(make_pair(limit, tmp));
     47                         }
     48                         if(i + tmp <= 200 && j + limit <= 200 && !dp[l][r + 1][i + tmp][j + limit])
     49                         {
     50                             dp[l][r + 1][i + tmp][j + limit] = 1;
     51                             out[l][r + 1][i + tmp][j + limit] = out[l][r][i][j];
     52                             out[l][r + 1][i + tmp][j + limit].push_back(make_pair(tmp, limit));
     53                         }
     54                     }
     55                 }
     56             }
     57         }
     58     }
     59 }
     60 
     61 int a, b;
     62 
     63 int main()
     64 {
     65     Init();
     66     int t;
     67     scanf("%d", &t);
     68     while(t--)
     69     {
     70         scanf("%d %d", &a, &b);
     71         int l = -1, r = -1;
     72         if(dp[3][0][a][b])
     73         {
     74             l = 3;
     75             r = 0;
     76         }
     77         else if(dp[3][1][a][b])
     78         {
     79             l = 3;
     80             r = 1;
     81         }
     82         else if(dp[3][2][a][b])
     83         {
     84             l = 3;
     85             r = 2;
     86         }
     87         else if(dp[2][3][a][b])
     88         {
     89             l = 2;
     90             r = 3;
     91         }
     92         else if(dp[1][3][a][b])
     93         {
     94             l = 1;
     95             r = 3;
     96         }
     97         else if(dp[0][3][a][b])
     98         {
     99             l = 0;
    100             r = 3;
    101         }
    102         if(l == -1 && r == -1)
    103         {
    104             puts("Impossible");
    105         }
    106         else
    107         {
    108             printf("%d:%d
    ", l, r);
    109             int len = out[l][r][a][b].size();
    110             for(int i = 0; i < len; ++i) printf("%d:%d%c", out[l][r][a][b][i].first, out[l][r][a][b][i].second, " 
    "[i == len - 1]);
    111         }
    112     }
    113     return 0;
    114 }
    View Code

    B:Bimatching

    Unsolved.

    题意:

    $有n个男生和m个女生,一个男生要找两个女生组成一个三元祖进行跳舞$

    $当且仅当那个男生同时喜欢另两个女生的时候,他们可以组成三元祖跳舞$

    $求最多的三元祖个数$

    C:Cactus Search

    Unsolved.

    D:Distance Sum

    Unsolved.

    题意:

    给出一张无向图,求$sum_{1 <= i <= n}  sum_{1 <= j <= i} d(i, j) $

    E:Easy Chess

    Solved.

    题意:

    从左下角出发到右上角,每个点只能停留一次,且必须停留n次

    给出方案

    思路:

    暴力构造

    最后一轮的时候注意绕一个圈

      1 #include<bits/stdc++.h>
      2 
      3 using namespace std;
      4 
      5 int n;
      6 
      7 int main()
      8 {
      9     while(~scanf("%d", &n))
     10     {
     11         if(n == 2)
     12             cout << "a1 h1 h8" << endl;
     13         else if(n == 3)
     14             cout << "a1 a2 h2 h8" << endl;
     15         else if(n == 4)
     16             cout << "a1 a2 a3 h3 h8" << endl;
     17         else if(n == 5)
     18             cout << "a1 a2 a3 a4 h4 h8" << endl;
     19         else if(n == 6)
     20             cout << "a1 a2 a3 a4 a5 h5 h8" << endl;
     21         else if(n == 7)
     22             cout << "a1 a2 a3 a4 a5 a6 h6 h8" << endl;
     23         else if(n == 8)
     24             cout << "a1 a2 a3 a4 a5 a6 a7 h7 h8" << endl;
     25         else if(n == 9)
     26             cout << "a1 a2 a3 a4 a5 a6 a7 a8 g8 h8" << endl;
     27         else if(n == 10)
     28             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 g8 h8" << endl;
     29         else if(n == 11)
     30             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 h7 h8" << endl;
     31         else if(n == 12)
     32             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 h6 h8" << endl;
     33         else if(n == 13)
     34             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 h5 h8" << endl;
     35         else if(n == 14)
     36             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 h4 h8" << endl;
     37         else if(n == 15)
     38             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 h3 h8" << endl;
     39         else if(n == 16)
     40             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 h2 h8" << endl;
     41         else if(n == 17)
     42             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 h1 h8" << endl;
     43         else if(n == 18)
     44             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 h1 h8" << endl;
     45         else if(n == 19)
     46             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 h2 h8" << endl;
     47         else if(n == 20)
     48             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 h3 h8" << endl;
     49         else if(n == 21)
     50             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 h4 h8" << endl;
     51         else if(n == 22)
     52             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 h5 h8" << endl;
     53         else if(n == 23)
     54             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 h6 h8" << endl;
     55         else if(n == 24)
     56             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 h7 h8" << endl;
     57         else if(n == 25)
     58             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 g8 h8" << endl;
     59         else if(n == 26)    
     60             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 g8 h8" << endl;
     61         else if(n == 27)
     62             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 h7 h8" << endl;
     63         else if(n == 28)
     64             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 h6 h8" << endl;
     65         else if(n == 29)
     66             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 h5 h8" << endl;
     67         else if(n == 30)
     68             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 h4 h8" << endl;
     69         else if(n == 31)
     70             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 h3 h8" << endl;
     71         else if(n == 32)
     72             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 h2 h8" << endl;
     73         else if(n == 33)
     74             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 h1 h8" << endl;
     75         else if(n == 34)
     76             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 h1 h8" << endl;
     77         else if(n == 35)
     78             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 h2 h8" << endl;
     79         else if(n == 36)
     80             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 h3 h8" << endl;
     81         else if(n == 37)
     82             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 h4 h8" << endl;
     83         else if(n == 38)
     84             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 h5 h8" << endl;
     85         else if(n == 39)
     86             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 h6 h8" << endl;
     87         else if(n == 40)
     88             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 h7 h8" << endl;
     89         else if(n == 41)
     90             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 g8 h8" << endl;
     91         else if(n == 42)
     92             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 g8 h8" << endl;
     93         else if(n == 43)
     94             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 h7 h8" << endl;
     95         else if(n == 44)
     96             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 h6 h8" << endl;
     97         else if(n == 45)
     98             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 h5 h8" << endl;
     99         else if(n == 46)
    100             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 h4 h8" << endl;
    101         else if(n == 47)
    102             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 h3 h8" << endl;
    103         else if(n == 48)
    104             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 h2 h8" << endl;
    105         else if(n == 49)
    106             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h8" << endl;
    107         else if(n == 50)
    108             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h2 h8" << endl;
    109         else if(n == 51)
    110             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h2 h3 h8" << endl;
    111         else if(n == 52)
    112             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h2 h3 h4 h8" << endl;
    113         else if(n == 53)
    114             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h2 h3 h4 h5 h8" << endl;
    115         else if(n == 54)
    116             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h2 h3 h4 h5 h6 h8" << endl;
    117         else if(n == 55)
    118             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h2 h3 h4 h5 h6 h7 h8" << endl;
    119         else if(n == 56)
    120             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h2 h3 h4 h5 g5 g6 g8 h8" << endl;
    121         else if(n == 57)
    122             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h2 h3 h4 h5 g5 g6 g7 g8 h8" << endl;
    123         else if(n == 58)
    124             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h2 h3 h4 h5 h6 h7 g7 g1 g8 h8" << endl;
    125         else if(n == 59)
    126             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h2 h3 h4 h5 h6 h7 g7 g1 g2 g8 h8" << endl;
    127         else if(n == 60)
    128             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h2 h3 h4 h5 h6 h7 g7 g1 g2 g3 g8 h8" << endl;
    129         else if(n == 61)
    130             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h2 h3 h4 h5 h6 h7 g7 g1 g2 g3 g4 g8 h8" << endl;
    131         else if(n == 62)
    132             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h2 h3 h4 h5 h6 h7 g7 g1 g2 g3 g4 g5 g8 h8" << endl;
    133         else if(n == 63)
    134             cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h2 h3 h4 h5 h6 h7 g7 g1 g2 g3 g4 g5 g6 g8 h8" << endl;
    135     }
    136     return 0;
    137 }
    View Code

    F. Fractions

    Solved.

    题意:

    $令b_i为n的因数$

    $求找到k对 a_i 和 b_i$

    使得

    $sum_{i = 1}^{k} frac {a_i}{b_i} = 1 - frac{1}{n}$

    思路:

    显然,我们只需要找到两对

    令其为$a_1, b_1, a_2, b_2$

    有$frac{a_1}{b_1} + frac{a_2}{b_2} = frac{n - 1}{n}$

    有$frac{a_1 cdot b_2 + a_2 cdot b_1} {b_1 cdot b_2} = frac{n - 1}{n}$

    有 $n = b_1 cdot b_2$

    那么$b_1 = frac{n}{b_2}$

    代入其中 得到

    $a_1 cdot b_2 + frac{a_2 cdot n} {b_2} = n - 1$

    $固定b_2 枚举a_1 求解 或者 exgcd 也可以$

     1 #include<bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 typedef long long ll;
     6 
     7 ll n;
     8 
     9 int main()
    10 {
    11     while(~scanf("%lld", &n))
    12     {
    13         ll tmp = n;
    14         vector<ll>vec;
    15         for(ll i = 2; i * i <= tmp; ++i)
    16         {
    17             if(tmp % i == 0)
    18             {
    19                 ll res = 1;
    20                 while(tmp % i == 0)
    21                 {
    22                     tmp /= i;
    23                     res *= i;
    24                 }
    25                 vec.push_back(res);
    26             }
    27         }
    28         if(tmp != 1) vec.push_back(tmp);
    29         if(vec.size() <= 1)
    30         {
    31             puts("NO");
    32         }
    33         else
    34         {
    35             puts("YES
    2");
    36             ll num1 = vec[0];
    37             for(ll i = 1; ; ++i)
    38             {
    39                 ll num2 = n - 1 - n / num1 * i;
    40                 if(num2 % num1 == 0)
    41                 {
    42                     printf("%lld %lld
    ", i, num1);
    43                     printf("%lld %lld
    ", num2 / num1 , n / num1);
    44                     break;
    45                 }
    46             }
    47         }
    48     }
    49     return 0;
    50 }
    View Code

    G. Guest Student

    Water.

     1 #include<bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 typedef long long ll;
     6 const int INF = 0x3f3f3f3f;
     7 ll n;
     8 int used[20];
     9 
    10 int main()
    11 {
    12     int t;
    13     scanf("%d", &t);
    14     while(t--)
    15     {
    16         ll tot = 0;
    17         scanf("%lld", &n);
    18         for(int i = 1; i <= 7; ++i)
    19         {
    20             scanf("%d", used + i);
    21             tot += used[i];
    22             used[i + 7] = used[i];
    23         }
    24         ll tmp = (n - 1) / tot;
    25         ll ans = 7 * tmp;
    26         ll remind = n - tmp * tot;
    27         ll res = INF;
    28         for(int i = 1; i <= 7; ++i)
    29         {
    30             if(used[i])
    31             {
    32                 ll pos = i;
    33                 ll tmp = 0;
    34                 while(tmp < remind) tmp += used[pos++];
    35                 res = min(res, pos - i);
    36             }
    37         }
    38         printf("%lld
    ", ans + res);
    39     }
    40     return 0;
    41 }
    View Code
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 #define INF 0x3f3f3f3f
     5 int used[20], fa[20];
     6 int t, n;
     7 
     8 int main()
     9 {
    10     scanf("%d", &t);
    11     while (t--)
    12     {
    13         scanf("%d", &n);
    14         memset(used, 0, sizeof used);
    15         memset(fa, 0, sizeof fa);
    16         int tot = 0;
    17         int pre = 0;  
    18         for (int i = 1; i <= 7; ++i) 
    19         {
    20             scanf("%d", used + i);
    21             tot += used[i];
    22             fa[i] = pre;
    23             if (used[i]) pre = i; 
    24         }  
    25         for (int i = 8; i <= 14; ++i) used[i] = used[i - 7];   
    26         int remind = n % tot, need = (remind ? n / tot : n / tot - 1) * 7, res = INF;  
    27         if (!remind) remind = tot;
    28         for (int i = 1; i <= 14; ++i) if (used[i]) 
    29         { 
    30             int cnt = 0, tmp = 0; 
    31             for (int j = i; j <= 14 && cnt < remind; ++j) 
    32             {
    33                 cnt += used[j]; 
    34                 ++tmp;
    35             }
    36             if (cnt == remind) res = min(res, need + tmp); 
    37         }
    38         printf("%d
    ", res);
    39     }
    40     return 0;
    41 }
    View Code

    H:Harder Satisfiability

    Unsolved.

    I. Interval-Free Permutations

    Unsolved.

    J. JS Minification

    Unsolved.

    K. King Kog's Reception

    Upsoved.

    题意:

    维护一个队列,骑士在$a_i时刻进入,并且占用b_i的时间, 求从t_i时刻进入需要等待多少时间才能轮到$

    思路:

    发现$t_i完事的时间为Max_j <= i(a_j + sum_{j <= k <= i} b_i)$ 然后线段树维护

    置于为什么是这样

    我们考虑如果我们选取的$a_j 到 a_i 中间有空白时间段的话,那么后移j肯定使得值更优$

    $否则有重叠部分的话,不会有问题$

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 #define ll long long
     5 #define N 1000010
     6 int q;
     7 int p[N], v[N];
     8 
     9 namespace SEG
    10 {
    11     struct node
    12     {
    13         ll sum, Max;
    14         node () 
    15         {
    16             sum = Max = 0; 
    17         }
    18         node operator + (const node &other) const
    19         {
    20             node res;
    21             res.sum = sum + other.sum;
    22             res.Max = max(other.Max, Max + other.sum); 
    23             return res;  
    24         }
    25     }a[N << 2], res;
    26     void build(int id, int l, int r)
    27     {
    28         a[id] = node();
    29         if (l == r)
    30         {
    31             a[id].sum = 0; 
    32             a[id].Max = l;
    33             return;
    34         }
    35         int mid = (l + r) >> 1;
    36         build(id << 1, l, mid);
    37         build(id << 1 | 1, mid + 1, r);
    38         a[id] = a[id << 1] + a[id << 1 | 1];
    39     }
    40     void update(int id, int l, int r, int pos, int val)
    41     {
    42         if (l == r)
    43         {
    44             a[id].sum += val;   
    45             a[id].Max += val;     
    46             return;
    47         }
    48         int mid = (l + r) >> 1;
    49         if (pos <= mid) update(id << 1, l, mid, pos, val);
    50         else update(id << 1 | 1, mid + 1, r, pos, val);
    51         a[id] = a[id << 1] + a[id << 1 | 1];
    52     }
    53     void query(int id, int l, int r, int ql, int qr)
    54     {
    55         if (l >= ql && r <= qr)
    56         {
    57             res = res + a[id];
    58             return; 
    59         }
    60         int mid = (l + r) >> 1;
    61         if (ql <= mid) query(id << 1, l, mid, ql, qr);  
    62         if (qr > mid) query(id << 1 | 1, mid + 1, r, ql, qr);
    63     }
    64 }
    65 
    66 int main()
    67 {
    68     while (scanf("%d", &q) != EOF)
    69     {
    70         SEG::build(1, 1, 1000000);
    71         char op; int x, y;
    72         for (int i = 1; i <= q; ++i)
    73         {
    74             scanf(" %c%d", &op, p + i);
    75             if (op == '+')
    76             {
    77                 scanf("%d", v + i);
    78                 SEG::update(1, 1, 1000000, p[i], v[i]);
    79             }
    80             else if (op == '-')
    81                 SEG::update(1, 1, 1000000, p[p[i]], -v[p[i]]);
    82             else
    83             {
    84                 SEG::res = SEG::node(); 
    85                 SEG::query(1, 1, 1000000, 1, p[i]); 
    86                 printf("%lld
    ", SEG::res.Max - p[i]); 
    87             }
    88         }        
    89     }    
    90     return 0;
    91 }
    View Code

    L. Lazyland

    Water.

     1 #include<bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 typedef long long ll;
     6 
     7 const int maxn = 1e5 + 10;
     8 
     9 int n, k;
    10 ll vis[maxn];
    11 ll arr[maxn], brr[maxn];
    12 
    13 int main()
    14 {
    15     while(~scanf("%d %d", &n, &k))
    16     {
    17         for(int i = 1; i <= k; ++i) vis[i] = -1;
    18         for(int i = 1; i <= n; ++i)    scanf("%lld", arr + i);
    19         for(int i = 1; i <= n; ++i) scanf("%lld", brr + i);
    20         priority_queue<ll, vector<ll>, greater<ll> >q;
    21         int cnt = 0;
    22         for(int i = 1; i <= n; ++i)
    23         {
    24             if(vis[arr[i]] == -1)
    25             {
    26                 cnt++;
    27                 vis[arr[i]] = i;
    28             }
    29             else
    30             {
    31                 ll tmp = brr[vis[arr[i]]];
    32                 if(tmp < brr[i])
    33                 {
    34                     q.push(tmp);
    35                     vis[arr[i]] = i;
    36                 }
    37                 else
    38                 {
    39                     q.push(brr[i]);
    40                 }
    41             }
    42         }
    43         ll ans = 0;
    44         for(int i = cnt + 1; i <= k; ++i)
    45         {
    46             ans += q.top();q.pop();
    47         }
    48         printf("%lld
    ", ans);
    49     }
    50     return 0;
    51 }
    View Code

    M:Minegraphed

    Upsolved.

    题意:

    构造一个矩形,使得点的连通性和所给的图一致

    思路:

    用一个三层的图,一个 $(3 cdot n - 2) * 3 的截面  第三层用小沟单向连接$

    $有多少条边就增加多少小沟,注意用一条横线隔开,前面预留2行为数字$

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 #define N 1010
     5 int n, m, G[20][20];
     6 char ans[N], tmp[N];
     7 
     8 int main()
     9 {
    10     int n;
    11     while (scanf("%d", &n) != EOF)
    12     {
    13         int w = 3 * n - 2, m = 0;
    14         for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) scanf("%d", G[i] + j), m += G[i][j];
    15         printf("%d %d %d
    ", w, (m << 1) + 2, 3);
    16         for (int i = 1; i <= w; ++i) tmp[i] = '#'; tmp[w + 1] = 0;
    17         puts(tmp + 1); puts(tmp + 1); 
    18         for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) if (G[i][j])
    19         {
    20             puts(tmp + 1);
    21             memcpy(ans, tmp, sizeof tmp);
    22             int l = (i - 1) * 3 + 1, r = (j - 1) * 3 + 1;
    23             if (l > r) swap(l, r);
    24             for (int k = l; k <= r; ++k) ans[k] = '.';
    25             puts(ans + 1);    
    26         }
    27         puts("");
    28         puts(tmp + 1);
    29         puts(tmp + 1);
    30         for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) if (G[i][j])
    31         {
    32             puts(tmp + 1);
    33             memcpy(ans, tmp, sizeof tmp); 
    34             int l = (i - 1) * 3 + 1, r = (j - 1) * 3 + 1; 
    35             ans[l] = ans[r] = '.';    
    36             if (l < r) ans[l + 1] = '.';
    37             else ans[l - 1] = '.';  
    38             puts(ans + 1); 
    39         }    
    40         puts("");
    41         memcpy(ans, tmp, sizeof tmp);    
    42         for (int i = 1, j = 1; i <= w; i += 3, ++j) ans[i] = j + '0', tmp[i] = '.';
    43         puts(ans + 1);
    44         puts(tmp + 1);
    45         for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) if (G[i][j])
    46             puts(tmp + 1), puts(tmp + 1);
    47     }
    48     return 0;
    49 }
    View Code
  • 相关阅读:
    jenkins
    k8s 驱逐限制
    jenkins+k8s 实现持续集成
    镜像更新备份
    【工具分享】2020年4月 phpstorm2020.1 for mac
    【排坑】mac安装homebrew会遇到的各种问题解决方案
    记一次C盘扩容
    2018夏季工作台之再设计
    left join后面加上where条件浅析
    编程随想篇(2018夏)
  • 原文地址:https://www.cnblogs.com/Dup4/p/10073225.html
Copyright © 2011-2022 走看看