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\n", 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, " \n"[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\n2");
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\n", i, num1);
43                     printf("%lld %lld\n", 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\n", 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\n", 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\n", 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\n", 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\n", 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

 

posted @ 2018-12-05 20:32  Dup4  阅读(557)  评论(0编辑  收藏  举报