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. 洛谷 P1016 旅行家的预算 模拟+贪心

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P1016 旅行家的预算 题目描述 一个旅行家想驾驶汽车 ...

  2. svn upgrade

    在我们把我们服务器上的svn 版本号升级以后,我们之前的代码再执行svn命令时,会提示需要执行svn upgrade命令把当前的代码由低版本的svn 上迁移到高版本的svn 上去. 直接执行svn u ...

  3. 【JZOJ4919】【NOIP2017提高组模拟12.10】神炎皇

    题目描述 神炎皇乌利亚很喜欢数对,他想找到神奇的数对. 对于一个整数对(a,b),若满足a+b<=n且a+b是ab的因子,则成为神奇的数对.请问这样的数对共有多少呢? 数据范围 对于100%的数 ...

  4. oracle-Expdp/impdp命令

    建立逻辑路径 create or replace directory dumpdir as 'c:\'; grant read,write on directory dumpdir to scott; ...

  5. PHPCMS快速建站系列之在线留言

    有两种方法 第一种方法: 利用留言板插件,在后台模板中,安装留言板插件使用,这里先不展开. 第二种方法: 表单向导的适用场合: 如果一个前台页面只是为了提交表单数据,那么就非常适合适用表单向导的功能, ...

  6. JavaScript中操作数组的方法

    JavaScript Array 对象 对数组操作的方法分为两种 一种是会改变原始数组的变异方法,还有一种是不会改变原始数组的非变异方法. 总结 巧记 Push() 尾部添加 pop() 尾部删除 U ...

  7. GIAC2019 演讲精选 | 面向未来的黑科技——UI2CODE闲鱼基于图片生成跨端代码

    一直以来, 如何从‘视觉稿’精确的还原出 对应的UI侧代码 一直是端侧开发同学工作里消耗比较大的部分,一方面这部分的工作 比较确定缺少技术深度,另一方面视觉设计师也需要投入大量的走查时间,有大量无谓的 ...

  8. LeetCode97 Interleaving String

    Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. (Hard) For example,Giv ...

  9. iOS开发 分享到QQ空间提示"分享失败 应用不存在"

    本人遇到该问题的原因是配置SDK初始化时的APPID错误,可以参考下shareSDK的集成文档中的一段话: 可选:支持QQ所需的相关配置及代码 登录QQ互联(http://connect.qq.com ...

  10. 数据节点Datanodes