社区讨论

OJ过了 CF没过是何意味

CF878ENumbers on the blackboard参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mhz4jko9
此快照首次捕获于
2025/11/15 01:20
3 个月前
此快照最后确认于
2025/11/16 14:03
3 个月前
查看原帖
WA on test 48是何意味
CPP
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll read(){
    char ch;ll f=1;
    for(ch=getchar();ch<'0'||ch>'9';ch=getchar()) if(ch=='-') f=-1;
    ll x=ch-'0';
    for(ch=getchar();ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
    return x*f;
}
void write(ll x){
    if(x<0) putchar('-'),x=-x;
    if(x<10) putchar(x+'0');
    else write(x/10),putchar(x%10+'0');
}
constexpr int N=1e5+7;
constexpr int mod=1e9+7;
constexpr ll inf=1e14;
int n,q;
int a[N],HASH[N];
struct query{int l,r,id;ll ans;} ask[N];int now_ask=1;
bool cmp1(const query &x,const query &y){return x.r<y.r;}
bool cmp2(const query &x,const query &y){return x.id<y.id;}
int fa[N],len[N],l[N],r[N];
ll val_unmoded[N],val_moded[N];
ll sum_val[N];
bitset<N> val_largerthan_inf;
int kp(int base,int k){
    int ans=1;
    while(k){
        if(k&1) ans=1ll*ans*base%mod;
        base=1ll*base*base%mod;
        k>>=1;
    }
    return ans;
}
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
signed main(){
    n=read();q=read();
    for(int i=1;i<=n;i++) a[i]=read();
    for(int i=n;i;i--) HASH[i]=((HASH[i+1]<<1ll)%mod+(a[i]%mod+mod)%mod)%mod;
    for(int i=1;i<=q;i++) ask[i].l=read(),ask[i].r=read(),ask[i].id=i;
    sort(ask+1,ask+1+q,cmp1);
    for(int i=1;i<=n;i++) fa[i]=l[i]=r[i]=i,len[i]=1;
    int k=0,lstunion=1;
    val_largerthan_inf.reset();
    for(int i=1;i<=n;i++){
        if(a[i]<0){
            if(!k){
                val_unmoded[i]=a[i];
                val_moded[i]=(a[i]%mod+mod)%mod;
                sum_val[i]=(a[i]%mod+mod)%mod;
            }else{
                k=1;
                val_unmoded[i]=a[i]<<1ll;
                val_moded[i]=((a[i]<<1ll)%mod+mod)%mod;
                sum_val[i]=((sum_val[lstunion]+val_moded[i])%mod+mod)%mod;
            }
            lstunion=i;
        }else{
            if(lstunion!=i){
                if(a[i]) if(k>__lg((inf-val_unmoded[lstunion])/a[i])) val_largerthan_inf.set(lstunion,1);
                val_unmoded[lstunion]+=((1ll<<k)*a[i]);
                (val_moded[lstunion]+=(1ll*kp(2,k)*((a[i]%mod+mod)%mod)%mod))%=mod;
                r[lstunion]=i;
                len[lstunion]++;
                sum_val[lstunion]=((sum_val[find(lstunion-1)]+val_moded[lstunion])%mod+mod)%mod;
                fa[i]=lstunion;
                int x=lstunion;
                while(x!=1&&(val_unmoded[x]>0||val_largerthan_inf[x])){
                    int pre=find(x-1);
if(val_largerthan_inf[x]||val_largerthan_inf[pre]){
                        val_largerthan_inf.set(pre,1);
                        val_largerthan_inf.set(x,0);
                        val_unmoded[pre]+=val_unmoded[x]*(1ll<<len[pre]);
                        (val_moded[pre]+=1ll*val_moded[x]*kp(2,len[pre])%mod)%=mod;
                    }else{
                        if(val_unmoded[x]) if(k>__lg((inf-val_unmoded[pre])/val_unmoded[x])) val_largerthan_inf.set(pre,1);
                        val_unmoded[pre]+=val_unmoded[x]*(1ll<<len[pre]);
                        (val_moded[pre]+=1ll*val_moded[x]*kp(2,len[pre])%mod)%=mod;
                    }
                    len[pre]+=len[x];
                    fa[x]=pre;
                    r[pre]=r[x];
                    x=pre;
                }
                sum_val[x]=((sum_val[find(x-1)]+val_moded[x])%mod+mod)%mod;
                k=len[x];
            }else{
                val_unmoded[i]=a[i];
                val_moded[i]=(a[i]%mod+mod)%mod;
                sum_val[i]=(a[i]%mod+mod)%mod;
            }
            lstunion=find(i);
        }
        k++;
        while(now_ask<=q&&ask[now_ask].r==i){
            ll ans=0;
            int fa_l=find(ask[now_ask].l),nxt=r[fa_l]+1;
            ans=((HASH[ask[now_ask].l]-1ll*HASH[nxt]*kp(2,nxt-ask[now_ask].l)%mod)%mod+mod)%mod;
            int x=nxt;
            ans=((ans+sum_val[find(i)]-sum_val[fa_l])%mod+mod)%mod;
            ask[now_ask].ans=ans;
            now_ask++;
        }
    }
    sort(ask+1,ask+1+q,cmp2);
    for(int i=1;i<=q;i++) write(ask[i].ans),putchar('\n');
    return 0;
}

回复

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

正在加载回复...