我这份代码里面的NT要开到2e7才有84分,#1#2wa,开到1e8也有,但是1e7就会有的点RE
啊???
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int NT=2e7,N=5e5+10,mod=1e9+7;
int m,n,tot,col;
int x[N],q[N],du[NT],leaf[N],dfn[NT],low[NT],sum[NT],co[NT],D[NT];
vector<int> v[NT],ve[NT];
bitset<NT> vis;
stack<int> s;
map<pair<int,int>,bool> mp;
void build(int o,int l,int r){
if(l==r) return du[o]=1,leaf[l]=o,void();
int mid=(l+r)>>1;
v[o].push_back(o<<1);
v[o].push_back(o<<1|1);
build(o<<1,l,mid);
build(o<<1|1,mid+1,r);
return ;
}
void update(int o,int l,int r,int ql,int qr,int ind){
m++;
if(ql<=l && qr>=r){
return v[ind].push_back(o),void();
}
int mid=(l+r)>>1;
if(ql<=mid) update(o<<1,l,mid,ql,qr,ind);
if(qr>mid) update(o<<1|1,mid+1,r,ql,qr,ind);
return ;
}
void tarjan(int x){
dfn[x]=low[x]=++tot;
s.push(x),vis[x]=1;
for(auto t: v[x]){
if(!dfn[t]) tarjan(t),low[x]=min(low[x],low[t]);
else if(vis[t]) low[x]=min(low[x],dfn[t]);
}
if(low[x]==dfn[x]){
int tmp=0;col++;
while(tmp!=x) tmp=s.top(),s.pop(),co[tmp]=col,sum[col]+=du[tmp],vis[tmp]=0;
}
return ;
}
queue<int> p;
void topsort(){
for(int i=1;i<=col;i++) if(!D[i]) p.push(i);
while(p.size()){
int u=p.front();p.pop();
for(auto t: ve[u]){
sum[t]+=sum[u];
if(!(--D[t])) p.push(t);
}
}
return ;
}
signed main(){
// freopen("in.in","r",stdin);
scanf("%lld",&n);
for(int i=1;i<=n;i++) scanf("%lld%lld",&x[i],&q[i]);
build(1,1,n);
for(int i=1;i<=n;i++){
int l=lower_bound(x+1,x+n+1,x[i]-q[i])-x;
int r=lower_bound(x+1,x+n+1,x[i]+q[i])-x;
if(x[r]>x[i]+q[i] || r>n) r--;
update(1,1,n,l,r,leaf[i]);
}
tarjan(1);
for(int i=1;i<=m;i++)
for(auto t: v[i]) if(co[t]!=co[i] && !mp[make_pair(co[t],co[i])] && !mp[make_pair(co[i],co[t])])
ve[co[t]].push_back(co[i]),D[co[i]]++,mp[make_pair(co[t],co[i])]=mp[make_pair(co[i],co[t])]=1;
topsort();
int ans=0;
for(int i=1;i<=n;i++) ans=ans+i*sum[co[leaf[i]]],ans%=mod;
printf("%lld",ans);
return 0;
}