A - Kefa and First Steps
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
const int MAX = 100007;
int a[MAX];
int dp[MAX];
int main() {
int n;
while (~scanf(" %d", &n)) {
memset(dp, 0, sizeof(dp));
a[0] = 0;
for (int i = 1; i <= n; ++i) {
scanf(" %d", a + i);
}
int ans = 1;
for (int i = 1; i <= n; ++i) {
if (a[i] >= a[i - 1]) {
dp[i] = dp[i - 1] + 1;
if (dp[i] > ans) {
ans = dp[i];
}
} else {
dp[i] = 1;
}
}
printf("%d\n", ans);
}
return 0;
}
B - Kefa and Company
- 可以
O(n∗log n)
地做。当然,本题可以做到
O(n)
。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
#ifdef ONLINE_JUDGE
#define lld I64d
#endif
const int MAX = 100007;
struct Node {
int m;
int s;
bool operator<(const Node& b)const {
return m < b.m;
}
} a[MAX];
ll sum[MAX];
bool operator<(const ll& b, const Node& a) {
return b < a.m;
}
bool operator<(const Node& a, const ll& b) {
return a.m < b;
}
int main() {
int n, d;
while (~scanf(" %d %d", &n, &d)) {
for (int i = 0; i < n; ++i) {
scanf(" %d %d", &a[i].m, &a[i].s);
}
sort(a, a + n);
sum[0] = a[0].s;
for (int i = 1; i < n; ++i) {
sum[i] = sum[i - 1] + a[i].s;
}
ll ans = 0LL;
for (int i = 0; i < n; ++i) {
ans = max(ans, sum[lower_bound(a, a + n, a[i].m + d) - a - 1] - sum[i] + a[i].s);
}
cout << ans << endl;
}
return 0;
}
C - Kefa and Park
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
const int MAX = 100007;
vector<int> G[MAX];
int cat[MAX];
bool vis[MAX];
bool is_leaf[MAX];
bool ok[MAX];
int n, m;
void dfs(int u, int now, int his) {
vis[u] = true;
if (cat[u] == 1) {
++now;
} else {
now = 0;
}
if (now > his) his = now;
ok[u] = his <= m;
int son = 0;
for (auto it: G[u]) {
if (vis[it]) continue;
dfs(it, now, his);
son++;
}
if (son == 0) {
is_leaf[u] = true;
}
}
int main() {
while (~scanf(" %d %d", &n, &m)) {
for (int i = 1; i <= n; ++i) {
scanf(" %d", cat + i);
G[i].clear();
}
int u, v;
for (int i = 1; i < n; ++i) {
scanf(" %d %d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
memset(vis, false, sizeof(vis));
memset(ok, false, sizeof(ok));
memset(is_leaf, false, sizeof(is_leaf));
dfs(1, 0, 0);
int sum = 0;
for (int i = 1; i <= n; ++i) {
if (is_leaf[i] && ok[i]) {
++sum;
}
}
printf("%d\n", sum);
}
return 0;
}