Codeforces Round #220 (Div. 2)

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值