NOIP之前留的坑

CF1163F Indecisive Taxi Fee

经典问题:删边最短路

在Ta的博客查看

任意找一条最短路E,给E上的点和边新加入一个1~len的编号

最短路上的边变大麻烦

维护l[x],r[x],从1到x最短路最后一个,x到n最短路第一个 在E上的点的编号

特别地,当x在E上时,显然有l[x]=r[x]=id[x]

然后枚举不在最短路上的边,线段树进行覆盖即可

不经过边e的最短路一定会覆盖到e上的(也不取决于最短路树什么样)

所以三遍dij

只要回来重新把在E上的x,l[x]=r[x]=id[x]即可

注意必须这样!

否则可能把经过的边也尝试最小化了。

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
#define pb push_back
#define solid const auto &
#define enter cout<<endl
#define pii pair<int,int>
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');} namespace Miracle{
const int N=2e5+;
const int M=2e5+;
const ll inf=0x3f3f3f3f3f3f3f3f;
int n,m,Q;
struct edge{
int x,y,z;
}b[M];
int vis[N];
int pre[N];
int on[N],is[M];
int up,id[N],bi[M];
struct node{
int nxt,to,val;
}e[*M];
int hd[N],cnt=;
void add(int x,int y,int z){
e[++cnt].nxt=hd[x];e[cnt].to=y;e[cnt].val=z;
hd[x]=cnt;
}
struct po{
int id;ll val;
po(){}
po(int dd,ll vv){
id=dd;val=vv;
}
bool friend operator <(po a,po b){
return a.val>b.val;
}
};
priority_queue<po>q;
ll dis[][N];
void init(){
memset(dis[],0x3f,sizeof dis[]);
dis[][n]=;
q.push(po(n,));
while(!q.empty()){
po now=q.top();q.pop();
if(vis[now.id]) continue;
int x=now.id;
vis[x]=;
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(dis[][y]>dis[][x]+e[i].val){
dis[][y]=dis[][x]+e[i].val;
pre[y]=i;
q.push(po(y,dis[][y]));
}
}
}
} int lim[N][];
void dij(int typ){
memset(dis[typ],0x3f,sizeof dis[typ]);
memset(vis,,sizeof vis);
while(!q.empty()) q.pop();
if(typ) q.push(po(n,)),dis[][n]=;
else q.push(po(,)),dis[][]=; while(!q.empty()){
po now=q.top();q.pop();
if(vis[now.id]) continue;
int x=now.id;
vis[x]=;
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(dis[typ][y]>dis[typ][x]+e[i].val){
dis[typ][y]=dis[typ][x]+e[i].val;
if(on[x]){
lim[y][typ]=id[x];
}else{
lim[y][typ]=lim[x][typ];
}
q.push(po(y,dis[typ][y]));
}
}
}
}
struct tr{
ll mi;
tr(){mi=inf;}
}t[*N];
#define mid ((l+r)>>1)
void chan(int x,int l,int r,int L,int R,ll c){
if(L<||R>up) return;
if(L<=l&&r<=R){
t[x].mi=min(t[x].mi,c);return ;
}
if(L<=mid) chan(x<<,l,mid,L,R,c);
if(mid<R) chan(x<<|,mid+,r,L,R,c);
}
void query(int x,int l,int r,int p,ll &ans){
if(l==r) {
ans=min(ans,t[x].mi);return;
}
ans=min(ans,t[x].mi);
if(p<=mid) query(x<<,l,mid,p,ans);
else query(x<<|,mid+,r,p,ans);
}
int main(){
rd(n);rd(m);rd(Q);
int x,y,z;
for(reg i=;i<=m;++i){
rd(x);rd(y);rd(z);
add(x,y,z);add(y,x,z);b[i].x=x;b[i].y=y;b[i].z=z;
}
init();
x=;
while(x){
on[x]=;
is[pre[x]/]=;
++up;
id[x]=up;
bi[pre[x]/]=up;
x=e[pre[x]^].to;
}
dij();dij();
for(reg i=;i<=n;++i){
if(on[i]){
lim[i][]=lim[i][]=id[i];
}
}
lim[][]=;lim[n][]=up;
for(reg i=;i<=m;++i){
int x=b[i].x,y=b[i].y;
if(!is[i]){
ll len=dis[][x]+dis[][y]+b[i].z;
if(lim[x][]<=lim[y][]-) chan(,,up,lim[x][],lim[y][]-,len);
len=dis[][x]+dis[][y]+b[i].z;
if(lim[y][]<=lim[x][]-) chan(,,up,lim[y][],lim[x][]-,len);
}
}
while(Q--){
rd(x);rd(z);
ll ans=inf;
if(is[x]){
if(z<=b[x].z){
ans=dis[][n]-(b[x].z-z);
}else{
query(,,up,bi[x],ans);
ans=min(ans,min(dis[][b[x].x]+dis[][b[x].y]+z,dis[][b[x].x]+dis[][b[x].y]+z));
}
}else{
ans=min(dis[][n],min(dis[][b[x].x]+dis[][b[x].y]+z,dis[][b[x].x]+dis[][b[x].y]+z));
}
printf("%lld\n",ans);
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
*/

CF1163F Indecisive Taxi Fee的更多相关文章

  1. CF1163F Indecisive Taxi Fee(线段树+图论)

    做法 这里的修改是暂时的 找到一条最短路径\(E\),需要考虑的是将最短路径上的边增大 每个点考虑与\(1/n\)的最短路径在E上前缀/后缀的位置,设\(L_i,R_i\) 考虑每条边\((u,v)\ ...

  2. POJ 4046 Sightseeing

    Sightseeing Time Limit: 5000ms Memory Limit: 65536KB This problem will be judged on PKU. Original ID ...

  3. A cost-effective recommender system for taxi drivers

    一个针对出租车司机有效花费的推荐系统 摘要 GPS技术和新形式的城市地理学改变了手机服务的形式.比如说,丰富的出租车GPS轨迹使得出做租车领域有新方法.事实上,最近很多工作是在使用出租车GPS轨迹数据 ...

  4. [ACM_数学] Taxi Fare [新旧出租车费差 水 分段函数]

    Description Last September, Hangzhou raised the taxi fares. The original flag-down fare in Hangzhou ...

  5. zjuoj 3600 Taxi Fare

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3600 Taxi Fare Time Limit: 2 Seconds    ...

  6. The 9th Zhejiang Provincial Collegiate Programming Contest->Problem A:A - Taxi Fare

    Problem A: Taxi Fare Time Limit: 2 Seconds Memory Limit: 65536 KB Last September, Hangzhou raised th ...

  7. 【HDU1960】Taxi Cab Scheme(最小路径覆盖)

    Taxi Cab Scheme Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  8. poj 2060 Taxi Cab Scheme (二分匹配)

    Taxi Cab Scheme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5710   Accepted: 2393 D ...

  9. FEE Development Essentials

    FEE Development Essentials JS Basic function call() and apply() func1.bind(thisObj,arg1...argn) Cust ...

随机推荐

  1. 【水滴石穿】react-native-book

    先推荐一个学习的地址:https://ke.qq.com/webcourse/index.html#cid=203313&term_id=100240778&taid=12778558 ...

  2. phpcms 允许英文目录有空格

    大家都用过phpcm添加栏目吧,在添加栏目里面,有个选项是 英文目录,这里目录可以用作伪静态功能.这么英文不能有空格等特殊字符.但是如果页面中需要引用包含空格的字符呢,例如,关于我们页面,我要显示英文 ...

  3. 为什么你应该使用OpenGL而不是DirectX?

    这是一篇很意思的博文,原文链接为:http://blog.wolfire.com/2010/01/Why-you-should-use-OpenGL-and-not-DirectX 大家可以思考一下: ...

  4. Dalvik 虚拟机和 Sun JVM 在架构和执行方面有什么本质区别?

    目前我理解的是: 两者共同点: 都是解释执行 byte code 都是每个 OS 进程运行一个 VM,并执行一个单独的程序 在较新版本中(Froyo / Sun JDK 1.5)都实现了相当程度的 J ...

  5. 如何实现已发布app的自动更新

    要实现app的自动更新,做两件事情就可以搞定 1.获取当前手机中的app版本号 我们可以通过查询mainbundle中的获取CFBundleVersion NSDictionary *infoDict ...

  6. 一.数据结构&算法的引言+时间复杂度

    目录(contents): 1.什么是计算机科学?什么是算法? 2.如何形象化的理解算法? 3.什么是算法分析? 4.时间复杂度 5.数据结构 6.总结算法和数据结构之间的关联 一.什么是计算机科学? ...

  7. 【数论】如何证明gcd/exgcd

    我恨数论 因为打这篇的时候以为a|b是a是b的倍数,但是懒得改了,索性定义 a|b 为 a是b的倍数 咳咳,那么进入正题,如何证明gcd,也就是 gcd(a,b) = gcd(b,a%b)? 首先,设 ...

  8. BZOJ3832Rally题解

    一道思维神题.... 我们像网络流一样加入原点S,与汇点T 用f[i]表示原点到i的最长路,用g[i]表示i到汇点的最长路 f数组与g数组都可以dp求出来的 接下来考虑如何通过这些信息来维护删除某个点 ...

  9. 【JZOJ4824】【NOIP2016提高A组集训第1场10.29】配对游戏

    题目描述 流行的跳棋游戏是在一个有m*n个方格的长方形棋盘上玩的.棋盘起初全部被动物或障碍物占满了.在一个方格中,'X'表示一个障碍物,一个'0'-'9'的个位数字表示一个不同种类的动物,相同的个位数 ...

  10. 开发ArcEngine时的一个提示,无效位图,无法在类“***”中找到资源“***.bmp”

    解决办法:文件属性-生成操作 修改为 :嵌入式资源.