竞赛讨论区 > 请问大佬们,我写的这道题D题错在哪?
头像
笙歌君独幽
发布于 2020-07-20 10:15
+ 关注

请问大佬们,我写的这道题D题错在哪?


#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <queue>
#include <climits>
#include <stack>
#include <map>
#include <cmath>
#include <set>
using namespace std;
typedef long long ll;
const int mod=23333,maxn=1e5+5;
int in[maxn],out[maxn],w[maxn],a[maxn],head[maxn];
struct node{
    int next,to;
}e[maxn<<2];
int ttime,tot;
ll sum[maxn<<2],tag[maxn<<2],tsum[maxn<<2];
#define lson rt<<1
#define rson rt<<1|1
template<class T>
void read(T &x){
    ll f=1;
    x=0;
    char c=getchar();
    while(!isdigit(c)){
        f=-1;
        c=getchar();
    }
    while(isdigit(c)){
        x=x*10+c-48;
        c=getchar();
    }
    x*=f;
}
template<class T>
void write(T x){
    if(x<0){
        putchar('-');
        x=-x;
    }
    if(x>9){
        write(x/10);
    }
    putchar(x%10+'0');
}
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
void add(int x,int y){
    e[++tot].to=y;
    e[tot].next=head[x];
    head[x]=tot;
    }
void dfs(int u,int fa){
      in[u]=++ttime;
      w[ttime]=a[u];
      for(int i=head[u];i;i=e[i].next){
          int v=e[i].to;
          if(v==fa)continue;
          dfs(v,u);
      }
      out[u]=ttime;
}
void pushup(ll rt){
    sum[rt]=(sum[lson]+sum[rson])%mod;
    tsum[rt]=(tsum[lson]+tsum[rson])%mod;
}
void pushdown(ll rt, ll l ,ll r){
     if(!tag[rt])return ;
     ll mid=(l+r)>>1;
     tsum[lson]+=(mid-l+1)*tag[rt]*tag[rt]%mod+2*tag[rt]*tsum[lson];
      tsum[rson]+=(r-mid)*tag[rt]*tag[rt]%mod+2*tag[rt]*tsum[rson];
       sum[lson]+=(mid-l+1)*tag[rt];
        sum[rson]+=(r-mid)*tag[rt];
         tag[lson]+=tag[rt];
         tag[rson]+=tag[rt];
            sum[rson]%=mod;
        tsum[rson]%=mod;
           sum[lson]%=mod;
        tsum[lson]%=mod;
     tag[rt]=0;
     tag[lson]%=mod;
     tag[rson]%=mod;
}
void build(ll rt, ll l ,ll r){
    tag[rt]=0;
    if(l==r){
     sum[rt]=w[l]%mod;
     tsum[rt]=w[l]*w[l]%mod;
     return ;
    }
    ll mid=(l+r)>>1;
    build(lson,l,mid);
    build(rson,mid+1,r);
    pushup(rt);
}
void update(ll ql,ll qr,ll rt,ll l ,ll r,ll k){
    if(ql<=l&&r<=qr){
        tag[rt]+=k;  
        tsum[rt]+=(r-l+1)*k*k+2*k*sum[rt];
        sum[rt]+=(r-l+1)*k;
        sum[rt]%=mod;
        tsum[rt]%=mod;
        tag[rt]%=mod;
        return ;
    }
    pushdown(rt,l,r);
    ll mid=(l+r)>>1;
    if(ql<=mid)
    update(ql,qr,lson,l,mid,k);
    if(qr>mid)
    update(ql,qr,rson,mid+1,r,k);
    pushup(rt);
}
ll query(ll ql,ll qr,ll rt,ll l,ll r){
    if(ql>l||qr<r)return 0;
    if(ql<=l&&r<=qr){
        return tsum[rt]%mod;
    }
    ll ans=0,mid=(l+r)>>1;
    pushdown(rt,l,r);
    if(ql<=mid){
      
        ans+=query(ql,qr,lson,l,mid);
        ans%=mod;
    }
        if(mid<qr){
        ans+=query(ql,qr,rson,mid+1,r);
        ans%=mod;
        }
     
      
    return ans%mod;
}
int main()
{
  ll n,m;
   ll x,y;
   read(n),read(m);
   for(int i=1;i<=n;i++){
       read(a[i]);
   }
   for(int i=1;i<n;i++){
         
       read(x);
       read(y);
       add(x,y);
       add(y,x);
   }
   dfs(1,0);
   build(1,1,n);
  while(m--){
       int a;
       ll b,c;
       read(a);
      
       if(a==1){
          read(b);
           read(c);
           update(in[b],out[b],1,1,n,c);
       }
       else {
          read(b);
           printf("%lld\n",query(in[b],out[b],1,1,n));
          
       }
   }
  
   return 0;
}


全部评论

(0) 回帖
加载中...
话题 回帖

等你来战

查看全部

热门推荐