首页 > 其他分享 >[ABC256Ex] I like Query Problem

[ABC256Ex] I like Query Problem

时间:2023-09-28 15:48:39浏览次数:38  
标签:rs int mid fnd il ABC256Ex Query Problem id

原题传送门

题意

区间整除,区间推平,查询区间和。


大家好啊,我喜欢暴力乱搞,所以这题我用暴力乱搞 AC 了。

首先观察到操作 \(1\) 的性质:首先保证了除数至少为 \(2\)(不然是 \(1\) 或者 \(0\) 的话也没啥意义啊),所以对一个数不断进行操作的话,每次数的大小至少会减少一半,减小到 \(0\) 之后就不用操作了,因为再操作也就没有意义了,所以最多进行的次数是 \(\log_x\) 级别,其中 \(x\) 是原先的数值。所以我们用线段树维护区间和的同时再维护一个区间最大值,每次只要当前区间的最大值不为 \(0\) 就进去暴力修改,时间复杂度为 \(O(n\log n)\)。

但是有个问题是,如果加上区间推平操作之后,我们每次推平之后就不能维持原来的最大值了,这样最坏复杂度就又会退化成纯暴力的复杂度。

但是区间推平这个操作我们还可以用另一个东西去维护啊,没错就是 \(ODT\)!

但是如果区间推平操作很少的话,\(ODT\) 的用时表现就会变得很差。

所以我们直接合在一起乱搞啊!

将全部操作存下来,同时给区间推平操作计数,如果次数大于 \(2000\) 就用 \(ODT\),否则就用线段树。

然后你就会发现这东西跑得飞快(。


评测记录

\(\text{Code:}\)

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define il inline
#define re register
const int N=500500;
int n,m,a[N],cnt;
struct query{
    int op,l,r,x;
}q[N];
il int read(){
    re int x=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();
    return x*f;
}
struct Chtholly{
    int l,r;
    mutable int val;
    Chtholly(int l,int r=0,int val=0):l(l),r(r),val(val){}
    bool operator<(const Chtholly &a)const{
        return l<a.l;
    }
};
set<Chtholly>s;
#define It set<Chtholly>::iterator
il It Split(int pos){
    It fnd=s.lower_bound(Chtholly(pos));
    if(fnd!=s.end()&&fnd->l==pos)return fnd;
    fnd--;
    if(fnd->r<pos)return s.end();
    int l=fnd->l,r=fnd->r,val=fnd->val;
    s.erase(fnd);
    s.insert(Chtholly(l,pos-1,val));
    return s.insert(Chtholly(pos,r,val)).first;
}
il void Assign(int l,int r,int x){
    It R=Split(r+1),L=Split(l);
    s.erase(L,R);
    s.insert(Chtholly(l,r,x));
}
il void update(int l,int r,int x){
    It R=Split(r+1),L=Split(l);
    for(re It i=L;i!=R;i++)i->val/=x;
}
il void solve(int l,int r){
    int res=0;
    It R=Split(r+1),L=Split(l);
    for(re It i=L;i!=R;i++)
        res+=(i->r-i->l+1)*i->val;
    printf("%lld\n",res);
}
struct SegmentTree{
    int sum,mx,tag;
}L[N<<2];
#define ls (id<<1)
#define rs (id<<1|1)
il void pushup(SegmentTree &fa,SegmentTree lson,SegmentTree rson){
    fa.sum=lson.sum+rson.sum;
    fa.mx=max(lson.mx,rson.mx);
}
il void pushdown(SegmentTree &fa,SegmentTree &lson,SegmentTree &rson,int l,int r){
    if(!fa.tag)return;
    int mid=(l+r)>>1,t=fa.tag;
    lson={(mid-l+1)*t,t,t};
    rson={(r-mid)*t,t,t};
    fa.tag=0;
}
il void upd(int id,int l,int r,int x,int y,int z){
    if(!L[id].mx)return;
    if(l==r){
        L[id].sum/=z,L[id].mx/=z;
        return;
    }
    int mid=(l+r)>>1;
    pushdown(L[id],L[ls],L[rs],l,r);
    if(x<=mid)upd(ls,l,mid,x,y,z);
    if(y>mid)upd(rs,mid+1,r,x,y,z);
    pushup(L[id],L[ls],L[rs]);
}
il void Ass(int id,int l,int r,int x,int y,int z){
    if(l>=x&&r<=y){
        L[id]={(r-l+1)*z,z,z};
        return;
    }
    int mid=(l+r)>>1;
    pushdown(L[id],L[ls],L[rs],l,r);
    if(x<=mid)Ass(ls,l,mid,x,y,z);
    if(y>mid)Ass(rs,mid+1,r,x,y,z);
    pushup(L[id],L[ls],L[rs]);
}
il int GetSum(int id,int l,int r,int x,int y){
    if(l>=x&&r<=y)return L[id].sum;
    int mid=(l+r)>>1,res=0;
    pushdown(L[id],L[ls],L[rs],l,r);
    if(x<=mid)res+=GetSum(ls,l,mid,x,y);
    if(y>mid)res+=GetSum(rs,mid+1,r,x,y);
    pushup(L[id],L[ls],L[rs]);
    return res;
}
il void build(int id,int l,int r){
    if(l==r){
        L[id]={a[l],a[l],0};
        return;
    }
    int mid=(l+r)>>1;
    build(ls,l,mid),build(rs,mid+1,r);
    pushup(L[id],L[ls],L[rs]);
}
il void solve_odt(){
    for(re int i=1;i<=n;i++)
        s.insert(Chtholly(i,i,a[i]));
    for(re int i=1;i<=m;i++){
        if(q[i].op==1)update(q[i].l,q[i].r,q[i].x);
        if(q[i].op==2)Assign(q[i].l,q[i].r,q[i].x);
        if(q[i].op==3)solve(q[i].l,q[i].r);
    }
}
il void solveSegmentTree(){
    build(1,1,n);
    for(re int i=1;i<=m;i++){
        int op=q[i].op,l=q[i].l,r=q[i].r,x=q[i].x;
        if(op==1)upd(1,1,n,l,r,x);
        if(op==2)Ass(1,1,n,l,r,x);
        if(op==3)printf("%lld\n",GetSum(1,1,n,l,r));
    }
}
signed main(){
    n=read(),m=read();
    for(re int i=1;i<=n;i++)a[i]=read();
    for(re int i=1;i<=m;i++){
        q[i].op=read(),q[i].l=read(),q[i].r=read();
        if(q[i].op!=3)q[i].x=read();
        if(q[i].op==2)cnt++;
    }
    if(cnt>2000)solve_odt();
    else solveSegmentTree();
    return 0;
}

标签:rs,int,mid,fnd,il,ABC256Ex,Query,Problem,id
From: https://www.cnblogs.com/MrcFrst-LRY/p/17735901.html

相关文章

  • Problem - 616C - Codeforces
    Problem-616C-CodeforcesC.TheLabyrinth如果是直接对\(*\)去跑dfs或者bfs的话无疑是会超时的既然如此,那我们可以去对\(.\)跑搜索,将各个连通的\(.\)块标号并计算出连通块内的点的数量,然后去遍历\(*\)的时候只需要上下左右跑一下计算即可啊,在\(bfs\)或\(dfs\)的时......
  • 你没有看错,爬网页数据,C# 也可以像 Jquery 那样
    一:背景1.讲故事前段时间搞了一个地方性民生资讯号,资讯嘛,都是我抄你的,你抄官媒的,小市民都喜欢奇闻异事,所以就存在一个需求,如何去定向抓取奇闻异事的地方号上的新闻,其实做起来很简单,用逻辑回归即可,这篇主要讨论如何去抓取,在C#中大家都知道抓取通用的库是HtmlAgilityPack,但是这个......
  • 在Koa2中,ctx.request.body和ctx.query的主要区别
    在Koa2中,ctx.request.body和ctx.query的主要区别在于获取参数的位置不同。ctx.query用于获取URL查询参数,而ctx.request.body用于获取请求体中的参数。下面是详细的区别和示例代码。获取URL查询参数URL查询参数是指在URL中以?开头,&连接的键值对参数。例如,以下URL中的查询参数为nam......
  • jquery相关总结
    JQuery使用技巧总结作者:未知一、简介1.1、概述随着WEB2.0及ajax思想在互联网上的快速发展传播,陆续出现了一些优秀的Js框架,其中比较著名的有Prototype、YUI、jQuery、mootools、Bindows以及国内的JSVM框架等,通过将这些JS框架应用到我们的项目中能够使......
  • P9566 [SDCPC2023] K-Difficult Constructive Problem 题解
    @目录DescriptionSolutionSol1Code1Sol2Code2Description有一个长度为\(n\)的01字符串\(s\),其中部分位置已给出,在?的位置处需填入一个1或0。一个填充方案是好的,当且仅当存在\(m\)个不同的\(i\)满足\(1\lei<n\)且\(s_i\nes_{i+1}\)。求所有好的填充方案中字典......
  • 185_技巧_Power Query(M)语言快捷输入之搜狗输入法设置自定义短语
    185_技巧_PowerQuery(M)语言快捷输入之搜狗输入法设置自定义短语此前,我们发布过如何通过QQ拼音输入法来实现快速的输入PowerQuery(M)语言。参考:https://jiaopengzi.com/730.html今天我们来更新PowerQuery(M)语言在搜狗输入法中设置自定义短语的快捷输入。快捷输入效......
  • 利用jQuery实现表格或者区域内数据的滚动展示效果
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title><......
  • 基于jquery开发的Windows 12网页版
    预览https://win12.gitapp.cn首页代码<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="refresh"content="0;url=desktop.html"/><metaname=&q......
  • Jquery
    1.jquery就是一个js库2.jquery这个库向外暴露了jQuery或者$()这个函数。3.得到一个jquery对象letobj=$('#id')4.$()此时$代表函数,$.each()此时$代表对象。参数是选择器字符串返回一个jquery对象。注意只有jquery对象才能够调用val()...html()的jquery方法。5.jquery对象里面包含......
  • 根据周数计算月(Power Query)
    问题:如何根据周数计算月假设:以每周第一天为标准,一周从周一开始计let源=Excel.CurrentWorkbook(){[Name="表1"]}[Content],当前年=Table.AddColumn(源,"23年",eachDate.Month(Date.AddDays(#date([年],1,1),[周]*7-7))),通用年=Table.AddColumn(当前年,......