codeforces #597 div2 ABCD !F

A. Good ol' Numbers Coloring

Description

给出两个整数x,y,问$ax+by,a \geq 0,b \ geq 0$不能表示的正整数是否为无穷多个。

Solution

由裴属定理可以知道当$gcd(x,y)|m$时,等式$ax+by=m$一定存在整数解。

那么显然判断条件就是$gcd(x,y)==1$

 

B. Restricted RPS

Description

已知Bob的剪刀石头布序列。

Alice本人剪刀石头布的次数给定,$a+b+c=n$

Alice至少赢Bob$\lceil \frac{n}{2} \rceil$局才能获胜。

问Alice能否获胜,若可以,给出一组答案序列。

Solution

贪心。

由于总的方案一定

先把能赢的选出来,剩下的随便填入即可。

  1 #include <algorithm>
  2 #include <cctype>
  3 #include <cmath>
  4 #include <cstdio>
  5 #include <cstdlib>
  6 #include <cstring>
  7 #include <iostream>
  8 #include <map>
  9 #include <numeric>
 10 #include <queue>
 11 #include <set>
 12 #include <stack>
 13 #if __cplusplus >= 201103L
 14 #include <unordered_map>
 15 #include <unordered_set>
 16 #endif
 17 #include <vector>
 18 #define lson rt << 1, l, mid
 19 #define rson rt << 1 | 1, mid + 1, r
 20 #define LONG_LONG_MAX 9223372036854775807LL
 21 #define pblank putchar(' ')
 22 #define ll LL
 23 #define fastIO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
 24 using namespace std;
 25 typedef long long ll;
 26 typedef long double ld;
 27 typedef unsigned long long ull;
 28 typedef pair<int, int> P;
 29 int n, m, k;
 30 const int maxn = 1e2 + 10;
 31 template <class T>
 32 inline T read()
 33 {
 34     int f = 1;
 35     T ret = 0;
 36     char ch = getchar();
 37     while (!isdigit(ch))
 38     {
 39         if (ch == '-')
 40             f = -1;
 41         ch = getchar();
 42     }
 43     while (isdigit(ch))
 44     {
 45         ret = (ret << 1) + (ret << 3) + ch - '0';
 46         ch = getchar();
 47     }
 48     ret *= f;
 49     return ret;
 50 }
 51 template <class T>
 52 inline void write(T n)
 53 {
 54     if (n < 0)
 55     {
 56         putchar('-');
 57         n = -n;
 58     }
 59     if (n >= 10)
 60     {
 61         write(n / 10);
 62     }
 63     putchar(n % 10 + '0');
 64 }
 65 template <class T>
 66 inline void writeln(const T &n)
 67 {
 68     write(n);
 69     puts("");
 70 }
 71 template <typename T>
 72 void _write(const T &t)
 73 {
 74     write(t);
 75 }
 76 template <typename T, typename... Args>
 77 void _write(const T &t, Args... args)
 78 {
 79     write(t), pblank;
 80     _write(args...);
 81 }
 82 template <typename T, typename... Args>
 83 inline void write_line(const T &t, const Args &... data)
 84 {
 85     _write(t, data...);
 86 }
 87 char s[maxn], ans[maxn];
 88 int vis[maxn];
 89 int main(int argc, char const *argv[])
 90 {
 91 #ifndef ONLINE_JUDGE
 92     freopen("in.txt", "r", stdin);
 93     // freopen("out.txt", "w", stdout);
 94 #endif
 95     int t;
 96     cin >> t;
 97     while (t--)
 98     {
 99         memset(vis, 0, sizeof vis);
100         cin >> n;
101         int a, b, c;
102         cin >> a >> b >> c;
103         cin >> s + 1;
104         int res = 0;
105         for (int i = 1; i <= n; i++)
106             if (s[i] == 'P' && c)
107                 --c, ans[i] = 'S', ++res, vis[i] = 1;
108             else if (s[i] == 'S' && a)
109                 --a, ans[i] = 'R', ++res, vis[i] = 1;
110             else if (s[i] == 'R' && b)
111                 --b, ans[i] = 'P', ++res, vis[i] = 1;
112         int p = n / 2;
113         if (n & 1)
114             ++p;
115         if (res >= p)
116         {
117             cout << "YES\n";
118             for (int i = 1; i <= n; i++)
119                 if (!vis[i])
120                 {
121                     if (a)
122                         ans[i] = 'R',--a;
123                     else if (b)
124                         ans[i] = 'P',--b;
125                     else if (c)
126                         ans[i] = 'S',--c;
127                     vis[i] = 1;
128                 }
129             ans[n + 1] = '\0';
130             cout << ans + 1 << "\n";
131         }
132         else
133             cout << "NO\n";
134     }
135     return 0;
136 }
View Code

 

C. Constanze's Machine

 

C发明了一个听声打字机器。

D恶作剧了一下,将机器修改为

如果C说的是$m$,机器输出$nn$

如果C说的是$w$,机器输出$uu$

A拿到了一串C的输出序列,问有多少种复原方案。

Solution

处理序列中连续的u和n,按照分步原则,将答案累乘。

中间规律为斐波那契。

  1 #include <algorithm>
  2 #include <numeric>
  3 #include <cctype>
  4 #include <cmath>
  5 #include <cstdio>
  6 #include <cstdlib>
  7 #include <cstring>
  8 #include <iostream>
  9 #include <map>
 10 #include <queue>
 11 #include <set>
 12 #include <stack>
 13 #if __cplusplus >= 201103L
 14 #include <unordered_map>
 15 #include <unordered_set>
 16 #endif
 17 #include <vector>
 18 #define lson rt << 1, l, mid
 19 #define rson rt << 1 | 1, mid + 1, r
 20 #define LONG_LONG_MAX 9223372036854775807LL
 21 #define pblank putchar(' ')
 22 #define ll LL
 23 #define fastIO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
 24 using namespace std;
 25 typedef long long ll;
 26 typedef long double ld;
 27 typedef unsigned long long ull;
 28 typedef pair<int, int> P;
 29 int n, m, k;
 30 const int maxn = 1e5 + 10;
 31 const ll mod = 1e9 + 7;
 32 template <class T>
 33 inline T read()
 34 {
 35     int f = 1;
 36     T ret = 0;
 37     char ch = getchar();
 38     while (!isdigit(ch))
 39     {
 40         if (ch == '-')
 41             f = -1;
 42         ch = getchar();
 43     }
 44     while (isdigit(ch))
 45     {
 46         ret = (ret << 1) + (ret << 3) + ch - '0';
 47         ch = getchar();
 48     }
 49     ret *= f;
 50     return ret;
 51 }
 52 template <class T>
 53 inline void write(T n)
 54 {
 55     if (n < 0)
 56     {
 57         putchar('-');
 58         n = -n;
 59     }
 60     if (n >= 10)
 61     {
 62         write(n / 10);
 63     }
 64     putchar(n % 10 + '0');
 65 }
 66 template <class T>
 67 inline void writeln(const T &n)
 68 {
 69     write(n);
 70     puts("");
 71 }
 72 template <typename T>
 73 void _write(const T &t)
 74 {
 75     write(t);
 76 }
 77 template <typename T, typename... Args>
 78 void _write(const T &t, Args... args)
 79 {
 80 write(t), pblank;
 81  _write(args...);
 82 }
 83 template <typename T, typename... Args>
 84 inline void write_line(const T &t, const Args &... data)
 85 {
 86    _write(t, data...);
 87 }
 88 char s[maxn];
 89 ll dp[maxn];
 90 int main(int argc, char const *argv[])
 91 {
 92 #ifndef ONLINE_JUDGE
 93     freopen("in.txt","r", stdin);
 94     // freopen("out.txt","w", stdout);
 95 #endif
 96     dp[0] = 1, dp[1] = 1;
 97     for (int i = 2; i < maxn;i++)
 98         dp[i] = (dp[i - 1] + dp[i - 2]) % mod;
 99     fastIO;
100     cin >> s;
101     n = strlen(s);
102     int f = 1;
103     for (int i = 0; i < n && f;i++)
104         if (s[i]=='m'||s[i]=='w')
105             f = 0;
106     if (f){
107         ll res = 1;
108         int cur = 0;
109         for (int i = 0; i < n;i++){
110             if (s[i]=='u')
111                 ++cur;
112             else{
113                 res = res * dp[cur] % mod;
114                 cur = 0;
115             }
116         }
117         if (cur)
118             res = res * dp[cur] % mod;
119         cur = 0;
120         for (int i = 0; i < n; i++)
121         {
122             if (s[i] == 'n')
123                 ++cur;
124             else
125             {
126                 res = res * dp[cur] % mod;
127                 cur = 0;
128             }
129         }
130         if (cur)
131             res = res * dp[cur] % mod;
132         cout << res << "\n";
133     }
134     else
135         puts("0");
136         return 0;
137 }
View Code

 

D. Shichikuji and Power Grid

Description

给出一个含有n个点的城市,以及各自坐标。

现在要将n个点全部连上主干道电路。

对于每个点有两种可选方案。

1,自己铺设电路到主干道。2,铺设电路到某一已连上主干道的点。

第一种方式的代价为$C_i$

第二种的代价为$(K_i+K_j) \times (dis_{i,j}),dis_{i,j}=|x_i-x_j|+|y_i-y_j|$

问最小代价,并给出铺设方案。

Solution

最小生成树。自己太菜没有及时想到做法。

思路源自题解。

对于第一个点,由于没有其他已连上主干道的点,它的选择只能是第一种方式。

这时其他点的代价可以更新为$min(c_i,dis_{i,u} \times (k_i+k_u))$。

prim可在$O(n^2)$内求出答案。

  1 #include <algorithm>
  2 #include <cctype>
  3 #include <cmath>
  4 #include <cstdio>
  5 #include <cstdlib>
  6 #include <cstring>
  7 #include <iostream>
  8 #include <map>
  9 #include <numeric>
 10 #include <queue>
 11 #include <set>
 12 #include <stack>
 13 #if __cplusplus >= 201103L
 14 #include <unordered_map>
 15 #include <unordered_set>
 16 #endif
 17 #include <vector>
 18 #define lson rt << 1, l, mid
 19 #define rson rt << 1 | 1, mid + 1, r
 20 #define LONG_LONG_MAX 9223372036854775807LL
 21 #define pblank putchar(' ')
 22 #define ll LL
 23 #define fastIO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
 24 using namespace std;
 25 typedef long long ll;
 26 typedef long double ld;
 27 typedef unsigned long long ull;
 28 typedef pair<int, int> P;
 29 int n, m, k;
 30 const int maxn = 1e5 + 10;
 31 template <class T>
 32 inline T read()
 33 {
 34     int f = 1;
 35     T ret = 0;
 36     char ch = getchar();
 37     while (!isdigit(ch))
 38     {
 39         if (ch == '-')
 40             f = -1;
 41         ch = getchar();
 42     }
 43     while (isdigit(ch))
 44     {
 45         ret = (ret << 1) + (ret << 3) + ch - '0';
 46         ch = getchar();
 47     }
 48     ret *= f;
 49     return ret;
 50 }
 51 template <class T>
 52 inline void write(T n)
 53 {
 54     if (n < 0)
 55     {
 56         putchar('-');
 57         n = -n;
 58     }
 59     if (n >= 10)
 60     {
 61         write(n / 10);
 62     }
 63     putchar(n % 10 + '0');
 64 }
 65 template <class T>
 66 inline void writeln(const T &n)
 67 {
 68     write(n);
 69     puts("");
 70 }
 71 template <typename T>
 72 void _write(const T &t)
 73 {
 74     write(t);
 75 }
 76 template <typename T, typename... Args>
 77 void _write(const T &t, Args... args)
 78 {
 79     write(t), pblank;
 80     _write(args...);
 81 }
 82 template <typename T, typename... Args>
 83 inline void write_line(const T &t, const Args &... data)
 84 {
 85     _write(t, data...);
 86     puts("");
 87 }
 88 ll dis(const P &t1, const P &t2)
 89 {
 90     return 1LL*abs(t1.first - t2.first) + abs(t1.second - t2.second);
 91 }
 92 int main(int argc, char const *argv[])
 93 {
 94 #ifndef ONLINE_JUDGE
 95     freopen("in.txt", "r", stdin);
 96     // freopen("out.txt","w", stdout);
 97 #endif
 98     n = read<int>();
 99     vector<P> vec(n + 1), con;
100     vector<int> c(n + 1), k(n + 1), fa(n + 1, -1), vis(n + 1, 0), self;
101     for (int i = 1; i <= n; i++)
102     {
103         int x = read<int>(), y = read<int>();
104         vec[i] = P(x, y);
105     }
106     for (int i = 1; i <= n; i++)
107         c[i] = read<int>();
108     for (int i = 1; i <= n; i++)
109         k[i] = read<int>();
110     ll res = 0;
111     for (int i = 1; i <= n; i++)
112     {
113         int u = -1, minx = 2e9;
114         for (int j = 1; j <= n; j++)
115             if (c[j] < minx && !vis[j])
116             {
117                 minx = c[j];
118                 u = j;
119             }
120         if (u != -1)
121             vis[u] = 1, res += minx;
122         else
123             break;
124         if (fa[u] != -1)
125             con.emplace_back(fa[u], u);
126         else
127             self.emplace_back(u);
128         for (int j = 1; j <= n; j++)
129         {
130             if (j == u || vis[j])
131                 continue;
132             ll d = 1LL * dis(vec[u], vec[j]) * (k[u] + k[j]);
133             if (d < c[j])
134                 c[j] = d, fa[j] = u;
135         }
136     }
137     writeln(res);
138     int sz = self.size();
139     writeln(sz);
140     for (int i = 0; i < sz; i++)
141         write(self[i]), pblank;
142     puts("");
143     sz = con.size();
144     writeln(sz);
145     for (int i = 0; i < sz; i++)
146         write_line(con[i].first, con[i].second);
147     return 0;
148 }
View Code

 

F据说是牛客多校原题。

 

posted @ 2019-11-02 11:22  mool  阅读(188)  评论(0编辑  收藏  举报