当前位置: 首页 > news >正文

树状数组(2025钉耙编程4th 1006进步洛谷3374洛谷3368)

前两题为修改点,查询区间,使用前缀和的思想

 洛谷P3374【模板】树状数组 1

P3374 【模板】树状数组 1 - 洛谷

#include<bits/stdc++.h>
#define int long long 
using namespace std;
bool tin=0;
int n;
int s[500005];
int lowbit(int x)//查找x低位二次幂数
{
    return x&-x;
}
void change(int x,int k)//向后到n修改和
{
    while(x<=n) s[x]+=k,x+=lowbit(x);
}
int query(int x)//向前查询和
{
    int ans=0;
    while(x) ans+=s[x],x-=lowbit(x);
    return ans;
}
void solve()
{
    int m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        change(i,x);
    }
    while(m--)
    {
        int a,b,c;
        cin>>a>>b>>c;
        if(a==1)
        {
            change(b,c);
        }
        else
        {
            cout<<query(c)-query(b-1)<<'\n';
        }
    }
}

signed main()
{
    std::ios::sync_with_stdio(0) , std::cin.tie(0) , std::cout.tie(0);
    int t = 1;
    if(tin)
     cin >> t ;
    while(t--)
        solve();
    return 0;
}

2025钉耙编程4th 1006 进步

1006 进步

#include<bits/stdc++.h>
#define int long long 
using namespace std;
bool tin=1;
int n;
int s[200005],d[200005];
//与板子不同的是修改值,所以要记录原值算出修改量d为原值,s为树状和
int lowbit(int x)//查找x低位二次幂数
{
    return x&-x;
}
void change(int x,int k)//向后到n修改和
{
    k-=d[x];//与板子不同的是直接更改数值
    while(x<=n) s[x]+=k,x+=lowbit(x);
}
int query(int x)//向前查询和
{
    int ans=0;
    while(x) ans+=s[x],x-=lowbit(x);
    return ans;
}
void solve()
{
    int m,ans=0,num=0;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        d[i]=0;//重置数组
        change(i,x);
        d[i]=x;
    }      
    int a,b,c;
    while(m--)
    {

        cin>>a>>b>>c;
        if(a==1)
        {
            change(b,c);
            d[b]=c;
        }
        else
        {
            num++;
            int t=query(c)/100-query(b-1)/100;//整除100求差
            ans^=(t*num);//
        }
    }
    cout<<ans<<'\n';
    for(int i=1;i<=n;i++)
    s[i]=0;//重置树状数组,最容易犯猪的一集
}

signed main()
{
    std::ios::sync_with_stdio(0) , std::cin.tie(0) , std::cout.tie(0);
    int t = 1;
    if(tin)
     cin >> t ;
    while(t--)
        solve();
    return 0;
}

后一题为修改区间而查询点,使用差分的思想

洛谷P3368【模板】树状数组 2

P3368 【模板】树状数组 2 - 洛谷

#include<bits/stdc++.h>
#define int long long 
using namespace std;
bool tin=0;
int n;
int s[500005],d[500005];
int lowbit(int x)//查找x低位二次幂数
{
    return x&-x;
}
void change(int x,int k)//向后到n修改和
{
    while(x<=n) s[x]+=k,x+=lowbit(x);
}
int query(int x)//向前查询和
{
    int ans=0;
    while(x) ans+=s[x],x-=lowbit(x);
    return ans;
}
void solve()
{
    int m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>d[i];
    }                  
    int x,y,k,op;
    while(m--)
    {
        cin>>op;
        if(op==1)
        {
            cin>>x>>y>>k;
            change(x,k),change(y+1,-k);//差分构造
        }
        else
        {
            cin>>x;
            cout<<d[x]+query(x)<<'\n';//查询前差分并加上原值即为修改后的值
        }
    }
}

signed main()
{
    std::ios::sync_with_stdio(0) , std::cin.tie(0) , std::cout.tie(0);
    int t = 1;
    if(tin)
     cin >> t ;
    while(t--)
        solve();
    return 0;
}

相关文章:

  • Assembly语言的装饰器
  • 【Matlab】-- 基于MATLAB的美赛常用多种算法
  • GPU中的cluster
  • 通过 Docker Swarm 集群探究 Overlay 网络跨主机通信原理
  • Windows 11 中搜索服务索引文件大处理
  • Javaweb后端 AOP快速入门 AOP核心概念 AOP执行流程
  • Springboot学习笔记 3.13
  • 若依前后端不分离字典修改---formatter对原值进行修改
  • 场外基金和ETF场内基金有何区别?ETF佣金最低是多少?
  • 从头开始学C语言第三十六天——函数指针和函数指针数组
  • 【C/C++算法】从浅到深学习---分治算法之快排思想(图文兼备 + 源码详解)
  • Html 页面图标的展示列表
  • 本地文件夹同步软件,本地文件夹同步备份方法
  • MYSQL数据库(一)
  • 六十天前端强化训练之第三十六天之E2E测试(Cypress)大师级完整指南
  • doip诊断第二版优化
  • [GWCTF 2019]我有一个数据库1 [CVE phpMyAdmin漏洞]
  • Android并发编程:线程池与协程的核心区别与最佳实践指南
  • Java线程特性
  • 1.1 斐波那契数列模型:LeetCode 1137.第 N 个泰波那契数
  • 柳江企业网站开发公司/郑州网站推广优化
  • 网站建设 手机和pc/搜索引擎推广实训
  • 网站素材图/互联网营销课程体系
  • 成都万商云集做网站怎么样/建立网站的流程
  • 英文外贸网站建设网站设计方案/关键字挖掘
  • 给人做阉割手术的网站/seo最新快速排名