首页 > 其他分享 >P9912 题解

P9912 题解

时间:2024-09-21 11:23:32浏览次数:1  
标签:Node int 题解 pos P9912 Questions res id

P9912 [COCI 2023/2024 #2] Zatopljenje - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

线段树。

离线处理询问,将询问的高度从大到小排序,每次往线段树中加入高度大于当前询问高度的点,然后做一遍区间连续段个数就可以了。code:

#include <bits/stdc++.h>  
using namespace std;  
  
const int N = 200010;  
int n, q; struct Node { int id, h; } a[N];  
struct Questions {  
    int l, r, h, id, ans;  
} b[N];  
  
struct SgT {  
    int res;  
    bool l1, r1;  
    SgT() {res = l1 = r1 = 0;}  
} T[N * 4];  
#define ls(k) (k << 1)  
#define rs(k) (k << 1 | 1)  
void pushup(SgT& a, SgT son1, SgT son2) {  
    a.res = son1.res + son2.res - (son1.r1 && son2.l1);  
    a.l1 = son1.l1, a.r1 = son2.r1;  
}  
void update(int l, int r, int k, int x) {  
    if(l == r) {  
        T[k].l1 = T[k].r1 = 1, T[k].res = 1;  
        return;  
    }     int mid = (l + r) / 2;  
    if(x <= mid) update(l, mid, ls(k), x);  
    else update(mid + 1, r, rs(k), x);  
    pushup(T[k], T[ls(k)], T[rs(k)]);  
}  
SgT query(int l, int r, int k, int L, int R) {  
    if(L <= l && r <= R) return T[k];  
    int mid = (l + r) / 2; SgT son1, son2; bool b1 = 0, b2 = 0;  
    if(L <= mid) son1 = query(l, mid, ls(k), L, R), b1 = 1;  
    if(mid < R) son2 = query(mid + 1, r, rs(k), L, R), b2 = 1;  
    if(b1 and b2) {  
        SgT res; pushup(res, son1, son2);  
        return res;  
    } else if(b1) return son1;  
    else return son2;  
}  
  
int main() {  
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);  
    cin >> n >> q;  
    for (int i = 1; i <= n; i++) cin >> a[i].h, a[i].id = i;  
    sort(a + 1, a + 1 + n, [](Node x, Node y) {return x.h > y.h;});  
    for (int i = 1; i <= q; i++) cin >> b[i].l >> b[i].r >> b[i].h, b[i].id = i;  
    sort(b + 1, b + 1 + q, [](Questions x, Questions y) {return x.h > y.h;});  
        int pos = 1;  
    for (int i = 1; i <= q; i++) {  
        while(a[pos].h > b[i].h) update(1, n, 1, a[pos].id), pos++;  
        b[i].ans = query(1, n, 1, b[i].l, b[i].r).res;  
    }  
    sort(b + 1, b + 1 + q, [](Questions x, Questions y){return x.id < y.id;});  
    for (int i = 1; i <= q; i++) cout << b[i].ans << '\n';  
    return 0;  
}

标签:Node,int,题解,pos,P9912,Questions,res,id
From: https://www.cnblogs.com/Running-a-way/p/18423757

相关文章

  • CCF-CSP资格认证题解系列——第1次第1题相反数
    #include<iostream>usingnamespacestd;intcnt;//N个非零且各不相同的整数intmain(){ intn; cin>>n; inta[n]; for(inti=0;i<n;i++){ cin>>a[i]; } for(inti=0;i<n;i++){ for(intj=i+1;j<n;j++){ if(a[i]+a[j]==0){ cnt++; ......
  • Acwing题解系列——841. 字符串哈希
    #include<iostream>usingnamespacestd;constintN=100010;constintP=131;/*题解https://www.acwing.com/solution/content/24738/可以 把字符串变成一个p进制数字(哈希值),实现不同的字符串映射到不同的数字。采用字符的ascii码乘上P的次方来计算哈希值。X1X2X......
  • 帝国CMS7.5使用常见问题解答
    帝国CMS7.5使用常见问题解答一、7.5版的点击显示验证码如何调用?加载AJAX脚本文件在显示验证码的页面中加载 /e/data/js/ajax.js 文件。例如在HTML中加入:html <scriptsrc="/e/data/js/ajax.js"></script>显示验证码使用帝国CMS提供的验证码显示方法......
  • CF538H Summer Dichotomy 题解
    自己做的\^w^/。对于\(m\)个限制,我们得到了一个图,若不是二分图则无解,否则对于每个连通块有\([l_1,r_1],[l_2,r_2]\)的限制,表示对于两组的人数限制(注意此处\(1,2\)并不代表组\(1\),\(2\))。不妨令\(n_1\gen_2,(r_1>r_2\operatorname{or}r_1==r_2\operato......
  • 力扣题解2376
    大家好,欢迎来到无限大的频道。今日继续给大家带来力扣题解。题目描述(困难):统计特殊整数如果一个正整数每一个数位都是 互不相同 的,我们称它是 特殊整数 。给你一个 正 整数 n ,请你返回区间 [1,n] 之间特殊整数的数目。​解题思路:要计算区间([1,n])之间的......
  • 题解 GD230531C【眺望】
    题目描述有\(n\)座灯塔排成一排,第\(i\)座灯塔的高度是\(a_i\)。你需要求出有多少对\(l<r\)满足\(a_l=a_r\),且\(\foralll<i<r,a_i<a_l\)。灯塔的高度有\(Q\)次修改,每次给定\(x,h\),表示将\(a_x\)修改为\(h\)。求出修改之前和每次修改之后的答案。\(n......
  • CF538G 题解
    CF538G题意\(s\)为长为\(l\)的由U、L、D、R组成的操作序列,一个机器人从\((0,0)\)开始按照\(s_{1\siml}\)的顺序循环行动\(+\infty\)次。给定n个形如\((t_i,x_i,y_i)\)的限制,表示第\(t_i\)时刻到达\((x_i,y_i)\)。构造\(s_{1\siml}\)。思路首先可以......
  • 力扣188-买卖股票的最佳时机 IV(Java详细题解)
    题目链接:188.买卖股票的最佳时机IV-力扣(LeetCode)前情提要:本题是由123.买卖股票的最佳时机III-力扣(LeetCode)变形而来,123是只能买卖俩次股票,该题是只能买卖k次股票,我相信当你做完这道题或者看完我上道题的题解,那么写这道题会轻松一点。因为本人最近都来刷dp类的题......
  • CF1977E 题解
    根据Dilworth定理,该图能被两条互不相交的链覆盖。从小到大加点。我们现在需要维护两个栈,每个栈维护每条链的点。若两个栈头没有连边,那么对于新加入的点,一定可以放到其中一个栈。现在唯一的问题是,新加入的点可能可以放入两个栈。我们可以再开一个栈三,用来维护以上述点为头的......
  • 【Py/Java/C++三种语言OD独家2024E卷真题】20天拿下华为OD笔试之【模拟】2024E-转骰子
    可上欧弟OJ系统练习华子OD、大厂真题绿色聊天软件戳od1441了解算法冲刺训练(备注【CSDN】否则不通过)文章目录相关推荐阅读题目描述与示例题目描述输入描述输出描述示例一输入输出说明示例二输入输出说明解题思路构建长度为6的数组表......