首页 > 其他分享 >22.8.19

22.8.19

时间:2022-08-20 00:33:32浏览次数:112  
标签:dep nl 19 sum mid int ls 22.8

22.8.19

ABC256_H

题意:

要求实现三种操作

  • 将区间 \(L\) 到 \(R\) 中的数变为 \(\lfloor \frac{a_i}{x}\rfloor\)
  • 将区间 \(L\) 到 \(R\) 中的数变为 \(x\)
  • 查询 \(L\) 到 \(R\) 的区间和

思路:

\(x\geq2\), 那么考虑一个数最多做 \(log\) 次操作一, 对于操作二, 最多将势能升高 \(log\), 但是由于操作二推平了区间, 对于整个相同的区间, 没有必要每个数去改, 只需要改一个, 其他的数是相同的, 那么升高的势能的位置其实是常数级

所以此时直接势能线段树即可

#define ls(p) (p<<1)
#define rs(p) (p<<1|1)
#define mid ((l+r)>>1)
const int INF=1e16,mod=998244353,N=5e5+10;
int sum[N<<2],dep[N<<2],a[N];
void pushup(int p) {
    if(dep[ls(p)]==dep[rs(p)]&&dep[ls(p)]>=0) {
        dep[p]=dep[ls(p)];
    } else dep[p]=-1;
    sum[p]=sum[ls(p)]+sum[rs(p)];
}
void build(int p,int l,int r) {
    dep[p]=-1;
    if(l==r) {
        dep[p]=sum[p]=a[l];
        return;
    }
    build(ls(p),l,mid);
    build(rs(p),mid+1,r);
    pushup(p);
}
void pushdown(int l,int r,int p) {
    if(dep[p]!=-1) {
        dep[ls(p)]=dep[rs(p)]=dep[p];
        sum[ls(p)]=dep[p]*(mid-l+1);
        sum[rs(p)]=dep[p]*(r-mid);
        dep[p]=-1;
    }
}
void update1(int p,int l,int r,int nl,int nr,int x) {
    if(l>=nl&&r<=nr) {
        if(dep[p]!=-1) {
            dep[p]/=x;
            sum[p]=dep[p]*(r-l+1);
        } else {
            pushdown(l,r,p);
            update1(ls(p),l,mid,nl,nr,x);
            update1(rs(p),mid+1,r,nl,nr,x);
            pushup(p);
        }
        return;
    }
    pushdown(l,r,p);
    if(mid>=nl) update1(ls(p),l,mid,nl,nr,x);
    if(mid+1<=nr) update1(rs(p),mid+1,r,nl,nr,x);
    pushup(p);
}
void update2(int p,int l,int r,int nl,int nr,int x) {
    if(l>=nl&&r<=nr) {
        dep[p]=x;
        sum[p]=x*(r-l+1);
        return;
    }
    pushdown(l,r,p);
    if(mid>=nl) update2(ls(p),l,mid,nl,nr,x);
    if(mid+1<=nr) update2(rs(p),mid+1,r,nl,nr,x);
    pushup(p);
}
int query(int p,int l,int r,int nl,int nr) {
    if(l>=nl&&r<=nr) return sum[p];
    pushdown(l,r,p);
    int ret=0;
    if(mid>=nl) ret+=query(ls(p),l,mid,nl,nr);
    if(mid+1<=nr) ret+=query(rs(p),mid+1,r,nl,nr);
    return ret;
}
void solve() {
    int n,q;
    cin>>n>>q;
    for(int i=1;i<=n;i++) {
        cin>>a[i];
    }
    build(1,1,n);
    while(q--) {
        int op;
        cin>>op;
        if(op==1) {
            int l,r,x;
            cin>>l>>r>>x;
            update1(1,1,n,l,r,x);
        } else if(op==2) {
            int l,r,x;
            cin>>l>>r>>x;
            update2(1,1,n,l,r,x);
        } else {
            int l,r;
            cin>>l>>r;
            cout<<query(1,1,n,l,r)<<endl;
        }
    }
}

标签:dep,nl,19,sum,mid,int,ls,22.8
From: https://www.cnblogs.com/ZI-MA/p/16606985.html

相关文章

  • 819(移动端)
    触屏事件触屏事件概述移动端浏览器兼容性较好,我们不需要考虑js的兼容性问题,可以放心使用原生js书写效果。移动端有自己独特的地方,比如触屏touch(触摸事件),Android和ios都......
  • 2022-08-19 第五组 赖哲栋 学习笔记
    Statement的不足大量的字符串拼接,代码可读性降低sql注入PreparedStatement预编译(预加载)接口通过conn获取的对象是statement接口的子接口sql语句中可以传参。......
  • 2022-08-19 第二小组 张鑫 学习笔记
    实训四十一天JDBC(PreparedStatement,事务)1.学习重点1.PreparedStatement2.事务处理2.学习心得今天是在黑夜中学习的一天...3.学习内容PreparedStatementStatement......
  • 2022-8-19 第六组 JDBC(2)
    PreparedStatement:执行sql的对象1.SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题1.输入用户随便,输入密码:a'or'a'='a2.sql:sel......
  • 2022-08-19 第五组 罗佳明
    一、学习重点  二、学习内容案例一:查询(面对对象思想)packagecom.jsoft.morning.test;importorg.junit.Test;importjava.util.List;publicclassDemo{......
  • 2022-08-19 第八组 卢睿 学习心得
    目录JDBCStatement的不足SQL注入PreparedStatement:预编译(预加载)接口案例ResultSetMetaData(了解即可)数据库事务Mysql的数据库引擎4事务的四大特征ACID原子性A。一致性C......
  • 8.19
    CF1720D2题意:给定序列\(A\),求\(A\)的最长子序列\(B\),满足\(a_p\oplusp+1<a_{p+1}\oplusp\)\(n\leq3*10^5,0\leqa_i\leq10^9\)题解:枚举两边的值从高位到地位有多......
  • 2022-8-19 第一组 (≥▽≤) 学习笔记
    目录1.JDBC2.数据库事务面试题1.JDBCStatement的不足之处大量的字符串拼接,代码可读性降低sql注入PreparedStatement——预编译(预加载)接口通过Connection获取的......
  • 【2022-08-19】mysql基础知识(六)
    mysql基础知识(六)mysql之视图view什么是视图?视图就是通过查询得到的一张虚拟表,然后保存下来,下次直接进行使用即可。即:将SQL语句的查询结果当做虚拟表保存起来,以后可......
  • 20220819总结
    这次考试太烂了,又没考过Diavolo。T1简单的入门题,先热身。#include<iostream>#defineintlonglong#defineN5001usingnamespacestd;intn,ans;doublea[N]......