给定n颗行星,q次处理,地球位置为s,求解在q次处理后,地球到每一颗行星的位置。

其中q有三种不同的操作:

  1. 输入v,u,wv,u,w,构建一条从vv到uu的代价为ww的路线

  2. 输入u,l,r,wu,l,r,w,构建一条从uu到区间[l,r][l,r]中任意一颗行星的代价为ww的路线

  3. 输入u,l,r,wu,l,r,w,构建区间[l,r]中任意一颗行星到uu的代价为ww的路线

建立两颗线段树,一颗记录操作2中其他点AOE到这些点的区间,一颗记录所有点单独到一个节点的路径,把线段树上的点单独作为一个节点来维护,偷了一个很好的图来表达

#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <functional>
#define For(i, x, y) for(int i=x; i<=y; i++)
#define Mem(f, x) memset(f, x, sizeof(f))
#define Sca(x) scanf("%d", &x)
#define Pri(x) printf("%d\n", x)
#define CLR(u) for(int i = 0; i <= N ; i ++) u[i].clear();
#define LL long long
#define mp make_pair
#define PI pair<int,int>
#define PIL pair<int,long long>
#define PLI pair<long long,int>
#define pb push_back
#define fi first
#define se second
using namespace std;
typedef vector<int> VI;
const int maxn = 1e5 + ;
const int maxm = 3e5 + ;
const LL INF = 1e18 + ;
const int mod = 1e9 + ;
inline int read()
{
int now=;register char c=getchar();
for(;!isdigit(c);c=getchar());
for(;isdigit(c);now=now*+c-'',c=getchar());
return now;
}
struct Tree
{
int left,right;
int lr,rr;
}tree[maxm];
int N,M;
int Q,S;
int tot;
vector<PIL> P[maxm];
LL dis[maxm];
bool vis[maxm];
int Build(int left,int right,int flag)
{
if(left == right) return left;
int root = ++tot;
tree[root].left = left; tree[root].right = right;
int mid = (left + right) / ;
tree[root].lr = Build(left,mid,flag);
tree[root].rr = Build(mid + ,right,flag);
if(flag){
P[root].pb(mp(tree[root].lr,));
P[root].pb(mp(tree[root].rr,));
}else{
P[tree[root].lr].pb(mp(root,));
P[tree[root].rr].pb(mp(root,));
}
return root;
}
void update(int v,int l,int r,int root,int flag,LL w)
{
if(l == r){
if(flag) P[v].pb(mp(l,w));
else P[l].pb(mp(v,w));
return;
}
if(l <= tree[root].left && tree[root].right <= r)
{
if(flag) P[v].pb(mp(root,w));
else P[root].pb(mp(v,w));
return;
}
int mid = (tree[root].left + tree[root].right) >> ;
if(r <= mid) update(v,l,r,tree[root].lr,flag,w);
else if(l > mid) update(v,l,r,tree[root].rr,flag,w);
else{
update(v,l,mid,tree[root].lr,flag,w);
update(v,mid + ,r,tree[root].rr,flag,w);
} }
void Dijkstra(int start){
Mem(vis,);
for(int i = ; i <= tot; i ++){
dis[i] = INF;
}
dis[start] = ;
priority_queue<PLI,vector<PLI>,greater<PLI>>Q;
Q.push(mp(,start));
while(!Q.empty()){
PLI u = Q.top(); Q.pop();
if(vis[u.se]) continue;
vis[u.se] = ;
for(int j = ; j < P[u.se].size(); j ++){
PIL v = P[u.se][j];
if(!vis[v.fi] && dis[v.fi] > dis[u.se] + v.se){
dis[v.fi] = dis[u.se] + v.se;
Q.push(mp(dis[v.fi],v.fi));
}
}
}
} int main()
{
N = read(); Q = read(); S = read();
tot = N;
int L = Build(,N,);
int R = Build(,N,);
For(i,,Q){
int op = read() , v = read();
LL w;
if(op == ){
int u = read();
scanf("%lld",&w);
P[v].pb(mp(u,w));
}else if(op == ){
int l = read(); int r = read();
scanf("%lld",&w);
update(v,l,r,R,,w);
}else{
int l = read(); int r = read();
scanf("%lld",&w);
update(v,l,r,L,,w);
}
}
/* For(i,N + 1,tot){
printf("%d : %d %d\n",i,tree[i].left,tree[i].right);
}
For(i,1,tot){
printf("%d : ",i);
for(int j = 0 ; j < P[i].size(); j ++){
printf("%d ",P[i][j]);
}
printf("\n");
} */
Dijkstra(S);
For(i,,N){
if(dis[i] == INF) dis[i] = -;
printf("%lld ",dis[i]);
}
return ;
}

最新文章

  1. 在ie与火狐的兼容性
  2. arrayLen
  3. innobackupex err2
  4. JSON 之 SuperObject(4): 增、删、改
  5. Javascript常见操作
  6. 【HDOJ】1244 Max Sum Plus Plus Plus
  7. 一键cobbler批量安装脚本
  8. 【剑指offer】面试题34:丑数
  9. 实现div中图片的滚动
  10. Android——仿QQ聊天撒花特效
  11. 100个精选zencart扩展插件
  12. SpringMVC接收json数组对象
  13. Linux系统下分析内存使用情况的管理工具
  14. VS开发入门一:VS常用快捷键大全,工欲善其事必先利其器 只看标红的吧
  15. Unity 原厂免费资源学习
  16. sparksql进阶
  17. 78k的text 文件,输出到textbox 竟然用了20几秒的原因
  18. VS2010 的 HTML 5验证
  19. mysql 中find_in_set()和in()用法比较
  20. C++中的关键字用法--- 四种强制类型转换的总结

热门文章

  1. 20135327郭皓--Linux内核分析第七周 可执行程序的装载
  2. java-过滤器、拦截器
  3. git常用命令点击查看
  4. Leetcode——171.Excel表列序号【水题】
  5. HDOJ2013_蟠桃记
  6. java面对对象(六)--内部类、匿名内部类
  7. [BUAA2017软工]第1次个人项目 数独
  8. PAT L2-022 重排链表
  9. html 头部 head
  10. Python的数据类型和运算