首页 > 其他分享 >[题解]CF609F Frogs and mosquitoes

[题解]CF609F Frogs and mosquitoes

时间:2024-06-23 13:10:02浏览次数:26  
标签:吃掉 return Frogs 题解 tr CF609F 蚊子 int ls

思路

发现 \(x\) 对题目的限制较大,因此考虑先将 \(x\) 排序并离散化后再来考虑。

不难用线段树维护 \(\max_{i = l}^{r}\{x_i + len_i\}\),这样我们就可以利用类似线段树上二分的技巧得出是哪一只青蛙吃掉的蚊子。

但是有可能有一只蚊子无法吃掉,我们先把它丢进一个集合里面。

每有一次青蛙能吃掉新蚊子,意味着有一个青蛙舌头的长度会增加,便有了能吃掉原本无法吃掉的蚊子的可能,在此时将那些蚊子单独拎出来判断即可。

考虑到对于每一只蚊子最多进集合一次,出集合一次,所以复杂度是正确的。

Code

#include <bits/stdc++.h>
#define fst first
#define snd second
#define re register

using namespace std;

typedef pair<int,int> pii;
const int N = 2e5 + 10;
int n,m;
int x[N],nx[N],len[N],id[N],vis[N];
pii tmp[N];
multiset<pii> st;

inline int read(){
    int r = 0,w = 1;
    char c = getchar();
    while (c < '0' || c > '9'){
        if (c == '-') w = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9'){
        r = (r << 3) + (r << 1) + (c ^ 48);
        c = getchar();
    }
    return r * w;
}

struct seg{
    #define ls(u) (u << 1)
    #define rs(u) (u << 1 | 1)

    struct node{
        int l,r,Max;
    }tr[N << 2];

    inline void pushup(int u){
        tr[u].Max = max(tr[ls(u)].Max,tr[rs(u)].Max);
    }

    inline void build(int u,int l,int r){
        tr[u] = {l,r};
        if (l == r) return tr[u].Max = x[id[l]] + len[id[l]],void();
        int mid = l + r >> 1;
        build(ls(u),l,mid),build(rs(u),mid + 1,r);
        pushup(u);
    }

    inline void modify(int u,int x,int k){
        if (tr[u].l == x && tr[u].r == x){
            vis[id[x]]++,len[id[x]] += k,tr[u].Max += k;
            return;
        }
        int mid = tr[u].l + tr[u].r >> 1;
        if (x <= mid) modify(ls(u),x,k);
        else modify(rs(u),x,k);
        pushup(u);
    }

    inline int query(int u,int k){
        if (tr[u].l == tr[u].r){
            int t = id[tr[u].l];
            if (x[t] <= k && x[t] + len[t] >= k) return t;
            else return -1;
        }
        if (tr[ls(u)].Max >= k) return query(ls(u),k);
        else return query(rs(u),k);
    }

    #undef ls
    #undef rs
}T;

int main(){
    n = read(),m = read();
    for (re int i = 1;i <= n;i++){
        x[i] = read(),len[i] = read();
        tmp[i] = {x[i],i};
    }
    sort(tmp + 1,tmp + n + 1);
    for (re int i = 1;i <= n;i++){
        id[i] = tmp[i].snd;
        nx[tmp[i].snd] = i;
    }
    T.build(1,1,n);
    while (m--){
        int p,del;
        p = read(),del = read();
        int t = T.query(1,p);
        if (!~t) st.insert({p,del});
        else{
            T.modify(1,nx[t],del);
            auto it = st.lower_bound(make_pair(x[t],-1));
            while (it != st.end() && x[t] + len[t] >= (*it).fst){
                T.modify(1,nx[t],(*it).snd);
                st.erase(it),it = st.lower_bound(make_pair(x[t],-1));
            }
        }
    }
    for (re int i = 1;i <= n;i++) printf("%d %d\n",vis[i],len[i]);
    return 0;
}

标签:吃掉,return,Frogs,题解,tr,CF609F,蚊子,int,ls
From: https://www.cnblogs.com/WaterSun/p/18263305

相关文章

  • [题解]CF988D Points and Powers of Two
    思路首先发现选出的数最多\(3\)个,考虑反证法。假设选出了四个数\(a,b,c,d\),并令:\[|a-b|=2^{x_1},|b-c|=2^{x_2},|c-d|=2^{x_3}\]又因为,\(|a-c|,|b-d|\)也都是\(2\)的次幂,那么有\(x_1=x_2=x_3\)。于是\(|a-d|=3\times2^{x_0}\neq2^k\)。在......
  • P9999 [Ynoi2000] tmostnrq 题解
    巨大难写题。就这样一个毒瘤的题,还有人把时空缩小成二分之一放在模拟赛,太好笑了。思路首先将询问离线。我们在\(l_i\)处加入这个点,在\(r_i\)处查询这个点在哪里。那么我们就需要有一个数据结构支持让所有树上的节点一起动。考虑所有点往\(x\)处动。那么对于在\(1\si......
  • LeetCode:经典题之206、92题解及延伸
    系列目录88.合并两个有序数组52.螺旋数组567.字符串的排列643.子数组最大平均数150.逆波兰表达式61.旋转链表160.相交链表83.删除排序链表中的重复元素389.找不同目录系列目录206.反转链表92.反转链表II类和结构体访问修饰符206.反转链表......
  • UNIQUE VISION Programming Contest 2024 Summer (AtCoder Beginner Contest 359) 题
    点我看题A-CountTakahashi没啥好说的点击查看代码#include<bits/stdc++.h>#definerep(i,n)for(inti=0;i<n;++i)#definerepn(i,n)for(inti=1;i<=n;++i)#defineLLlonglong#definefifirst#definesesecond#definepbpush_back#definemprmake_pair......
  • abc359_G Sum of Tree Distance 题解
    题目链接:Atcoder或者洛谷先考虑暴力,显然是枚举整棵树的路径,这个枚举复杂度显示是\(O(n^2)\),还不考虑计算\(f(i,j)\),考虑使用点分治优化枚举复杂度:\(O(n\log{n})\)。接下来考虑如何计算每条路径的\(f(i,j)\),注意到\(f(i,j)\):当且仅当\(a[i]=a[j]\)时,答案加上\(dis(i,j......
  • P1971 [NOI2011] 兔兔与蛋蛋游戏 题解
    Description这些天,兔兔和蛋蛋喜欢上了一种新的棋类游戏。这个游戏是在一个\(n\)行\(m\)列的棋盘上进行的。游戏开始之前,棋盘上有一个格子是空的,其它的格子中都放置了一枚棋子,棋子或者是黑色,或者是白色。每一局游戏总是兔兔先操作,之后双方轮流操作,具体操作为:兔兔每次操作......
  • P10538 [APIO2024] 星际列车 题解
    题意:有\(n\)个行星,编号为\(0\simn-1\)。有\(m\)辆星际列车,第\(i\)辆列车在时刻\(a_i\)从行星\(x_i\)出发,在时刻\(b_i\)到达行星\(y_i\),代价为\(c_i\)。换乘条件为上一辆车的终点和下一辆车的起点相同,且上一辆车到达时刻\(\le\)下一辆车出发时刻。你需要吃......
  • qoj8542 Add One 2 题解
    题目链接点击打开链接题目解法我们先考虑什么样的序列\(x_1,...,x_n\)是可以被得到的对于\(x_i>x_{i+1}\)的位置,我们需要至少对前缀\([1,i]\)做\(x_i-x_{i+1}\)次操作;对于\(x_{i-1}<x_{i}\)的位置,我们需要至少对后缀\([i,n]\)做\(x_i-x_{i-1}\)次操作我们需要......
  • [集训队互测 2023] 树哈希 题解报告
    [集训队互测2023]树哈希题解报告/bx/bx/bxzky!!!题意给定常数\(q\),定义一棵以\(1\)为根的有根树\(T\)的\(s(T)\)为\(T\)中本质不同的子树数量,定义其权值为\(q^{s(T)}\)。给定\(n\),对于\(i=1,\dots,n\)求所有大小为\(i\)的有标号有根树的权值之和对\(P\)......
  • CF1978E Computing Machine 题解
    好写程度:\(E>D>C\)。好想程度:\(C>D=E\)。总结:C是全场最难。我们考虑把两个操作对全体的\(a_i,b_i\)都做一遍,会发现我们只会做这两遍,不会再有嵌套的了,因为都做过一遍后\(\{a\}\)中0的数量只会减少,而且即使再做一遍也无法给\(\{b\}\)改成不一样的了,比较显然。下文中令......