codeforces 555C Case of Chocolate set操作

题意:

有一块n*n大小的巧克力,n<=1e9。现在进行操作,每次都从反对角线上选择一点,然后往上或往左一直吃(说明下三角部分是废了),每当到达巧克力边缘或者下一块已经被吃了,则停止。问你每次操作能吃到几块巧克力。


思路:

网上各种搜,代码抄大神们的= =,题解都写得好简洁啊。

首先先介绍区间这一个概念。
例如第一个样例,在执行完第二个操作后,区间就分为了【2,3】和【5,6】,其实就是按行来分,被选过的行就不要了。
在第五个操作4 3 U 中,我们想知道最大能往上多少,实际上这个信息就保存在临近x = 1(第一次操作的位置)
如果换成是L操作,那么最大能往左多少,就保存临近的x = 4(第二次操作的位置)
因此我们就想到用set根据输入的x寻找所存在的区间。

在每次输出结果之后,我们都会将旧区间的信息赋值给新生成的区间(不得不佩服这代码写得真够简练)。
一开始,只有一个区间,并且最大能往上和最大能往左都是坐标都是最大的。

code:
#include <bits/stdc++.h>
using namespace std;

const int N = 2e5+5;
typedef pair<int, int> pii;
#define mp make_pair

set <pii> st;
set <pii>::iterator it;

int n, q;
char ch[5];
int x[N], y[N];
int main() {
    scanf("%d%d", &n, &q);
    st.insert(mp(0, 0));
    st.insert(mp(n+1, q+1));
    for(int i = 1;i <= q; i++) {
        scanf("%d%d%s", &y[i], &x[i], ch);
        if(ch[0] == 'U') {
            it = st.lower_bound(mp(x[i], -1));
            if(it->first > x[i]) it--;
        }
        else {
            it = st.upper_bound(mp(x[i], -1));
        }
        if(it->first == x[i]) {
            puts("0");
            continue;
        }
        st.insert(mp(x[i], i));
        if(ch[0] == 'U') {
            printf("%d\n", x[i]-x[it->second]);
            x[i] = x[it->second];
        }
        else {
            printf("%d\n", y[i]-y[it->second]);
            y[i] = y[it->second];
        }
    }
    return 0;
}




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值