1、Codeforces 573B Bear and Blocks
参考:http://blog.csdn.net/u012015746/article/details/51155554
http://codeforces.com/contest/573/standings
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <cctype>
#include <bitset>
#include <ctime>
using namespace std;
#define REP(i, n) for (int i = 0; i < (n); ++i)
#define lson low, mid, _id<<1
#define rson mid+1, high, _id<<1|1
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int uint;
typedef pair<int, int> Pair;
const ll mod = 1e9 + 7;
const int INF = 0x7fffffff;
const int maxn = 1e5 + 10;
int n;
int h[maxn], Left[maxn], Right[maxn];
int main()
{
#ifdef __AiR_H
freopen("in.txt", "r", stdin);
#endif // __AiR_H
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%d", &h[i]);
}
for (int i = 1; i <= n; ++i) {
Left[i] = min(h[i], Left[i-1] + 1);
}
for (int i = n; i >= 1; --i) {
Right[i] = min(h[i], Right[i+1] + 1);
}
int ans = 0;
for (int i = 1; i <= n; ++i) {
ans = max(ans, min(Left[i], Right[i]));
}
printf("%d\n", ans);
return 0;
}
2、Codeforces 367A Sereja and Algorithm
参考:http://codeforces.com/contest/367/standings/page/1
解题思路:
如果满足条件的话, x 和 y,x 和 z,y 和 z 的差都不会超过 1
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <cctype>
#include <bitset>
#include <ctime>
using namespace std;
#define REP(i, n) for (int i = 0; i < (n); ++i)
#define lson low, mid, _id<<1
#define rson mid+1, high, _id<<1|1
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int uint;
typedef pair<int, int> Pair;
const ll mod = 1e9 + 7;
const int INF = 0x7fffffff;
const int maxn = 1e5 + 10;
int m, l, r;
char s[maxn];
int sum_x[maxn], sum_y[maxn], sum_z[maxn];
int main()
{
#ifdef __AiR_H
freopen("in.txt", "r", stdin);
#endif // __AiR_H
scanf("%s %d", s, &m);
int len = strlen(s);
for (int i = 0; i < len; ++i) {
sum_x[i + 1] = sum_x[i] + (s[i] == 'x');
sum_y[i + 1] = sum_y[i] + (s[i] == 'y');
sum_z[i + 1] = sum_z[i] + (s[i] == 'z');
}
while (m--) {
scanf("%d %d", &l, &r);
int num_x = sum_x[r] - sum_x[l - 1];
int num_y = sum_y[r] - sum_y[l - 1];
int num_z = sum_z[r] - sum_z[l - 1];
bool flag = true;
if (abs(num_x - num_y) > 1 || abs(num_x - num_z) > 1 || abs(num_y - num_z) > 1) {
flag = false;
}
if (num_x + num_y + num_z <= 2) {
flag = true;
}
if (flag) {
printf("YES\n");
} else {
printf("NO\n");
}
}
return 0;
}
3、Codeforces 722C Destroying Array
参考:http://www.cnblogs.com/flipped/p/5928466.html
解题思路:
倒过来依次放上删除的数,然后找最大连续和
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <cctype>
#include <bitset>
#include <ctime>
using namespace std;
#define lson low, mid, _id<<1
#define rson mid+1, high, _id<<1|1
typedef long long ll;
typedef pair<ll, ll> Pair;
const ll maxn = 1e5 + 10;
ll n;
ll a[maxn], pos[maxn], sum[maxn], Left[maxn], Right[maxn];
bool vis[maxn];
vector<ll> ans;
int main()
{
#ifdef __AiR_H
freopen("in.txt", "r", stdin);
#endif // __AiR_H
scanf("%I64d", &n);
for (ll i = 1; i <= n; ++i) {
scanf("%I64d", &a[i]);
sum[i] = sum[i - 1] + a[i];
}
for (ll i = 1; i <= n; ++i) {
scanf("%I64d", &pos[i]);
}
ll Max = 0;
for (ll i = n; i > 1; --i) {
Left[pos[i]] = pos[i], Right[pos[i]] = pos[i];
vis[pos[i]] = true;
if (vis[pos[i] - 1]) {
Left[pos[i]] = Left[pos[i] - 1];
}
if (vis[pos[i] + 1]) {
Right[pos[i]] = Right[pos[i] + 1];
}
Left[Right[pos[i]]] = Left[pos[i]];
Right[Left[pos[i]]] = Right[pos[i]];
Max = max(Max, sum[Right[pos[i]]] - sum[Left[pos[i]] - 1]);
ans.push_back(Max);
}
for (int i = ans.size() - 1; i >= 0; --i) {
printf("%I64d\n", ans[i]);
}
printf("0\n");
return 0;
}
4、Codeforces 327A Flipping Game
参考:http://codeforces.com/contest/327/standings
可以求前缀和再暴力,也可以直接暴力
但是我们有 O(n) 的解法....
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <cctype>
#include <bitset>
#include <ctime>
using namespace std;
#define REP(i, n) for (int i = 0; i < (n); ++i)
#define lson low, mid, _id<<1
#define rson mid+1, high, _id<<1|1
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int uint;
typedef pair<int, int> Pair;
const ll mod = 1e9 + 7;
const int INF = 0x7fffffff;
const int maxn = 100 + 10;
int n, x, mx, y;
int a[maxn];
int main()
{
#ifdef __AiR_H
freopen("in.txt", "r", stdin);
#endif // __AiR_H
scanf("%d", &n);
x = mx = y = 0;
for (int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
if (a[i] == 1) {
++y;
}
if (a[i] == 0) {
++x;
mx = x > mx ? x : mx;
} else if (x > 0) {
--x;
}
}
if (mx == 0) {
--mx;
}
printf("%d\n", mx + y);
return 0;
}
5、Codeforces 427B Prison Transfer
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>
#include <queue>
#include <stack>
#include <set>
#include <bitset>
#include <ctime>
#include <cctype>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll mod = 1e9 + 7;
const int INF = 0x7fffffff;
const int maxn = 2e5 + 10;
int n, t, c;
int a[maxn];
int main()
{
#ifdef __AiR_H
freopen("in.txt", "r", stdin);
#endif // __AiR_H_
scanf("%d %d %d", &n, &t, &c);
int cnt = 0, ans = 0;
for (int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
if (a[i] <= t) {
++cnt;
} else {
cnt = 0;
}
if (cnt >= c) {
++ans;
}
}
printf("%d\n", ans);
return 0;
}