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 ∗ l o g 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 = 0L L;
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 ;
}