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;
}
C. Sweets Eating
Description

给出一个长为n的序列,代表每颗糖的甜度.
每天最多可以吃m颗糖,第d天吃的糖的甜度是$a[i] \times 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;
}
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 }
最近很five.
