HDU

来源:互联网 发布:原油分析软件哪个好 编辑:程序博客网 时间:2024/06/06 18:20

题目链接点这里

线段树优化建边太厉害了,,

这题题解说的很清楚了:点这里

不过实现上有很多小技巧,,强烈建议做一下

#include<iostream>#include<cstdio>#include<math.h>#include<algorithm>#include<map>#include<set>#include<bitset>#include<stack>#include<queue>#include<string.h>#include<cstring>#include<vector>#include<time.h>#include<stdlib.h>using namespace std;#define INF 0x3f3f3f3f#define INFLL 0x3f3f3f3f3f3f3f3f#define FIN freopen("input.txt","r",stdin)#define mem(x,y) memset(x,y,sizeof(x))typedef unsigned long long ULL;typedef long long LL;#define fuck(x) cout<<"q"<<endl;#define MX 111111#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1typedef pair<pair<int,int>,int> PIII;typedef pair<int,int> PII;const double eps=1e-5;int n,m,k,s,t;int id1[MX<<3],id2[MX<<3],node_cnt;int head[MX<<4],edge_cnt;struct Edge{    int nxt,to,dist;    Edge() {}    Edge(int nxt,int to,int dist):nxt(nxt),to(to),dist(dist) {}} E[MX<<4];void edge_init(){    mem(head,-1);    edge_cnt=0;}void edge_add(int u,int v,int dist){    E[edge_cnt]=Edge(head[u],v,dist);    head[u]=edge_cnt++;}void build(int l,int r,int rt){    id1[rt]=node_cnt++;    id2[rt]=node_cnt++;    edge_add(id2[rt],id1[rt],0);    if(rt!=1)edge_add(id1[rt],id1[rt>>1],0),edge_add(id2[rt>>1],id2[rt],0);    if(l==r)    {        if(l==1)s=id1[rt];        if(l==n)t=id2[rt];        return;    }    int m=(l+r)>>1;    build(lson);    build(rson);}struct Nod{    int k,dist,x;    bool operator <(const Nod a)const    {        return dist>a.dist;    }    Nod(int dist,int x,int k):dist(dist),x(x),k(k) {}};int p[3*MX],q[3*MX];void query(int *w,int L,int R,int l,int r,int rt){    if(L<=l&&R>=r)    {        w[++w[0]]=rt;        return ;    }    int m=(l+r)>>1;    if(m>=L)query(w,L,R,lson);    if(m+1<=R)query(w,L,R,rson);}int d[MX<<2][11];int dijkstra(int s,int t){    mem(d,0x3f);    d[s][0]=0;    priority_queue<Nod> Q;    Q.push(Nod(0,s,0));    while(!Q.empty())    {        Nod u=Q.top();        Q.pop();        if(u.x==t)return u.dist;        for(int i=head[u.x]; ~i; i=E[i].nxt)        {            int v=E[i].to;            if(d[v][u.k]>u.dist+E[i].dist)            {                d[v][u.k]=u.dist+E[i].dist;                Q.push(Nod(d[v][u.k],v,u.k));            }            if(u.k!=k&&d[v][u.k+1]>u.dist)            {                d[v][u.k+1]=u.dist;                Q.push(Nod(d[v][u.k+1],v,u.k+1));            }        }    }    return -1;}int main(){    FIN;    int T;    cin>>T;    while(T--)    {        edge_init();        cin>>n>>m>>k;        node_cnt=0;        build(1,n,1);        for(int i=1; i<=m; i++)        {            int l1,r1,l2,r2,dist;            scanf("%d%d%d%d%d",&l1,&r1,&l2,&r2,&dist);            q[0]=p[0]=0;            query(q,l1,r1,1,n,1);            query(p,l2,r2,1,n,1);            int x1=node_cnt++;            int x2=node_cnt++;            for(int i=1; i<=q[0]; i++)            {                edge_add(id1[q[i]],x1,dist);                edge_add(x2,id2[q[i]],0);            }            for(int i=1; i<=p[0]; i++)            {                edge_add(id1[p[i]],x2,dist);                edge_add(x1,id2[p[i]],0);            }        }        int ans=dijkstra(s,t);        if(ans==-1)puts("CreationAugust is a sb!");        else printf("%d\n",ans);    }    return 0;}


原创粉丝点击