A:
有点坑的题,最后一分钟被hack了。。。后来我的friend列表的人全挂了。。。注意下可能往某个方向一跳就会跳出界的
B:
坑我到死的一题,WA了之后想了几十分钟。。。就是想不出有什么问题= =不得已才放弃了。。到最后果然没问题的,重判A了
思路:对于一段连续成9的数,如果是偶数个ans乘上1,如果是cnt奇数个,则ans乘上cnt/2+1,比如18181,有三种情况
C:
记忆化搜索。vis数组表示该点有没被访问过,nice数组初始化为-1,nice如果为INF则表示有环,如果搜到某个点,判断下该点如果被访问过了,要判断下nice是否为-1,如果为-1则表示有环(很容易想到该点结果还没处理出来的话相当于又搜回到这个点,即成环了)
#include
#include
#include
using namespace std;
const int maxn = 1000 + 10;
const int INF = 1<<30;
char s[maxn][maxn];
int next[1111];
int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
int nice[maxn][maxn], vis[maxn][maxn], n, m;
void init() {
next['D'] = 'I';next['I'] = 'M'; next['M'] = 'A'; next['A'] = 'D';
}
int dfs(int x, int y) {
vis[x][y] = 1;
int now = s[x][y];
int ret = 0;
for(int i = 0;i < 4; i++) {
int xx = x + dir[i][0];
int yy = y + dir[i][1];
if(xx < 1 ||yy < 1 || xx > n || yy > m) continue;
if(s[xx][yy] == next[now]) {
if(!vis[xx][yy]) {
int to = dfs(xx, yy);
if(to == INF)
return nice[x][y] = INF;
ret = max(ret, to);
}
else {
if(nice[xx][yy] == -1 || nice[xx][yy] == INF) {
return nice[x][y] = INF;
}
ret = max(ret, nice[xx][yy]);
}
}
}
if(now == 'A') ret++;
return nice[x][y] = ret;
}
int main() {
init();
scanf("%d%d", &n, &m);
for(int i = 1;i <= n; i++)
scanf("%s", s[i] + 1);
memset(nice, -1, sizeof(nice));
int ans = 0;
for(int i = 1;i <= n; i++) {
for(int j = 1;j <= m; j++) if(!vis[i][j] && s[i][j] == 'D'){
int cur = dfs(i, j);
if(cur == INF) return puts("Poor Inna!");
ans = max(ans, cur);
}
}
if(ans == 0) puts("Poor Dima!");
else printf("%d\n", ans);
return 0;
}
D:
这题是RP Error了。。。敲完C题后也没去想B题了,直接搞D了,然后想了下大概是树状数组加二分乱搞,敲完WA,改了发后刚想交 的时候电脑蓝屏关机了= =...这是在为下次的比赛攒人品吗
第二天交上去WA40组,改了下A了,后来的确删除的时候不用二分的,反正直接树状数组找第K大的数就行了。。弱了
#include
#include
#include
using namespace std;
const int maxn = 1000000 + 10;
int sum[maxn], val[maxn], a[maxn];
int n, m;
int lowbit(int x) {
return x&-x;
}
void add(int x, int v) {
while(x <= n) {
sum[x] += v;
x += lowbit(x);
}
}
int query(int x){
int ret = 0;
while(x > 0) {
ret += sum[x];
x -= lowbit(x);
}
return ret;
}
int bin(int x) {
int l = 0, r = m-1, ans = -1;
while(l <= r) {
int mid = (l+r)/2;
if(a[mid] <= x) {
ans = mid;
l = mid+1;
}
else
r = mid-1;
}
return ans;
}
int find_kth(int k) {
int ans = 0, cnt = 0;
for(int i = 20;i >= 0; i--) {
ans += (1<= n || cnt + sum[ans] >= k)
ans -= (1< 0) {
for(int i = 1;i <= n; i++) if(val[i] != -1)
printf("%d", val[i]);
puts("");
}
else puts("Poor stack!");
return 0;
}