Cambrain_ 2023-07-31 16:47 采纳率: 33.3%
浏览 6

关于#c++#的问题:但交到oj直接ac了//势能线段树#include <iostream>

代码无法运行,但交到oj直接ac了


//势能线段树
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<map>
#include<set>
using namespace std;
#define PII pair<int,int>
#define endl "\n"
#define int long long
const int N=1e5+10;
struct segment_tree {
    int a[N];
    struct node {
        int l,r;
        int mx,sum;
    }tr[N<<2];
    
    void build(int u,int l,int r) {
        tr[u].l=l,tr[u].r=r;
        if(l==r) {
            tr[u].mx=tr[u].sum=a[l];
            return ;
        }
        int mid=(l+r)>>1;
        build(u<<1,l,mid);
        build(u<<1|1,mid+1,r);
        pushup(u);
    } 

    void modify(int u,int l,int r,int x) {
        if(tr[u].mx<x) return ;
        if(tr[u].l==tr[u].r) {
            tr[u].mx%=x;
            tr[u].sum=tr[u].mx;
            return ;
        }
        int mid=(tr[u].l+tr[u].r)>>1;
        if(l<=mid) modify(u<<1,l,r,x);
        if(r>mid) modify(u<<1|1,l,r,x);
        pushup(u);
    } 

    int query(int u,int l,int r) {
        if(tr[u].l>=l&&tr[u].r<=r) {
            return tr[u].sum;
        }
        int mid=(tr[u].l+tr[u].r)>>1;
        int res=0;
        if(l<=mid) res+=query(u<<1,l,r);
        if(r>mid) res+=query(u<<1|1,l,r);
        return res;
    }
    void update(int u,int k,int x) {
        if(tr[u].l==tr[u].r) {
            tr[u].mx=tr[u].sum=x;
            return ;
        }
        int mid=(tr[u].l+tr[u].r)>>1;
        if(k<=mid) update(u<<1,k,x);
        else update(u<<1|1,k,x);
        pushup(u);
    }
    void pushup(int u) {
        tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
        tr[u].mx=max(tr[u<<1].mx,tr[u<<1|1].mx);
    }
};
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int n,m;
    cin>>n>>m;
    segment_tree ST;
    for(int i=1;i<=n;i++) cin>>ST.a[i];
    ST.build(1,1,n);
    while(m--) {
        int op,l,r,k,x;
        cin>>op;
        if(op==1) {
            cin>>l>>r;
            cout<<ST.query(1,l,r)<<endl;
        }
        else if(op==2) {
            cin>>l>>r>>x;
            ST.modify(1,l,r,x);
        }   
        else {
            cin>>k>>x;
            ST.update(1,k,x);
        }
    }
}
  • 写回答

2条回答 默认 最新

  • 爱编程的小芒果 2023-07-31 16:49
    关注

    可能是编译器额BUG,很奇怪

    评论

报告相同问题?

问题事件

  • 创建了问题 7月31日

悬赏问题

  • ¥15 两台交换机分别是trunk接口和access接口为何无法通信,通信过程是如何?
  • ¥15 C语言使用vscode编码错误
  • ¥15 用KSV5转成本时,如何不生成那笔中间凭证
  • ¥20 ensp怎么配置让PC1和PC2通讯上
  • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法
  • ¥15 dnat基础问题,本机发出,别人返回的包,不能命中
  • ¥15 请各位帮我看看是哪里出了问题
  • ¥15 vs2019的js智能提示
  • ¥15 关于#开发语言#的问题:FDTD建模问题图中代码没有报错,但是模型却变透明了
  • ¥15 uniapp的h5项目写一个抽奖动画