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] 有出边啊