codeforces #595 div3 题解

A. Yet Another Dividing into Teams

Description

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 <queue>
10 #include <set>
11 #include <stack>
12 #if __cplusplus >= 201103L
13 #include <unordered_map>
14 #include <unordered_set>
15 #endif
16 #include <vector>
17 #define lson rt << 1, l, mid
18 #define rson rt << 1 | 1, mid + 1, r
19 #define LONG_LONG_MAX 9223372036854775807LL
20 #define ll LL
21 using namespace std;
22 typedef long long ll;
23 typedef long double ld;
24 typedef unsigned long long ull;
25 typedef pair<int, int> P;
26 int n, m, k;
27 const int maxn = 1e5 + 10;
28 template <class T>
29 inline T read()
30 {
31     int f = 1;
32     T ret = 0;
33     char ch = getchar();
34     while (!isdigit(ch))
35     {
36         if (ch == '-')
37             f = -1;
38         ch = getchar();
39     }
40     while (isdigit(ch))
41     {
42         ret = (ret << 1) + (ret << 3) + ch - '0';
43         ch = getchar();
44     }
45     ret *= f;
46     return ret;
47 }
48 template <class T>
49 inline void write(T n)
50 {
51     if (n < 0)
52     {
53         putchar('-');
54         n = -n;
55     }
56     if (n >= 10)
57     {
58         write(n / 10);
59     }
60     putchar(n % 10 + '0');
61 }
62 template <class T>
63 inline void writeln(const T &n)
64 {
65     write(n);
66     puts("");
67 }
68 int a[maxn];
69 int main(int argc, char const *argv[])
70 {
71 #ifndef ONLINE_JUDGE
72     freopen("in.txt", "r", stdin);
73     freopen("out.txt", "w", stdout);
74 #endif
75     int t = read<int>();
76     while (t--)
77     {
78         n = read<int>();
79         for (int i = 0; i < n; i++)
80             a[i] = read<int>();
81         sort(a, a + n);
82         int f = 0;
83         for (int i = 1; i < n; i++)
84             if (a[i] == a[i - 1] + 1)
85                 ++f;
86         if (f)
87             puts("2");
88         else
89             puts("1");
90     }
91     return 0;
92 }
View Code

B. Books Exchange

Description

给出一个置换群,求每个循环的阶

Solution

dfs瞎搜一手

  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 <queue>
 10 #include <set>
 11 #include <stack>
 12 #if __cplusplus >= 201103L
 13 #include <unordered_map>
 14 #include <unordered_set>
 15 #endif
 16 #include <vector>
 17 #define lson rt << 1, l, mid
 18 #define rson rt << 1 | 1, mid + 1, r
 19 #define LONG_LONG_MAX 9223372036854775807LL
 20 #define ll LL
 21 using namespace std;
 22 typedef long long ll;
 23 typedef long double ld;
 24 typedef unsigned long long ull;
 25 typedef pair<int, int> P;
 26 int n, m, k;
 27 const int maxn = 2e5 + 10;
 28 template <class T>
 29 inline T read()
 30 {
 31     int f = 1;
 32     T ret = 0;
 33     char ch = getchar();
 34     while (!isdigit(ch))
 35     {
 36         if (ch == '-')
 37             f = -1;
 38         ch = getchar();
 39     }
 40     while (isdigit(ch))
 41     {
 42         ret = (ret << 1) + (ret << 3) + ch - '0';
 43         ch = getchar();
 44     }
 45     ret *= f;
 46     return ret;
 47 }
 48 template <class T>
 49 inline void write(T n)
 50 {
 51     if (n < 0)
 52     {
 53         putchar('-');
 54         n = -n;
 55     }
 56     if (n >= 10)
 57     {
 58         write(n / 10);
 59     }
 60     putchar(n % 10 + '0');
 61 }
 62 template <class T>
 63 inline void writeln(const T &n)
 64 {
 65     write(n);
 66     puts("");
 67 }
 68 int a[maxn], vis[maxn], step;
 69 void dfs(int u, int f)
 70 {
 71     if (a[u] == f)
 72     {
 73         vis[u] = step;
 74         return;
 75     }
 76     step++;
 77     dfs(a[u], f);
 78     vis[u] = step;
 79 }
 80 int main(int argc, char const *argv[])
 81 {
 82 #ifndef ONLINE_JUDGE
 83     freopen("in.txt", "r", stdin);
 84     freopen("out.txt", "w", stdout);
 85 #endif
 86     int t = read<int>();
 87     while (t--)
 88     {
 89         n = read<int>();
 90         memset(vis, 0, sizeof(int) * (n + 1));
 91         for (int i = 1; i <= n; i++)
 92             a[i] = read<int>();
 93         for (int i = 1; i <= n; i++)
 94         {
 95             if (!vis[i])
 96             {
 97                 step = 1;
 98                 dfs(i, i);
 99             }
100         }
101         for (int i = 1; i <= n; i++)
102             printf("%d ", vis[i]);
103         puts("");
104     }
105     return 0;
106 }
View Code

C. Good Numbers

Description

给一个数n,找出一个最小的m使得m>=n,且m是3的幂次之和,同一幂次最多出现依次

Solution

十进制分解为三进制,当某一位是2或3(上一位进位而来)时,当前位赋值0,下一位++,注意判断最后进位,以及最后更新位置之前赋0

三进制转回十进制即为答案

  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 <queue>
 10 #include <set>
 11 #include <stack>
 12 #if __cplusplus >= 201103L
 13 #include <unordered_map>
 14 #include <unordered_set>
 15 #endif
 16 #include <vector>
 17 #define lson rt << 1, l, mid
 18 #define rson rt << 1 | 1, mid + 1, r
 19 #define LONG_LONG_MAX 9223372036854775807LL
 20 #define ll LL
 21 using namespace std;
 22 typedef long long ll;
 23 typedef long double ld;
 24 typedef unsigned long long ull;
 25 typedef pair<int, int> P;
 26 ull n, m, k;
 27 const int maxn = 1e5 + 10;
 28 template <class T>
 29 inline T read()
 30 {
 31     int f = 1;
 32     T ret = 0;
 33     char ch = getchar();
 34     while (!isdigit(ch))
 35     {
 36         if (ch == '-')
 37             f = -1;
 38         ch = getchar();
 39     }
 40     while (isdigit(ch))
 41     {
 42         ret = (ret << 1) + (ret << 3) + ch - '0';
 43         ch = getchar();
 44     }
 45     ret *= f;
 46     return ret;
 47 }
 48 template <class T>
 49 inline void write(T n)
 50 {
 51     if (n < 0)
 52     {
 53         putchar('-');
 54         n = -n;
 55     }
 56     if (n >= 10)
 57     {
 58         write(n / 10);
 59     }
 60     putchar(n % 10 + '0');
 61 }
 62 template <class T>
 63 inline void writeln(const T &n)
 64 {
 65     write(n);
 66     puts("");
 67 }
 68 ull p[50];
 69 void init()
 70 {
 71     p[0] = 1;
 72     for (int i = 1; i < 50; i++)
 73         p[i] = p[i - 1] * 3;
 74 }
 75 vector<int> t3;
 76 ull solve()
 77 {
 78     t3.clear();
 79     while (n)
 80     {
 81         t3.emplace_back(n % 3);
 82         n /= 3;
 83     }
 84     int sz = t3.size();
 85     int f = -1;
 86     for (int i = 0; i < sz; i++)
 87         if (t3[i] == 2 || t3[i] == 3)
 88         {
 89             f = i;
 90             if (i != sz - 1)
 91             {
 92                 t3[i] = 0;
 93                 t3[i + 1]++;
 94             }
 95             else
 96             {
 97                 t3[i] = 0;
 98                 t3.emplace_back(1);
 99             }
100         }
101     sz = t3.size();
102     ull res = 0;
103     if (f != -1)
104         for (int i = 0; i < f; i++)
105             t3[i] = 0;
106     for (int i = 0; i < sz; i++)
107         if (t3[i])
108             res += p[i];
109     return res;
110 }
111 int main(int argc, char const *argv[])
112 {
113 #ifndef ONLINE_JUDGE
114     freopen("in.txt", "r", stdin);
115     // freopen("out.txt", "w", stdout);
116 #endif
117     init();
118     int t = read<int>();
119     while (t--)
120     {
121         n = read<ull>();
122         writeln(solve());
123     }
124     return 0;
125 }
View Code

D1. Too Many Segments

Description

给n个区间,一个上界k
问最少删除多少区间,使得区间内任一点的覆盖数不大于k
贪心策略,从左往右找每个需要删区间的点,对于区间选择采取满足l<=i且r最大
由于区间和n值较小,O(n^3)亦可过
 
#include <algorithm>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#if __cplusplus >= 201103L
#include <unordered_map>
#include <unordered_set>
#endif
#include <vector>
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
#define LONG_LONG_MAX 9223372036854775807LL
#define ll LL
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<int, int> P;
int n, m, k;
const int maxn = 1e5 + 10;
template <class T>
inline T read()
{
    int f = 1;
    T ret = 0;
    char ch = getchar();
    while (!isdigit(ch))
    {
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while (isdigit(ch))
    {
        ret = (ret << 1) + (ret << 3) + ch - '0';
        ch = getchar();
    }
    ret *= f;
    return ret;
}
template <class T>
inline void write(T n)
{
    if (n < 0)
    {
        putchar('-');
        n = -n;
    }
    if (n >= 10)
    {
        write(n / 10);
    }
    putchar(n % 10 + '0');
}
template <class T>
inline void writeln(const T &n)
{
    write(n);
    puts("");
}
struct node
{
    int l, r, idx;
    node() {}
    node(int l, int r, int idx)
    {
        this->l = l, this->r = r, this->idx = idx;
    }
    bool operator<(const node &t1) const
    {
        if (r == t1.r)
            return l < t1.l;
        return r < t1.l;
    }
};

vector<node> vec;
int p[202], del[202];
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
#endif
    n = read<int>(), k = read<int>();
    int maxx = 0;
    for (int i = 1; i <= n; i++)
    {

        int x = read<int>(), y = read<int>();
        maxx = max(maxx, y);
        vec.emplace_back(x, y, i);
        for (int j = x; j <= y; j++)
            ++p[j];
    }
    for (int i = 1; i <= maxx; i++)
    {
        while (p[i] > k)
        {
            int rr = 0, delid = -1;
            for (int j = 0; j < n; j++)
                if (!del[j] && vec[j].l <= i && vec[j].r > rr)
                {
                    rr = vec[j].r;
                    delid = j;
                }
            for (int j = vec[delid].l; j <= vec[delid].r; j++)
                --p[j];
            del[delid] = 1;
        }
    }
    int res = accumulate(del, del + n, 0);
    writeln(res);
    for (int i = 0; i < n; i++)
        if (del[i])
            write(i + 1), putchar(' ');
    return 0;
}
View Code

D2. Too Many Segments

Description

挖坑

E. By Elevator or Stairs?

Description

 Solution

简单dp

dp[i][0]表示走路到i层的最小花费,dp[i][1]表示电梯到i层的最小花费。

考虑状态转移

需要注意dp[2]是一开始就确定的,wa了一发

 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 <queue>
10 #include <set>
11 #include <stack>
12 #if __cplusplus >= 201103L
13 #include <unordered_map>
14 #include <unordered_set>
15 #endif
16 #include <vector>
17 #define lson rt << 1, l, mid
18 #define rson rt << 1 | 1, mid + 1, r
19 #define LONG_LONG_MAX 9223372036854775807LL
20 #define ll LL
21 using namespace std;
22 typedef long long ll;
23 typedef long double ld;
24 typedef unsigned long long ull;
25 typedef pair<int, int> P;
26 int n, m, k;
27 const int maxn = 2e5 + 10;
28 template <class T>
29 inline T read()
30 {
31     int f = 1;
32     T ret = 0;
33     char ch = getchar();
34     while (!isdigit(ch))
35     {
36         if (ch == '-')
37             f = -1;
38         ch = getchar();
39     }
40     while (isdigit(ch))
41     {
42         ret = (ret << 1) + (ret << 3) + ch - '0';
43         ch = getchar();
44     }
45     ret *= f;
46     return ret;
47 }
48 template <class T>
49 inline void write(T n)
50 {
51     if (n < 0)
52     {
53         putchar('-');
54         n = -n;
55     }
56     if (n >= 10)
57     {
58         write(n / 10);
59     }
60     putchar(n % 10 + '0');
61 }
62 template <class T>
63 inline void writeln(const T &n)
64 {
65     write(n);
66     puts("");
67 }
68 ll dp[maxn][2];
69 ll a[maxn], b[maxn], c;
70 int main(int argc, char const *argv[])
71 {
72 #ifndef ONLINE_JUDGE
73     freopen("in.txt", "r", stdin);
74     freopen("out.txt", "w", stdout);
75 #endif
76     n = read<int>(), c = read<int>();
77     for (int i = 1; i < n; i++)
78         a[i] = read<ll>();
79     for (int i = 1; i < n; i++)
80         b[i] = read<ll>();
81     dp[2][1] = c + b[1];
82     dp[2][0] = a[1];
83     for (int i = 3; i <= n; i++)
84     {
85         dp[i][0] = min(dp[i - 1][1], dp[i - 1][0]) + a[i - 1];
86         dp[i][1] = min(dp[i - 1][0] + c, dp[i - 1][1]) + b[i - 1];
87     }
88     for (int i = 1; i <= n; i++)
89         write(min(dp[i][0], dp[i][1])), putchar(' ');
90     return 0;
91 }
View Code

F. Maximum Weight Subset

Description

挖坑

猜你喜欢

转载自www.cnblogs.com/mooleetzi/p/11728001.html
今日推荐