灵异事件(?
  • 板块CF786B Legacy
  • 楼主lsj2009Isj2OO9
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/8/3 14:37
  • 上次更新2023/11/3 06:10:24
查看原帖
灵异事件(?
468657
lsj2009Isj2OO9楼主2023/8/3 14:37

交上去,CF 显示样例 T 了,然而我本地跑得飞快。

  • 评测记录:

CF:https://codeforces.com/contest/786/submission/216941672

Luogu:https://www.luogu.com.cn/record/118782203

  • 代码:
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define INFLL 0x3f3f3f3f3f3f3f3f
#define int long long
#define PII pair<int,int>
#define rep(k,l,r) for(int k=l;k<=r;++k)
#define per(k,r,l) for(int k=r;k>=l;--k)
#define cl(f,x) memset(f,x,sizeof(f))
using namespace std;
const int N=1e6+5,D=5e5;
int head[N],len;
struct node {
	int to,w,nxt;
}; node edge[N];
void add_edge(int u,int v,int w) {
	edge[++len]={v,w,head[u]}; head[u]=len;
}
int dis[N];
void dijkstra(int s) {
	priority_queue<PII,vector<PII>,greater<PII>> heap;
	cl(dis,0x3f); dis[s]=0; heap.push({0,s});
	while(!heap.empty()) {
		int u=heap.top().second,d=heap.top().first; heap.pop();
		if(dis[u]!=d)
			continue;
		for(int i=head[u];i;i=edge[i].nxt) {
			int v=edge[i].to,w=edge[i].w;
			if(dis[v]>dis[u]+w) {
				dis[v]=dis[u]+w; heap.push({dis[v],v});
			}
		}
	}
}
#define ls(k) (k<<1)
#define rs(k) (k<<1|1)
int leaf[N];
void build(int k,int l,int r) {
    if(l==r) {
        leaf[l]=k; add_edge(k,k+D,0); add_edge(k+D,k,0); return;
    }
    int mid=(l+r)>>1;
    add_edge(k,ls(k),0); add_edge(k,rs(k),0);
    add_edge(ls(k)+D,k+D,0); add_edge(rs(k)+D,k+D,0);
    build(ls(k),l,mid);
    build(rs(k),mid+1,r);
}
void update(int k,int l,int r,int qx,int ql,int qr,int op,int val) {
    if(ql<=l&&r<=qr) {
        if(op==0) //[l,r]->v
            add_edge(qx+D,k,val);
        else //v->[l,r]
            add_edge(k+D,qx,val);
        return;
    }
    int mid=(l+r)>>1;
    if(ql<=mid)
        update(ls(k),l,mid,qx,ql,qr,op,val);
    if(qr>=mid+1)
        update(rs(k),mid+1,r,qx,ql,qr,op,val);
}
signed main() {
	int n,q,s;
    scanf("%d%d%d",&n,&q,&s);
    build(1,1,n);
    while(q--) {
        int op;
        scanf("%d",&op);
        if(op==1) {
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            add_edge(leaf[u],leaf[v],w);
        } else {
            int v,l,r,w;
            scanf("%d%d%d%d",&v,&l,&r,&w);
            update(1,1,n,leaf[v],l,r,op&1,w);
        }
    }
    dijkstra(leaf[s]);
    rep(i,1,n)
        printf("%lld ",dis[leaf[i]]==INFLL? -1:dis[leaf[i]]);
	return 0;
}
2023/8/3 14:37
加载中...