可爱萌新刚学OI,小清新马蜂线段树求调
查看原帖
可爱萌新刚学OI,小清新马蜂线段树求调
1056908
封禁用户楼主2024/3/6 16:56

一堆TLE和WA,就AC两个点/cf

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pl (p<<1)
#define pr (p<<1|1)
const int N=2e5+100,mod=998244353;
struct Tree{ll sum,mx;}tr[N<<2];
int n,q,op,l,r;ll a[N];
void push_up(int p){tr[p].sum=(tr[pl].sum+tr[pr].sum)%mod,tr[p].mx=max(tr[pl].mx,tr[pr].mx)%mod;}
void update(int l,int r,int le,int ri,int p){
	if(tr[p].mx==1)return;
	if(l==r)return tr[p].sum=tr[p].mx=sqrt(tr[p].sum),void();
    int mid=l+r>>1;
    if(le<=mid)update(l,mid,le,ri,pl);
    if(ri>mid)update(mid+1,r,le,ri,pr);
    push_up(p);
}void update1(int l,int r,int le,int ri,int p){
	if(tr[p].mx==1)return;
	if(l==r)return tr[p].sum=tr[p].mx=tr[p].sum*tr[p].sum%mod,void();
    int mid=l+r>>1;
    if(le<=mid)update1(l,mid,le,ri,pl);
    if(ri>mid)update1(mid+1,r,le,ri,pr);
    push_up(p);
}ll query(int l,int r,int le,int ri,int p){
    if(le<=l&&r<=ri)return tr[p].sum;
    int mid=l+r>>1;ll ret=0;
    if(le<=mid)ret+=query(l,mid,le,ri,pl);
    if(ri>mid)ret+=query(mid+1,r,le,ri,pr);
    return ret%mod;
}void build(int l,int r,int p){
    if(l==r)return tr[p].sum=tr[p].mx=a[l]%mod,void();
    int mid=l+r>>1;build(l,mid,pl),build(mid+1,r,pr),push_up(p);
}int main(){
    cin>>n>>q;
    for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
    build(1,n,1);
    while(q--){
        scanf("%d%d%d",&op,&l,&r);if(l>r)swap(l,r);
        if(op==1)update(1,n,l,r,1);
        else update1(1,n,l,r,1);
    }return cout<<query(1,n,1,n,1),0;
}
2024/3/6 16:56
加载中...