79分求助!
查看原帖
79分求助!
25891
沧桑の天骄楼主2022/3/20 17:09

Wa #1 #2 #12

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<map>
#define ll long long
using namespace std;
inline int ls(int p){return p<<1;}
inline int rs(int p){return p<<1|1;}
inline ll max(ll x,ll y){return x>y?x:y;}
inline ll min(ll x,ll y){return x<y?x:y;}
inline ll read(){
	ll x=0,w=1;
	char aa=getchar();
	while(aa<'0'||aa>'9'){
		if(aa=='-') w=-1;
		aa=getchar();
	}
	while(aa>='0'&&aa<='9'){
		x=(x<<3)+(x<<1)+aa-'0';
		aa=getchar();
	}
	return x*w;
}
const int N=5e5+10;
const ll mod=1e9+7;

int n,nd,top,tot,su;
int id[N],dfn[N<<2],low[N<<2],st[N<<2],f[N<<2];
ll ans;
ll x[N],r[N],lf[N],rt[N];
bool vis[N];
struct node{
	int l,r;
}d[N<<2];
vector<int> e[N<<2],v[N<<2];

void build(int p,int l,int r){
	d[p]=(node){l,r};
	nd=max(nd,p);
	if(l==r){
		id[l]=p;
		return;
	}
	int mid=(l+r)>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	e[p].push_back(ls(p));
	e[p].push_back(rs(p));
}

void connect(int p,int l,int r,int ql,int qr,int num){
	if(ql<=l&&r<=qr){
		if(p==num) return;
		e[num].push_back(p);
		return;
	}
	int mid=(l+r)>>1;
	if(mid>=ql) connect(ls(p),l,mid,ql,qr,num);
	if(mid<qr) connect(rs(p),mid+1,r,ql,qr,num);
}

void tarjan(int x){
	dfn[x]=low[x]=++tot;
	st[++top]=x;
	vis[x]=1;
	for(int i=0;i<e[x].size();i++){
		int y=e[x][i];
		if(!dfn[y]){
			tarjan(y);
			low[x]=min(low[x],low[y]);
		}
		else if(vis[y]) low[x]=min(low[x],dfn[y]);
	}
	if(dfn[x]==low[x]){
		int y=0;
		su++;
		while(y!=x){
			y=st[top--];
			f[y]=su,vis[y]=0;
			lf[su]=min(lf[su],d[y].l);
			rt[su]=max(rt[su],d[y].r);
			if(y==x) break;
		}
	}
}

void dfs(int x){
	vis[x]=1;
	for(int i=0;i<v[x].size();i++){
		int y=v[x][i];
		if(!vis[y]) dfs(y);
		lf[x]=min(lf[x],lf[y]);
		rt[x]=max(rt[x],rt[y]);
	}
}

int main(){
	n=read();
	for(int i=1;i<=n;i++) x[i]=read(),r[i]=read();
	x[n+1]=2e18+10;
	build(1,1,n);
	for(int i=1;i<=n;i++){
		if(!r[i]) continue;
		int L=lower_bound(x+1,x+n+1,x[i]-r[i])-x;
		int R=upper_bound(x+1,x+n+1,x[i]+r[i])-x-1;
		connect(1,1,n,L,R,id[i]);
		d[id[i]]=(node){L,R};
	}
	memset(lf,0x3f,sizeof(lf));
	tarjan(1);
	for(int x=1;x<=nd;x++){
		for(int i=0;i<e[x].size();i++){
			int y=e[x][i];
			if(f[x]!=f[y]) v[f[x]].push_back(f[y]);
		}
	}
	for(int i=1;i<=su;i++){
		sort(v[i].begin(),v[i].end());
		unique(v[i].begin(),v[i].end());
	}
	memset(vis,0,sizeof(vis));
	for(int i=1;i<=su;i++){
		if(!vis[i]) dfs(i);
	}
	for(ll i=1;i<=n;i++) ans=(ans+(rt[f[id[i]]]-lf[f[id[i]]]+1)*i)%mod;
	printf("%lld\n",ans);
	return 0;
}
2022/3/20 17:09
加载中...