吃!吃!吃!
查看原帖
吃!吃!吃!
501028
spider_oyster楼主2023/11/23 21:37

wrong on #1 #2

求助为什么不能这么写。

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N=2e6+5,P=1e9+7;
int n,ans,id[N],rev[N],vis[N],L[N],R[N],x[N],y[N],l[N],r[N];
vector<int> G[N],g[N];

#define lc (k<<1)
#define rc (k<<1|1)
#define mid (l+r>>1)
void build(int k=1,int l=1,int r=n)
{
    if(l==r) {id[l]=k,rev[k]=l;return;}
    G[k].push_back(lc),G[k].push_back(rc);
    build(lc,l,mid),build(rc,mid+1,r);
}
void upd(int x,int y,int u,int k=1,int l=1,int r=n)
{
    if(l>=x&&r<=y) {if(id[u]!=k) G[id[u]].push_back(k);return;}
    if(x<=mid) upd(x,y,u,lc,l,mid);
    if(mid<y) upd(x,y,u,rc,mid+1,r);
}

inline int rd()
{
    int x=0,f=1;char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
    for(; isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(c^48);
    return x*f;
}

int dn,top,cnt,stk[N],dfn[N],low[N],bel[N];
void tarjan(int u)
{
    stk[++top]=u;
    dfn[u]=low[u]=++dn;
    for(int v:G[u])
    {
        if(!dfn[v]) tarjan(v),low[u]=min(low[u],low[v]);
        else if(!bel[v]) low[u]=min(low[u],dfn[v]); 
    }
    if(low[u]==dfn[u])
    {
        int v;++cnt;
        do{
            v=stk[top--];
            bel[v]=cnt;
            if(rev[v]) l[cnt]=min(l[cnt],L[rev[v]]),r[cnt]=max(r[cnt],R[rev[v]]);
        }while(v!=u);
    }
}

void dfs(int u)
{
    vis[u]=1;
    for(int v:g[u])
    {
        if(!vis[v]) dfs(v);
        l[u]=min(l[u],l[v]);
        r[u]=max(r[u],r[v]);
    }
}

signed main()
{
    n=rd();build();
    memset(l,0x3f,sizeof(l));
    for(int i=1;i<=n;i++) x[i]=rd(),y[i]=rd();
    for(int i=1;i<=n;i++)
    {
        L[i]=lower_bound(x+1,x+1+n,x[i]-y[i])-x;
        R[i]=upper_bound(x+1,x+1+n,x[i]+y[i])-x-1;
        upd(L[i],R[i],i);
    }
    for(int i=1;i<=n;i++) if(!dfn[id[i]]) tarjan(id[i]);
    for(int i=1;i<=n;i++) for(int j:G[id[i]]) if(bel[id[i]]!=bel[j]) g[bel[id[i]]].push_back(bel[j]);
    // 这样写就对了
    // for(int i=1;i<=tot;i++) for(int j:G[i]) if(bel[i]!=bel[j]) g[bel[i]].push_back(bel[j]);
    for(int i=1;i<=cnt;i++) if(!vis[i]) dfs(i);
    for(int i=1;i<=n;i++) ans=(ans+1ll*i*(r[bel[id[i]]]-l[bel[id[i]]]+1))%P;
    cout<<ans<<'\n';
}

按理说只有 id[i] 有出边啊

2023/11/23 21:37
加载中...