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;}
阅读全文
0 0
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- hdu
- hdu
- HDU
- PyCharm使用技巧:Structure(列出代码结构)
- 匿名类和匿名内部类
- 如何获得 Qt窗口部件在主窗口中的位置--确定鼠标是否在某一控件上与在控件上的位置
- PyCharm使用技巧:Find Action(查找并跳转到设置界面)
- [TetraMAX]set_delay -launch_cycle last_shift 的含义
- HDU
- 法规数字分类
- <QT>常见错误总结
- Codeforces Round 23
- sofia-sip下载地址
- 记忆化搜索 哈工大1865
- 进程程序替换
- 非常好的理解遗传算法的例子
- lowest node's LCA