洛谷 P1710 地铁涨价
题目背景
本题开O2优化,请注意常数
题目描述
博艾市除了有海底高铁连接中国大陆、台湾与日本,市区里也有很成熟的轨道交通系统。我们可以认为博艾地铁系统是一个无向连通图。博艾有N个地铁站,同时有M小段地铁连接两个不同的站。
地铁计价方式很简单。从A站到B站,每经过一小段铁路(连接直接相邻的两个点的一条边),就要收取1博艾元。也就是说,从A站到B站,选择的路径不一样,要价也会不同。
我们认为凡华中学在1号地铁站。学生们通过地铁通勤,他们当然知道选择最短路来坐车的话,票价最便宜。
然而博艾地铁公司经营不善,一直亏损,于是他们打算提价。提价一次就是将一小段铁路原来收费1元改收2元。同一小段的铁路不会多次提价。他们打算提价Q次。
学生们知道,如果他们到学校的一条最短路径中的一小段提价了,可以改变路径,使总票价不变。然而随着一条一条的铁路被提价,当居住在某个站附近的学生发现,提价后,没有任何一种方案可以从家到学校的费用和初始费用相等时,就会不满。
现在地铁公司希望知道,对于每一次涨价,有多少个站,学生会因为涨价而不满呢?
输入输出格式
输入格式:
第一行为三个整数N,M,Q。
接下来M行,每行2个整数ai,bi,表示第i条铁路连接的两个站。i表示铁路编号。
接下来Q行,每行一行整数rj,表示每次涨价的铁路编号。
输出格式:
Q行。每行一个整数表示不满的车站数量。
输入输出样例
5 6 5
1 2
1 3
4 2
3 2
2 5
5 3
5
2
4
1
3
0
2
2
4
4
说明
【样例解释】
次数 车站2 车站3 车站4 车站5
初始 1 1 2 2
1 1 1 2 2
2 1 2 2 3
3 1 2 2 3
4 2 2 3 3
5 2 2 4 3
【数据范围】
对于20%的数据 N≤100, Q≤30
对于40%的数据 Q≤30
对于70%的数据 正确的输出结果中,不会有超过50种不一样的整数(数据范围剧透解法系列)
对于100%的数据 N≤100000, Q≤M≤200000
其实还是蛮好做的啊(但感觉我比正解多个Log 啊 2333),一个车站x到1的最短路都增加当且仅当对于所有dis[u]+1==dis[x]且存在边(u,x)的u,u车站到1的最短路已经增加了或者(u,x)涨价了。
然后我们就可以先预处理一遍dis[],再把最短路的依赖关系这个DAG建出来。现在我们要做的就相当于是一个动态拓扑排序。
一个点u能使v的度数减少1当且仅当 DAG上有 <u,v> 的边(注意这里是无向边),且( u到1的最短路增加 或者 原图中(u,v)的价格增加),并且这种效应只能产生一次。 因为后面的或 可能会使效应产生多次,所以我用map判了一下重。。。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<map>
#include<algorithm>
#include<cstring>
#define ll long long
const int maxn=100005;
#define pb push_back
using namespace std;
vector<int> g[maxn];
map<int,int> ban[maxn];
int q[maxn],tp,tl,ans=0;
int id[maxn],hd[maxn],n,m,Q;
int to[maxn*4],ne[maxn*4],d[maxn];
bool v[maxn]; inline void BFS(){
d[1]=0,v[1]=1,q[tp=tl=1]=1;
int x;
while(tp<=tl){
x=q[tp++];
for(int i=hd[x];i;i=ne[i]) if(!v[to[i]]){
v[to[i]]=1,d[to[i]]=d[x]+1;
q[++tl]=to[i];
}
}
} inline void build(){
for(int i=1;i<=n;i++)
for(int j=hd[i];j;j=ne[j]) if(d[i]+1==d[to[j]]){
g[i].pb(to[j]);
id[to[j]]++;
}
} inline void prework(){
BFS();
build();
} inline void work(int x){
int T;
q[tp=tl=1]=x;
while(tp<=tl){
x=q[tp++],ans++;
for(int i=g[x].size()-1;i>=0;i--){
T=g[x][i];
if(!ban[x].count(T)){
ban[x][T]=1,id[T]--;
if(!id[T]) q[++tl]=T;
}
}
}
} inline void solve(){
memset(v,0,sizeof(v));
int uu,vv,pos;
while(Q--){
scanf("%d",&pos),uu=to[pos],vv=to[pos+m];
if(d[uu]>d[vv]) swap(uu,vv);
if(d[uu]+1==d[vv])
if(!ban[uu].count(vv)){
ban[uu][vv]=1;
id[vv]--;
if(!id[vv]) work(vv);
} printf("%d\n",ans);
}
} int main(){
scanf("%d%d%d",&n,&m,&Q);
int uu,vv;
for(int i=1;i<=m;i++){
scanf("%d%d",&uu,&vv);
to[i]=vv,ne[i]=hd[uu],hd[uu]=i;
to[i+m]=uu,ne[i+m]=hd[vv],hd[vv]=i+m;
}
prework();
solve();
return 0;
}
洛谷 P1710 地铁涨价的更多相关文章
- 洛谷P1710 地铁涨价
P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交 讨论 题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...
- 洛谷P1710地铁涨价
题目背景 本题开O2优化,请注意常数 题目描述 博艾市除了有海底高铁连接中国大陆.台湾与日本,市区里也有很成熟的轨道交通系统.我们可以认为博艾地铁系统是一个无向连通图.博艾有N个地铁站,同时有M小段地 ...
- 洛谷P1710 地铁涨价 图论
其实是个傻逼题但是我太傻逼了然后就错了无数遍总算A了 觉得不写个题解真是亏了 其实是 之前想了个超时想法 然后还自以为很对?后来看了题解发现还是比较妙的哦 于是就想着那还是发个题解记录下趴quq 正解 ...
- 洛谷2583 地铁间谍 (UVa1025A Spy in the Metro)
洛谷2583 地铁间谍(UVa1025A Spy in the Metro) 本题地址:http://www.luogu.org/problem/show?pid=2583 题目描述 特工玛利亚被送到 ...
- uva A Spy in the Metro(洛谷 P2583 地铁间谍)
A Spy in the Metro Secret agent Maria was sent to Algorithms City to carry out an especially dangero ...
- P1710 地铁涨价
题目背景 本题开O2优化,请注意常数 题目描述 博艾市除了有海底高铁连接中国大陆.台湾与日本,市区里也有很成熟的轨道交通系统.我们可以认为博艾地铁系统是一个无向连通图.博艾有N个地铁站,同时有M小段地 ...
- 洛谷P2583 地铁间谍
P2583 地铁间谍 题目描述 特工玛利亚被送到S市执行一个特别危险的任务.她需要利用地铁完成他的任务,S市的地铁只有一条线路运行,所以并不复杂. 玛利亚有一个任务,现在的时间为0,她要从第一个站出发 ...
- luogu P1710 地铁涨价
嘟嘟嘟 一道最短路好题. 首先明确一点,把一条边的边权变成2,等于删去这条边.因为变成2后最短路肯定不会经过这条边,就相当于删去这条边了. 所以题目变成了依次删去Q条边,求每一次删完边后有几个点的最短 ...
- 洛谷10月月赛Round.3
Rank11:260=60+100+100 P2409 Y的积木 题目背景 Y是个大建筑师,他总能用最简单的积木拼出最有创意的造型. 题目描述 Y手上有n盒积木,每个积木有个重量.现在他想从每盒积木中 ...
随机推荐
- MAC的睡眠模式介绍
因为之前用的是网上流传的土法来禁止生成 sleepimage,尝到了苦头,而且2次! 大家知道 OSX 有几种睡眠模式,其中 hibernatemode 可以是 0 (传统睡眠方式,不生成 sleep ...
- 总结:JavaScript异步、事件循环与消息队列、微任务与宏任务
本人正在努力学习前端,内容仅供参考.由于各种原因(不喜欢博客园的UI),大家可以移步我的github阅读体验更佳:传送门,喜欢就点个star咯,或者我的博客:https://blog.tangzhen ...
- [JOYOI] 1035 棋盘覆盖
题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Local 题目描述 给出一张nn(n<=100)的国际象棋棋盘,其中被删除了一些点,问可以使用多 ...
- MySql的基操勿六
2018/12/6 星期四 19:34:07 authot by dabaine 数据库注释; -- 这就是注释 /*.....*/ 这也是注释 创建库; create databse [if not ...
- pssh批量管理服务器
pssh命令是一个python编写可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具中很出色的,类似pdsh,个人认为相对pdsh更为简便,使用必须在各个服务器上配置好密钥认证访问. 1. ...
- python 基础知识汇总—— if else while continue
1.if 语句 什么是if语句?if语句用来干什么的? if语句说通俗点,就是判断,如果判断条件为真,那么就执行语句,就像我们生活中例子,如果你饿了,判断为真,就要吃饭,于是你就会执行吃饭这个动作,如 ...
- Mining of Massive Datasets-1
given lots of data->discover patterns and models that are: valid, useful, unexpected, understanda ...
- strcat strcpy 源代码,用指针去实现
15. 指针实现 strcmp函数 • int newStrcpy(char *p, char *q) • { • while(*p ==*q) { ...
- OSPF 提升 三 type of Areas
ospf ccnp 三 上图中 rip域中的不连续的100条路由 在a1中导致LSDB太大 在保证网段的可达性的前提下 尽可能减少区域内路由器的lsdb 可以将a1设置 ...
- xtu数据结构 H. City Horizon
H. City Horizon Time Limit: 2000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Java cl ...