社区讨论

数据过水?!

P14521【MX-S11-T2】加减乘除参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mi1vaz5e
此快照首次捕获于
2025/11/16 23:25
3 个月前
此快照最后确认于
2025/11/18 10:32
3 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+10;
struct node{int id;int l;int r;};
vector<node>e[N];
int L[N],R[N];
int a[N];
int dp[2*N];
vector<int>ansid,ans;
unordered_map<int,int>mp1,mp2;
int S[N];
void dfs1(int id){
    for(node to:e[id]){
        __int128 left=(__int128)L[id]+a[id];
        __int128 right=(__int128)R[id]+a[id];
        __int128 low=to.l,high=to.r;
        left=max(left,low);
        right=min(right,high);
        L[to.id]=(long long)left;
        R[to.id]=(long long)right;
        dfs1(to.id);
    }
}
void dfs2(int id,int sum){
    L[id]-=sum;
    R[id]-=sum;
    for(node to:e[id]){
        dfs2(to.id,sum+a[id]);
    }
}
int n,q;
void init(){
    vector<int>v;
    for(int i=1;i<=n;i++){
        if(L[i]<=R[i]){
            v.push_back(L[i]);
            __int128 t=(__int128)R[i]+1;
            if(t>(__int128)4e18)t=(__int128)4e18;
            if(t<-(__int128)4e18)t=-(__int128)4e18;
            v.push_back((long long)t);
        }
    }
    v.push_back(-4000000000000000000LL);
    v.push_back(4000000000000000000LL);
    sort(v.begin(),v.end());
    v.erase(unique(v.begin(),v.end()),v.end());
    int l=v.size();
    for(int i=1;i<=l;i++)mp1[i]=v[i-1];
    for(int i=1;i<=l;i++)mp2[v[i-1]]=i;
    for(int i=1;i<=n;i++){
        if(L[i]<=R[i]){
            L[i]=mp2[L[i]];
            __int128 t=(__int128)R[i]+1;
            if(t>(__int128)4e18)t=(__int128)4e18;
            if(t<-(__int128)4e18)t=-(__int128)4e18;
            R[i]=mp2[(long long)t]-1;
        }else{
            L[i]=1;
            R[i]=0;
        }
    }
    for(int i=1;i<=l;i++)dp[i]=0;
    for(int i=1;i<=n;i++){
        if(L[i]<=R[i]){
            dp[L[i]]++;
            dp[R[i]+1]--;
        }
    }
    ansid.push_back(-4000000000000000005LL);
    ans.push_back(0);
    int sum=0;
    for(int i=1;i<=l;i++){
        sum+=dp[i];
        ansid.push_back(mp1[i]);
        ans.push_back(sum);
    }
    ansid.push_back(mp1[l]+1);
    ans.push_back(sum);
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin>>n>>q;
    for(int i=2;i<=n;i++){
        int p,l,r;
        cin>>p>>l>>r;
        e[p].push_back({i,l,r});
    }
    for(int i=1;i<=n;i++){
        char op;
        cin>>op>>a[i];
        if(op=='-')a[i]=-a[i];
    }
    L[1]=-4000000000000000000LL;
    R[1]=4000000000000000000LL;
    dfs1(1);
    dfs2(1,0);
    init();
    while(q--){
        int x;
        cin>>x;
        cout<<ans[upper_bound(ansid.begin(),ansid.end(),x)-ansid.begin()-1]<<"\n";
    }
    return 0;
}
注意到 dfs2 中的 sum 在大数据情况下几乎一定溢出。但是这份代码却离奇跑过了。https://www.luogu.com.cn/record/247688727
(还挺快的说

回复

1 条回复,欢迎继续交流。

正在加载回复...