抽象
查看原帖
抽象
450743
XOOR楼主2024/6/22 17:25

我这份代码里面的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;
}
2024/6/22 17:25
加载中...