首页 > 其他分享 >10.21

10.21

时间:2024-10-21 21:31:49浏览次数:1  
标签:10.21 int res mid pos dat maxN

没时间写题了,写点题解。一道题写了一晚上,效率有点低。。。

多校A层冲刺NOIP2024模拟赛09 区间

给定一个长度为 \(N\) 的数列 \(A_1,A_2,\dots,A_N\) 和一个长度为 \(N−1\) 的数列 \(B_2,B_3,\dots,B_N\)。

有 \(Q\) 个询问,每次询问是一个区间 \([L_i,R_i]\)。请你求出有多少二元组 \((l,r)\) 满足:

  • \(L_i \leq l < r \leq R_i\) ​

  • \(\forall i\in\{l+1,l+2,\dots,r-1\}, A_l>A_i\)(如果 \(l+1=r\) 则忽略这一条件,认为符合)

  • \(\forall i\in\{l,l+1,\dots,r-1\}, B_r>A_i\)

把询问离线下来,扫描线,把询问挂在右端点。

对于第一次个限制可以用单调栈维护​,栈内元素严格递减。

对于 \(B_i\) 在单调栈中二分看有哪些 \(A_i\) 符合条件,对于这些元素记录一次版本。

用历史和线段树可以轻松做。

#include <bits/stdc++.h>

using namespace std;

using ubt = long long;

int read() {
  int x;
  cin >> x;
  return x;
}

const int maxN = 3e5 + 7;

int n, m, a[maxN], b[maxN];

vector<pair<int, int>> q[maxN];

int top, stk[maxN];

int tg[maxN * 4];
struct dat {
  ubt v, h;
  friend dat operator + (dat A, dat B) {
    dat res;
    res.v = A.v + B.v;
    res.h = A.h + B.h;
    return res;
  }
} t[maxN * 4];
#define ls (p << 1)
#define rs (p << 1 | 1)
void make(int p, int v) {
  tg[p] += v;
  t[p].h += t[p].v * v;
}
void down(int p) {
  if (!tg[p]) return;
  make(ls, tg[p]);
  make(rs, tg[p]);
  tg[p] = 0;
}
void change(int K, int v, int l, int r, int p) {
  if (l == r) {
    t[p].v += v;
    return;
  }
  down(p);
  int mid = (l + r) >> 1;
  K <= mid ? change(K, v, l, mid, ls) : change(K, v, mid + 1, r, rs);
  t[p] = t[ls] + t[rs];
}
void add(int L, int R, int l, int r, int p) {
  if (L <= l && r <= R) {
    make(p, 1);
    return;
  }
  down(p);
  int mid = (l + r) >> 1;
  if (L <= mid)
    add(L, R, l, mid, ls);
  if (R > mid)
    add(L, R, mid + 1, r, rs);
  t[p] = t[ls] + t[rs];
}

ubt ask(int L, int R, int l, int r, int p) {
  if (L <= l && r <= R)
    return t[p].h;
  down(p);
  int mid = (l + r) >> 1;
  ubt res = 0;
  if (L <= mid)
    res = ask(L, R, l, mid, ls);
  if (R > mid)
    res += ask(L, R, mid + 1, r, rs);
  return res;
}

ubt ans[maxN];

int main() {
  freopen("interval.in", "r", stdin);
  ofstream cout("interval.out");

  n = read();
  for (int i = 1; i <= n; i++) a[i] = read();
  for (int i = 2; i <= n; i++) b[i] = read();
  m = read();
  for (int i = 1; i <= m; i++) {
    int l = read(), r = read();
    q[r].emplace_back(l, i);
  }

  stk[top = 1] = 1;
  change(1, 1, 1, n, 1);
  for (int i = 2; i <= n; i++) {
    auto erfen = [](int l, int r, int x) {
      int pos = 1e9;
      while (l <= r) {
        int mid = (l + r) >> 1;
        if (a[stk[mid]] >= x)
          l = mid + 1;
        else
          r = mid - 1, pos = mid;
      }
      return pos;
    };

    int pos = erfen(1, top, b[i]);

    if (pos != 1e9)
      add(stk[pos], i, 1, n, 1);

    for (auto [l, id] : q[i])
      ans[id] = ask(l, i, 1, n, 1);

    while (top && a[stk[top]] <= a[i])
      change(stk[top], -1, 1, n, 1), top--;
    stk[++top] = i;
    change(i, 1, 1, n, 1);
  }

  for (int i = 1; i <= m; i++)
    cout << ans[i] << '\n';
}

多校A层冲刺NOIP2024模拟赛10
不让走最短路中最后一条边的最短路

我没脑子,只会暴力数据结构。

考场上直接秒了,但有细节问题,但数据水直接过了,但后来加强了。

最短路唯一,那可以建出最短路树。

对于每个节点的答案就是不能经过与父亲的连边。

那每个点的答案就是子树内的点与子树外的点的连边贡献的。

考虑数据结构暴力维护。

把每个边塞到平衡树里。

没写完。
明天补。

标签:10.21,int,res,mid,pos,dat,maxN
From: https://www.cnblogs.com/ccxswl/p/18491406

相关文章

  • 10.21 ~ 10.27
    10.21Day-4快CSP啦……话说真的应该这么早就开始记“Dayx”吗为啥这几天这么冷啊要冻死了......
  • 24.10.21
    嘛,我是个非常没有动力的人啊现在大概只想躺平哦有时候也可能会有一点点干劲吧,不过属于是过一两个小时就会消失的那种大概是因为没有目标吧,也可以说是没有我特别感兴趣的事其实硬要说感兴趣的事嘛,也有,不过基本都不切实际罢了我倒是想去学钢琴,画画,日语啊啥的,但是家庭条件和生活......
  • 10.21日每日收获
    1、扇区擦除时按首地址擦除,若设定地址不是首地址也从首地址开始擦除,每512个字节为一组,如00H-200H为一组,200H-400H为一组,擦除数据时按组擦除,若果设置擦除开始地址为100h,则仍然会从00H-200H擦除,而不是100H-300H2、有些芯片的FLASHROM结构是类RAM结构,也就是无需擦除可以直接覆盖......
  • 2024.10.21训练记录
    上午NOIP模拟赛A猜了结论。一个一个数做。当前这个数插进去的时候,设前驱为pre[i],后继为nxt[i]。设\(x=max(a[pre[i]],a[nxt[i]]),y=min(a[pre[i]],a[nxt[i]])\)。则:当\(a[i]>x\)时,\(ans+=a[i]-x\);当\(a[i]<y\)时,\(ans+=y-a[i]\);否则\(ans\)不......
  • 24.10.21 FH
    没保存,CaO抢救了一下,详见mysol:A打表。1I2IIVX3IIIIVVIIX4VII5VIII剩余的加X,再加2火柴即可注意没有40!完整:1I2IIVX3IIIIVVIIXXI4VIIXIIXVXX5VIIIXIIIXIVXVIXIXXXI6XVIIXXIIXXVXXX7XVIIIXXIIIXXIVXXVIXXIXXXXI8XXVII......
  • 2024.10.21 test
    B求长度\(\gek\)的区间去掉前\(k\)大剩下权值和的最大值。\(n\le1e5,k\le100\)。一个比较暴力的办法就是维护出每个区间的答案,考虑一个位置什么时候被扣掉。首先计算出左边前\(k\)个与右边前\(k\)个比\(a_i\)大的位置,然后考虑匹配,形成的区间里都减去\(a_i\)。然......
  • 2024.10.21 杂题
    2024.10.21杂题P11217【MX-S4-T1】「yyOIR2」youyou的垃圾桶\(O(n\logn)\)线段树二分不会,想写\(O(q\log^2n)\)的二分,但是htdlz说常数大可能过不去。所以我选择写树状数组实现的\(O(q\log^2n)\)做法然后跑的飞快比线段树二分还快直接过了(doge)记录前缀和\(s[i......
  • 10.21课堂
    教案:沪教版牛津英语4AM1U3《Howdoyoufeel?》一、教材分析本单元通过“情感”这一主题,引导学生学习和使用描述情感的词汇和句型。教材设计注重情感表达的实际运用,结合生活场景,帮助学生理解不同情感的表达方式。此外,课文中的对话和活动也鼓励学生参与互动,提升口语表达能力。二......
  • 设置显示或者隐藏MasterSeeker和Total Commander主窗口的快捷键的AutoHotkey脚本2024.
    设置显示或者隐藏MasterSeeker和TotalCommander主窗口的快捷键的AutoHotkey脚本2024.10.21=========  ;========设置显示或者隐藏MasterSeeker和TotalCommander主窗口的快捷键的AutoHotkey脚本2024.10.21=========;此脚本从此行开始;D:\app\RegHotkey\RegHotkey.a......
  • 10.21
    大学为进一步推进无纸化考试,研开发一考试统。系统管理员能够创建专业方向、课程编号、任课教师等相关考试基础信息。教师和者生进行考试相关工作。系统与考试系统与考试有关的主要功能如下:(1)考试设置:教师设置试题(题目和答案),制定考试说明。考试时间和提醒时间等考试信息,录入参......