TLE on test 8
  • 板块CF786B Legacy
  • 楼主Iwara
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/4/15 19:39
  • 上次更新2024/4/15 20:27:04
查看原帖
TLE on test 8
252549
Iwara楼主2024/4/15 19:39

真不知道哪错了/fn

#include<bits/stdc++.h>
#include<queue>
#include<map>
#include<vector>
using namespace std;
typedef long long ll;
const ll MAXN=3e5+5;
int n,q,s,op,x,y;
ll z;
int _l,_r;
vector<pair<int,ll> > E[MAXN];
void add_edge(int From,int To,ll Len){
	E[From].push_back(make_pair(To,Len));
	return;
}
ll pos[MAXN*8];
struct node{
	int id;
	ll now_dis;
	bool operator < (const node &oth)const{
		return now_dis<oth.now_dis;
	}
}t;
int l[MAXN*8],r[MAXN*8],lson[MAXN*8],rson[MAXN*8],cnt,rt_in,rt_out;
ll dis[MAXN*8];
bool vis[MAXN*8];
void build_in(int &id,int L,int R){
	id=++cnt;
	l[id]=L,r[id]=R;
	if(L==R){
		pos[L]=id;
		return;
	}
	int mid=(L+R)>>1;
	build_in(lson[id],L,mid);
	build_in(rson[id],mid+1,R);
	add_edge(id,lson[id],0);
	add_edge(id,rson[id],0);
	return;
}
void build_out(int &id,int L,int R){
	if(L==R){
		id=pos[L];
		return;
	}
	id=++cnt;
	l[id]=L,r[id]=R;
	int mid=(L+R)>>1;
	build_out(lson[id],L,mid);
	build_out(rson[id],mid+1,R);
	add_edge(lson[id],id,0);
	add_edge(rson[id],id,0);
	return;
}
void add_in(int id,int L,int R,int UL,int UR,int pos,ll delta){
	if(L>R||UR<L||R<UL)return;
	if(UL<=L&&R<=UR){
		add_edge(pos,id,delta);
		return;
	}
	int mid=(L+R)>>1;
	if(UL<=mid)add_in(lson[id],L,mid,UL,UR,pos,delta);
	if(UR>mid)add_in(rson[id],mid+1,R,UL,UR,pos,delta);
	return;
}
void add_out(int id,int L,int R,int UL,int UR,int pos,ll delta){
	if(L>R||UR<L||R<UL)return;
	if(UL<=L&&R<=UR){
		add_edge(id,pos,delta);
		return;
	}
	int mid=(L+R)>>1;
	if(UL<=mid)add_out(lson[id],L,mid,UL,UR,pos,delta);
	if(UR>mid)add_out(rson[id],mid+1,R,UL,UR,pos,delta);
	return;
}
void dijkstra(int st){
	priority_queue<node> pq;
	for(int i=1;i<=(n<<3);i++)dis[i]=1e18;
	dis[st]=0;
	pq.push((node){st,0});
	while(pq.size()){
		t=pq.top();
		pq.pop();
        if(t.now_dis>dis[t.id])continue;
		for(pair<int,ll> x:E[t.id]){
			if(dis[x.first]>dis[t.id]+x.second){
				dis[x.first]=dis[t.id]+x.second;
				pq.push((node){x.first,dis[x.first]});
//					vis[e[i].v]=1;
			}
		}
	}
}
inline ll read(){
    ll x = 0, y = 1, c = getchar();
    while (c>'9' || c<'0') { if (c == '-')y = -1; c = getchar(); }
    while (c >= '0'&&c <= '9') { x = x * 10 + c - '0'; c = getchar(); }
    return x * y;
}
int main(){
	n=read(),q=read(),s=read();
	build_in(rt_in,1,n);
	build_out(rt_out,1,n);
	for(int i=1;i<=q;i++){
		op=read();
		if(op==1){
            x=read(),y=read(),z=read();
			add_edge(pos[x],pos[y],z);
		}
		else if(op==2){
            x=read(),_l=read(),_r=read(),z=read();
			add_in(rt_in,1,n,_l,_r,pos[x],z);
		}
		else{
			x=read(),_l=read(),_r=read(),z=read();
			add_out(rt_out,1,n,_l,_r,pos[x],z);
		}
	}
	dijkstra(pos[s]);
	for(int i=1;i<=n;i++){
		if(dis[pos[i]]!=1e18)printf("%lld ",dis[pos[i]]);
		else printf("-1 ");
	}
	return 0;
}

跑的巨慢

2024/4/15 19:39
加载中...