首页 > 其他分享 >势能分块模板

势能分块模板

时间:2022-11-15 18:44:28浏览次数:56  
标签:势能 val 分块 int max kn long ri 模板

分块:

  • 把n分成sqrt(n)块, 中间整体修改,2边暴力修改即可, 修改,查询的复杂度为3sqr(n);
  • 比线段树好写一些?
  • 当然整体的修改的时候,有时候要用 lz 去处理, 
  • 和势能线段树有共同的思想.

模板:

建块:

cin>>n;
    int d=sqrt(n);
    int kn=0;
    for(ri i=1;i<=n;i++) p[i].l=n,p[i].r=0;
    for(ri i=1;i<=n;i++)
    {
        cin>>val[i];
        int a=i/d+1;kn=max(kn,a);
        p[a].val+=val[i];
        p[a].l=min(i,p[a].l);
        p[a].r=max(p[a].r,i);
    }
View Code

处理:

cin>>m;
    for(ri i=1;i<=m;i++)
    {
        int op,a,b;
        cin>>op>>a>>b;
        if(a>b) swap(a,b);
        if(op==0)
        {
            for(ri now=a;now<=b;now=p[now/d+1].r+1)
            {
            //    cout<<now<<"\n";
                int tmp=now/d+1;
                if(p[tmp].r<=b&&now==p[tmp].l)
                {
                    p[tmp].cnt++;    
                }
                else
                {
                    if(p[tmp].cnt) xiu(tmp);
                    if(p[tmp].flag)
                    {
                        
                        continue;
                    }
                    for(ri j=now;j<=min(p[tmp].r,b);j++)
                    {
                        p[tmp].val-=val[j];
                        val[j]=sqrt(val[j]);
                        p[tmp].val+=val[j];
                    }
                    if(p[tmp].r-p[tmp].l+1==p[tmp].val) p[tmp].flag=1;
                }
                    
            }
        }
        else
        {
            long long ans=0;
            for(ri now=a;now<=b;now=p[now/d+1].r+1)
            {
                int tmp=now/d+1;
                if(p[tmp].r<=b&&now==p[tmp].l)
                {
                    if(p[tmp].flag) ans+=p[tmp].val;
                    else 
                    {
                        if(p[tmp].cnt) xiu(tmp);
                        ans+=p[tmp].val;    
                    }    
                }
                else
                {
                    if(p[tmp].cnt) xiu(tmp);
                    if(p[tmp].flag)
                    {
                        ans+=min(p[tmp].r,b)-now+1;
                     
                        continue;
                    }
                    for(ri j=now;j<=min(p[tmp].r,b);j++)
                    {
                        ans+=val[j];
                    }
                }    
            
            }
            cout<<ans<<"\n";
        }
View Code

例题:

 

思路:

  • 势能线段树的思想,很快就会变成1, 于是就不用处理了
#include <bits/stdc++.h>
using namespace std;
#define ri register   int 
#define M 2000005

struct dian{
    int l,r;
    long long val;
    int cnt=0;
    int flag=0;
}p[M];
long long  val[M];
int n,m;
void xiu(int a)
{
    if(p[a].flag) return ;
    p[a].val=0;
    for(ri i=p[a].l;i<=p[a].r;i++)
    {
        for(ri j=1;j<=p[a].cnt;j++)
        {
            val[i]=sqrt(val[i]);
            if(val[i]==1) break;
        }
        p[a].val+=val[i];
    }
    p[a].cnt=0;
    if(p[a].val==(p[a].r-p[a].l+1)) p[a].flag=1;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);///////////////////////////////////////////
    
    cin>>n;
    int d=sqrt(n);
    int kn=0;
    for(ri i=1;i<=n;i++) p[i].l=n,p[i].r=0;
    for(ri i=1;i<=n;i++)
    {
        cin>>val[i];
        int a=i/d+1;kn=max(kn,a);
        p[a].val+=val[i];
        p[a].l=min(i,p[a].l);
        p[a].r=max(p[a].r,i);
    }
    cin>>m;
    for(ri i=1;i<=m;i++)
    {
        int op,a,b;
        cin>>op>>a>>b;
        if(a>b) swap(a,b);
        if(op==0)
        {
            for(ri now=a;now<=b;now=p[now/d+1].r+1)
            {
            //    cout<<now<<"\n";
                int tmp=now/d+1;
                if(p[tmp].r<=b&&now==p[tmp].l)
                {
                    p[tmp].cnt++;    
                }
                else
                {
                    if(p[tmp].cnt) xiu(tmp);
                    if(p[tmp].flag)
                    {
                        
                        continue;
                    }
                    for(ri j=now;j<=min(p[tmp].r,b);j++)
                    {
                        p[tmp].val-=val[j];
                        val[j]=sqrt(val[j]);
                        p[tmp].val+=val[j];
                    }
                    if(p[tmp].r-p[tmp].l+1==p[tmp].val) p[tmp].flag=1;
                }
                    
            }
        }
        else
        {
            long long ans=0;
            for(ri now=a;now<=b;now=p[now/d+1].r+1)
            {
                int tmp=now/d+1;
                if(p[tmp].r<=b&&now==p[tmp].l)
                {
                    if(p[tmp].flag) ans+=p[tmp].val;
                    else 
                    {
                        if(p[tmp].cnt) xiu(tmp);
                        ans+=p[tmp].val;    
                    }    
                }
                else
                {
                    if(p[tmp].cnt) xiu(tmp);
                    if(p[tmp].flag)
                    {
                        ans+=min(p[tmp].r,b)-now+1;
                     
                        continue;
                    }
                    for(ri j=now;j<=min(p[tmp].r,b);j++)
                    {
                        ans+=val[j];
                    }
                }    
            
            }
            cout<<ans<<"\n";
        }
    }
    return 0;

    
} 
View Code

 

标签:势能,val,分块,int,max,kn,long,ri,模板
From: https://www.cnblogs.com/Lamboofhome/p/16893495.html

相关文章

  • Spring Boot 导出EXCEL模板以及导入EXCEL数据(阿里Easy Excel实战)
    SpringBoot导出EXCEL模板以及导入EXCEL数据(阿里EasyExcel实战)导入pom依赖编写导出模板@ApiOperation("导出xxx模板")@GetMapping("/downTemplates")public......
  • vue源码分析-挂载流程和模板编译
    前面几节我们从newVue创建实例开始,介绍了创建实例时执行初始化流程中的重要两步,配置选项的资源合并,以及响应式系统的核心思想,数据代理。在合并章节,我们对Vue丰富的选项......
  • 二分模板
    二分是基础算法之一,常用于答案有单调性的题目,或者穷举会超时的题目intsearch(intl,intr){while(l+1<r){intmid=l+(r-l)>>1;//防溢......
  • 前后端同构和模板渲染的区别是什么呢?
    同构渲染前端与Node端渲染共同一套JavaScript代码Node端将数据预先请求并存储在HTML上Node端的React将ComponentDidMount生命周期以前的逻辑处理完成,并执行render方法......
  • pycharm如何自定义模板?
    按照上图箭头方向设置即可. ......
  • 算法基础:差分算法及模板应用
    ⭐写在前面的话:本系列文章旨在复习算法刷题中常用的基础算法与数据结构,配以详细的图例解释,总结相应的代码模板,同时结合例题以达到最佳的学习效果。本专栏面向算法零基础但有......
  • 常用模板
    快读inlineintread(){intx=0,f=1;charch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(......
  • 2211-13 flask模板
    第3章:模板在一般的Web程序里,访问一个地址通常会返回一个包含各类信息的HTML页面。因为我们的程序是动态的,页面中的某些信息需要根据不同的情况来进行调整,比如对登录......
  • freeMaker模板引擎
    一、什么是FreeMaker?FreeMaker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出,可以实现网页静态化。FreeMaker与Web容器无关,即在Web运行时,它并不知道Servlet......
  • 大学生阅读小说网页设计模板代码 柏书旧书网带登录表单 注册表单小说书籍网页作业成品
    ......