线段树优化建图RE求调
查看原帖
线段树优化建图RE求调
214728
剑雪清寒楼主2022/9/2 13:09

rt,不明原因RE,求调

#include <bits/stdc++.h>
using namespace std;
inline long long read() {
	long long x;bool f;char ch;
	for(f=0;!isdigit(ch=getchar());f=ch=='-');
	for(x=ch-48;isdigit(ch=getchar());x=x*10+ch-48);
	return f?-x:x;
}
inline void print(long long x,char las) {
	if(!x) {
		putchar(48),putchar(las);
		return ;
	}
	if(x<0) putchar('-'),x=-x;
	int ls[20],k=0;
	while(x) ls[++k]=x%10,x/=10;
	while(k) putchar(ls[k--]+48);
	putchar(las);
	return ;
}
#define jump 400000
struct node {
	int ls,rs;
}nd[800001];
struct edge {
	int to;long long len;
	edge *next;
}*head[800001],rd[1000001];int rs;
inline void add(int u,int v,long long len) {
	rd[rs].to=v;rd[rs].len=len;rd[rs].next=head[u];head[u]=&rd[rs++];
	return ;
}
int n=read(),q=read(),s=read(),ss,leaf[400001];
inline void build(int x,int l,int r) {
	x=++ss;
	if(l==r) {
		leaf[l]=x;
		add(x,x+jump,0);
		add(x+jump,x,0);
		return ;
	}
	int mid=(l+r)>>1;
	nd[x].ls=ss+1;
	add(x,ss+1,0);
	add(ss+1+jump,x+jump,0);
	build(x,l,mid);
	nd[x].rs=ss+1;
	add(x,ss+1,0);
	add(ss+1+jump,x+jump,0);
	build(x,mid+1,r);
	return ;
}
inline void link(int x,int l,int r,int L,int R,int u,int len,bool job) {
	if(l>R || r<L) return ;
	if(l>=L && r<=R) {
		if(job) add(x+jump,u,len);
		else add(u,x,len);
		return ;
	}
	int mid=(l+r)>>1;
	link(nd[x].ls,l,mid,L,R,u,len,job);
	link(nd[x].rs,mid+1,r,L,R,u,len,job);
	return ;
}
struct dot {
	long long dist=0x3f3f3f3f3f3f3f3f;int name;
	inline bool operator<(const dot&ls) const {
		return dist>ls.dist;
	}
}bot[800001];
priority_queue<dot>que;
int main() {
	build(0,1,n);
	for(int i=1;i<=q;i++) {
		int opt=read();
		if(opt==1) {
			int u=read(),v=read(),len=read();
			add(leaf[u],leaf[v],len);
		}else {
			int u=read(),l=read(),r=read(),len=read();
			link(1,1,n,l,r,leaf[u],len,opt%2);
		}
	}
	bot[leaf[s]].dist=0;bot[leaf[s]].name=leaf[s];que.push(bot[leaf[s]]);
	while(!que.empty()) {
		dot now=que.top();que.pop();
		if(now.dist>bot[now.name].dist) continue;
		for(edge *i=head[now.name];i;i=i->next) {
			int nex=i->to;
			if(bot[nex].dist>now.dist+i->len) {
				bot[nex].dist=now.dist+i->len;
				bot[nex].name=nex;
				que.push(bot[nex]);
			}
		}
	}
	for(int i=1;i<=n;i++) print(bot[leaf[i]].dist==0x3f3f3f3f3f3f3f3f ? -1 : bot[leaf[i]].dist,' ');
	return 0;
}

2022/9/2 13:09
加载中...