萌新求助
查看原帖
萌新求助
55201
clamee楼主2020/5/5 22:05

为什么这份代码出现了如此鬼畜的错误?

https://www.luogu.com.cn/record/list?user=55201

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define M 1000000007
#define il inline
int n;
struct boom{
	int num,r,st;
	bool operator<(const boom ot)const{
		return num<ot.num;
	}
}a[1000005];
il int read()
{
	int re=0;char ch=getchar();
	while(ch>'9'||ch<'0'){ch=getchar();}
	while(ch<='9'&&ch>='0'){re=re*10+ch-48;ch=getchar();}
	return re;
}
struct ss{
	int node,nxt;
}e[10000005];
int tree[20000005],tot,head[2000005],k,cnt,dfn[2000005],low[2000005],sz[2000005],mark[2000005],s[2000005],ls,aans[2000005],ll[2000005],rr[2000005];bool vis[2000005];
void tarjan(int x)
{
	dfn[x]=low[x]=++k;
	vis[x]=1;s[++ls]=x;
	for(int i=head[x];i;i=e[i].nxt)
	{
		int y=e[i].node;
		if(!dfn[y]){tarjan(y);low[x]=min(low[x],low[y]);}
		else if(vis[y]){low[x]=min(low[x],low[y]);}
	}
	if(low[x]==dfn[x])
	{
		while(ls)
		{
			int now=s[ls];
			mark[s[ls]]=x;
			//sz[k]+=sz[s[ls]];
			vis[s[ls]]=0;ls--;
			if(x==now)break;
			//ls--;
			ll[x]=min(ll[x],ll[now]);
			rr[x]=max(rr[x],rr[now]);
			sz[x]+=sz[now];
			//cerr<<x<<" "<<s[ls]<<endl;
		}
	}
}
void getans(int x)
{
//	cerr<<x<< " ";
	//have[x]=1;
//	queue<int> q;
//	for(int i=cnt+1;i<=(cnt<<1);++i)
//		if(sz[i]&&!d[i])q.push(i);
//	while(!q.empty())
//	{
//		int t=q.front();q.pop();
//		for(int i=head[t];i;i=e[i].nxt)
//		{
//			int y=e[i].node;
//			aans[y]+=aans[t];
//			d[y]--;
//			if(!d[y])q.push(y);
//		}
//	}
	vis[x]=1;
//	memset(ll,0x3f,sizeof(ll));
	for(int i=head[x];i;i=e[i].nxt)
	{
		int y=e[i].node;
		if(!vis[y])getans(y);
		ll[x]=min(ll[x],ll[y]);
		rr[x]=max(rr[x],rr[y]);
	}
}
void add(int u,int v)
{
	e[++tot].nxt=head[u];
	e[tot].node=v;
	head[u]=tot;
}
void build(int l,int r,int k)
{
	if(l==r)
	{
		tree[k]=l;
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,k<<1);
	build(mid+1,r,k<<1|1);
	tree[k]=++cnt;
	add(tree[k],tree[k<<1]);
	add(tree[k],tree[k<<1|1]);
}
void update(int l,int r,int x,int y,int k,int v)
{
	//cerr<<k<<" ";
	if(x>a[r].num||y<a[l].num)return;
	if(x<=a[l].num&&a[r].num<=y)
	{
		add(v,tree[k]);
		return;
	}
	int mid=(l+r)>>1;
	update(l,mid,x,y,k<<1,v);
	update(mid+1,r,x,y,k<<1|1,v);
}
signed main()
{
	n=read();
	for(int i=1;i<=n;i++)
	{
		a[i].num=read();
		a[i].r=read();
		a[i].st=i;
		sz[i]=1;
	}
	cnt=n;
	sort(a+1,a+n+1);
	build(1,n,1);
	//cerr<<1;
	memset(ll,0x3f,sizeof(ll));
	for(int i=1;i<=n;i++)
	{
		update(1,n,a[i].num-a[i].r,a[i].num+a[i].r,1,i);ll[i]=rr[i]=i;
	}
	for(int i=1;i<=n;i++)
		if(!dfn[i])tarjan(i);
	int cnt2=cnt<<1;
	int ans=0;//getans();
	memset(vis,0,sizeof(vis));
	for(int i=1;i<=n;i++)
	{
		if(!vis[mark[i]])getans(i);
		ans=(ans+a[i].st*(rr[mark[i]]-ll[mark[i]]+1))%M;
		cerr<<ll[mark[i]]<<" "<<rr[mark[i]]<<" ";
	}
	cout<<ans;
}
2020/5/5 22:05
加载中...