首页 > 其他分享 >CF1887C Minimum Array

CF1887C Minimum Array

时间:2023-10-23 21:11:48浏览次数:37  
标签:int CF1887C 合法 Minimum 区间 Array

CF1887C Minimum Array

小丑做法。

首先差分一下,转化成两次单点加。每次考虑前 \(i\) 位,然后一直维护当前合法的时刻区间,这个东西怎么做呢?可以离线下来记录每个点被那些操作波及,然后算一遍前缀和,对于合法的区间区间打标记。需要支持区间加 \(1\) 和查询最大值,用线段树维护。复杂度 \(O(n + q \log n)\)。

const int N = 1e6 + 10;
int n;
int m, L[N], R[N];
LL val[N], d[N], a[N];
vector<pii> vec[N];

struct SegmentTree {
  int tr[N << 2], tag[N << 2];
#define lc (k << 1)
#define rc (k << 1 | 1)
#define mid (l + r) / 2
  void update(int k) {
    tr[k] = max(tr[lc], tr[rc]);
  }
  void addtag(int k, int x) {
    tr[k] += x, tag[k] += x;
  }
  void pushdown(int k) {
    if(tag[k]) {
      addtag(lc, tag[k]);
      addtag(rc, tag[k]);
      tag[k] = 0;
    }
  }
  void modify(int k, int l, int r, int L, int R) {
    if(r < L || R < l) return ;
    if(L <= l && r <= R) {
      addtag(k, 1);
      return ;
    }
    pushdown(k);
    modify(lc, l, mid, L, R);
    modify(rc, mid + 1, r, L, R);
    update(k);
  }
  int query(int k, int l, int r, int L, int R) {
    if(r < L || R < l) return 0;
    if(L <= l && r <= R) return tr[k];
    pushdown(k);
    return max(query(lc, l, mid, L, R), query(rc, mid + 1, r, L, R));
  }
  void build(int k, int l, int r) {
    tr[k] = tag[k] = 0;
    if(l == r) return ;
    build(lc, l, mid), build(rc, mid + 1, r);
  }
}seg;

int query(int l, int r) {
  return seg.query(1, 1, m + 1, l + 1, r + 1);
}
void modify(int l, int r) {
  seg.modify(1, 1, m + 1, l + 1, r + 1);
}

void clear() {
  for(int i = 1; i <= n; ++i)
    d[i] = 0, vec[i].clear();
}

void solve() {
  read(n);
  for(int i = 1; i <= n; ++i)
    read(a[i]);
  read(m);
  clear();
  seg.build(1, 1, m + 1);
  for(int i = 1; i <= n; ++i)
    vec[i].emplace_back(mp(0, 0));
  for(int i = 1; i <= m; ++i) {
    read(L[i], R[i], val[i]);
    vec[L[i]].emplace_back(mp(i, val[i]));
    vec[R[i] + 1].emplace_back(mp(i, -val[i]));
  }
  for(int i = 1; i <= n; ++i) {
    LL s = 0, mn = 1e18;
    vec[i].emplace_back(mp(m + 1, 0));
    for(int j = 0; j < sz(vec[i]) - 1; ++j) {
      s += vec[i][j].second;
      if(vec[i][j].first < vec[i][j + 1].first && s < mn && query(vec[i][j].first, vec[i][j + 1].first - 1) == i - 1)
        mn = min(mn, s);
    }
    s = 0;
    for(int j = 0; j < sz(vec[i]) - 1; ++j) {
      s += vec[i][j].second;
      if(vec[i][j].first < vec[i][j + 1].first && s == mn && query(vec[i][j].first, vec[i][j + 1].first - 1) == i - 1) 
        modify(vec[i][j].first, vec[i][j + 1].first - 1);
    }
    d[i] = mn;
  }
  for(int i = 1; i <= n; ++i)
    d[i] += d[i - 1], printf("%lld ",a[i] + d[i]);
  puts("");
}

int main() {
  int T; read(T);
  while(T--) solve();  
}

标签:int,CF1887C,合法,Minimum,区间,Array
From: https://www.cnblogs.com/DCH233/p/17783499.html

相关文章

  • ArrayBuffer
    ArrayBuffer对象、TypedArray视图和DataView视图是JavaScript操作二进制数据的一个接口。这些对象早就存在,属于独立的规格(2011年2月发布),ES6将它们纳入了ECMAScript规格,并且增加了新的方法。它们都是以数组的语法处理二进制数据,所以统称为二进制数组。这个接口的原始设计目......
  • CF1479B1 Painting the Array I
    如果两种方案末尾两数有一数相同,那么答案较大的方案不劣于答案较小的方案。答案较大的方案只需\textbf{模仿}答案较小的方案即可,在状态变成相同之前答案最多只会少\(1\)。所以只需要考虑末尾两数\(a,b\)与新进来的数\(c\)各不相同时该替换哪个。假设\(a\)下次出现的位置......
  • B. Friendly Arrays
    B.FriendlyArrays依据异或特性,如果n为偶数,单调递减:与b[i]|越多越小反之递增点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintN=2e5+10;#defineLLlonglonginta[N],b[N];voidsolve(){ intn,m; cin>>n>>m; if(n%2==0){ int......
  • hook array push
       letarr=[1,2,3];letproxy=newProxy(arr,{get(target,prop){if(prop==='push'){returnfunction(...args){console.log('push方法被调用了');returntarget[prop].apply(target,args);}......
  • Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法
    Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,此处测试代码如下,这里使用add方法:1publicclassmain{2publicstaticvoidmain(String[]args){3int[]num={1,2,3};4Listlist=Arrays.asList(num);5list.add(4);......
  • 无涯教程-AWK - 数组(Array)
    AWK具有关联数组,您可以使用字符串或数字作为数组索引。array_name[index]=value其中array_name是数组的名称,index是数组的索引,而value是分配给数组元素的任何值。创建数组为了获得更多关于数组的见解,让我们创建和访问数组的元素。[Learnfk]$awk'BEGIN{fruits["m......
  • 无涯教程-Arduino - Multi-Dimensional Arrays函数
    具有二维的数组(即下标)通常表示由以行和列排列的信息组成的值表。intb[2][2]={{1,2},{3,4}};这些值按大括号按行分组,因此,1和2分别初始化b[0][0]和b[0][1],而3和4分别初始化b[1][0]和b[1][1],如果给定行的初始化程序不足,则将该行的其余元素初始化为0。因此......
  • disp函数/fprintf函数/arrayfun函数
    disp命令只能打印多个变量的值打印多个变量时,可以把它们放在一个数组中或结构体中fprintf命令打印多个变量fpritf(fileID,formatSpec,A1,A2,A3...)arrayfun(func,A)将func应用于A的每个元素functiony=f(x)...endx=-2:1:2;y=arrayfun(@f,x);plot(x,y)......
  • Arrays.asList() 和 Collections.singletonList()
    Collections.singletonList()  创建不可变List,只包含单个元素,List容量始终为1;  Arrays.asList()  快速创建List,但创建的列表是不可变的,不可调用add方法;......
  • Atcoder Beginner Contest 324 G Generate Arrays 题解-Treap
    为了更好的阅读体验,请点击这里题目链接套上平衡树板子就能做的很快的题,然后因为是指针存树,因此交换只需要把序列大小较小的挨个拿出来插到相应的地方即可。复杂度\(O(N\log^2N)\)。但是一定要记住不可以直接使用std::swap交换包含带有指针的类的实例(如代码中的Treap类)!......