codeforces #600 div2 ABCD

A. Single Push

模拟瞎搞,开始忘了判断可能出现多种差值,憨憨

B. Silly Mistake

Description

Solution

也是一个模拟瞎搞题,不过自己比较憨,忘了判断最后一节儿,还以为写了个假题,自闭.

#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 pblank putchar(' ')
#define ll LL
#define fastIO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
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("");
}
template <typename T>
void _write(const T &t)
{
    write(t);
}
template <typename T, typename... Args>
void _write(const T &t, Args... args)
{
    write(t), pblank;
    _write(args...);
}
template <typename T, typename... Args>
inline void write_line(const T &t, const Args &... data)
{
    _write(t, data...);
}
int a[maxn];
map<int, int> mp;
set<int> s;
vector<int> res;
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
#endif
    n = read<int>();
    for (int i = 0; i < n; i++)
        a[i] = read<int>();
    if (n & 1)
    {
        puts("-1");
        return 0;
    }
    int pre = -1, f = 1;
    for (int i = 0; i < n && f; i++)
    {
        if (a[i] > 0)
        {
            if (mp.count(a[i]) || s.count(a[i]))
                f = 0;
            else
                mp[a[i]] = 1, s.emplace(a[i]);
        }
        else
        {
            if (!mp.count(-a[i]))
                f = 0;
            else
                mp.erase(-a[i]);
        }
        if (mp.empty())
        {
            res.emplace_back(i - pre);
            pre = i;
            s.clear();
        }
    }
    if (f)
    {
        int tmp = accumulate(res.begin(), res.end(), 0);
        if (tmp == n)
        {
            writeln(res.size());
            for (int i = 0; i < res.size(); i++)
                write(res[i]), pblank;
            puts("");
        }
        else
        {
            puts("-1");
        }
    }
    else
        puts("-1");
    return 0;
}
View Code

C. Sweets Eating

Description

 给出一个长为n的序列,代表每颗糖的甜度.

每天最多可以吃m颗糖,第d天吃的糖的甜度是$a[i] imes d$

询问吃$i$颗糖的最小甜度

Solution

显然对于一个确定的询问i颗糖,我们应该选择其中甜度最小的i颗糖,然后甜度大的最先吃.

排序前缀和递推求解.

$a[i]+=a[i-m]$,这样累计下去便可以每次将不是第一天吃的糖果加上一天的权重.

#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 pblank putchar(' ')
#define ll LL
#define fastIO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
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 = 2e5 + 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("");
}
template <typename T>
void _write(const T &t)
{
    write(t);
}
template <typename T, typename... Args>
void _write(const T &t, Args... args)
{
    write(t), pblank;
    _write(args...);
}
template <typename T, typename... Args>
inline void write_line(const T &t, const Args &... data)
{
    _write(t, data...);
}
ll a[maxn];
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
#endif
    n = read<int>(), m = read<int>();
    for (int i = 1; i <= n; i++)
        a[i] = read<ll>();
    sort(a + 1, a + 1 + n);
    for (int i = 1; i <= n; i++)
        a[i] += a[i - 1];
    for (int i = m + 1; i <= n; i++)
        a[i] += a[i - m];
    for (int i = 1; i <= n; i++)
        write(a[i]), pblank;
    puts("");
    return 0;
}
View Code

D. Harmonious Graph

Description

给出一个无向图,包含n个点,m条边.

如果图中所有的边$(l,r)$都满足$(l,l+1),(l,l+2),...(l,r)$则图是优秀的.

现在要求加入最少的边使图变得优秀.

Solution

对于一个连通块,只需要考虑最大的r对答案的贡献.

对每个未访问点i找连通块,每次找最大的r,在i到r间有没有访问的点就需要加上一条边,并继续从当前点扩大i的连通块,更新r值

  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 = 2e5 + 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 vector<int> g[maxn];
 89 int vis[maxn];
 90 int maxx;
 91 void dfs(int u)
 92 {
 93     vis[u] = 1;
 94     int sz = g[u].size();
 95     for (int i = 0; i < sz; i++)
 96     {
 97         int v = g[u][i];
 98         if (!vis[v])
 99             dfs(v);
100     }
101     maxx = max(maxx, u);
102 }
103 int main(int argc, char const *argv[])
104 {
105 #ifndef ONLINE_JUDGE
106     freopen("in.txt", "r", stdin);
107     // freopen("out.txt", "w", stdout);
108 #endif
109     n = read<int>(), m = read<int>();
110     for (int i = 0; i < m; i++)
111     {
112         int x = read<int>();
113         int y = read<int>();
114         g[x].emplace_back(y);
115         g[y].emplace_back(x);
116     }
117     int res = 0;
118     for (int i = 1; i <= n; i++)
119     {
120         if (!vis[i])
121         {
122             maxx = i;
123             dfs(i);
124             for (int j = i; j < maxx; j++)
125                 if (!vis[j])
126                     dfs(j), ++res;
127             i = maxx;
128         }
129     }
130     writeln(res);
131     return 0;
132 }
View Code

最近很five.

原文地址:https://www.cnblogs.com/mooleetzi/p/11950824.html