[CSP-S模拟测试]:午餐(贪心+最短路)
题目传送门(内部题115)
输入格式
第一行两个正整数$n,m$。
接下来$m$行,每行$4$个正整数$u_j,v_j,L_j,R_j$。
接下来一行$n$个数,若第$i$个数为$1$,则$i$号同学最后学会了毒瘤算法;若第$i$个数为$-1$,则$i$号同学最后没有学会毒瘤算法。若第$i$个数为$0$,则不知道$i$号同学最后是否学会了毒瘤算法。
输出格式
若结果不可能出现,输出一行$Impossible$;否则,输出$m$行,第$j$行一个正整数表示第$j$条信息中的两名同学在哪一天共用午餐。
样例
样例输入1:
4 3
1 2 1 2
2 3 1 2
2 4 1 2
1 0 1 -1
样例输出1:
2
2
1
样例输入2:
4 4
1 2 1 2
2 3 2 3
2 4 1 2
3 4 3 4
1 0 1 -1
样例输出2:
Impossible
数据范围与提示
本题采用子任务评分。仅当你通过一个子任务下所有测试点时,你才能获得该子任务的分数。
对于所有数据,$1\leqslant n,m\leqslant 200,000,1\leqslant u_j,v_j\leqslant n,u_j\neq v_j,1\leqslant L_i\leqslant R_i\leqslant 10^9$。
$1.$($10$分)$n,m\leqslant 12,R_i\leqslant 3$。
$2.$($15$分)$m=n-1$,且共用午餐的关系将所有同学连接到了一起。
$3.$($15$分)不存在确定没有学会毒瘤算法的同学。
$4.$($20$分)$n,m\leqslant 2,000$。
$5.$($40$分)没有特殊限制。
题解
在没有限制的情况下(不存在确定没有学会毒瘤算法的同学),显然贪心的选择最早学更优。
那么现在我们考虑有没有学会毒瘤算法的同学的情况。
不妨设$sec[i]$表示$i$点最早学会毒瘤算法的时间,那么没有学会毒瘤算法的同学付成$inf$即可。
对于一个转移向这个同学的同学,其$sec$即为这条转移边的$l+1$,因为这两名同学可以在$l$时刻吃饭。
这个过程可以用类似最短路的思想解决。
剩余情况下尽可能早的吃饭一定更优,注意边界即可。
时间复杂度:$\Theta(n\log n)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
struct rec{int nxt,to,l,r;}e[400001];
struct node{int x,y,l,r;}b[200001];
int head[200001],cnt;
int n,m;
int a[200001];
int sec[200001],dis[200001];
bool vis[200001];
priority_queue<pair<int,int>>qs;
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>qt;
void add(int x,int y,int l,int r){e[++cnt]=(rec){head[x],y,l,r};head[x]=cnt;}
void Dij()
{
while(qs.size())
{
int x=qs.top().second;
qs.pop();
if(vis[x])continue;
vis[x]=1;
for(int i=head[x];i;i=e[i].nxt)
{
if(e[i].r<sec[x]&&sec[e[i].to]<=e[i].l)
{
sec[e[i].to]=e[i].l+1;
qs.push(make_pair(sec[e[i].to],e[i].to));
}
}
}
}
void DIJ()
{
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
qt.push(make_pair(0,1));
dis[1]=0;
while(qt.size())
{
int x=qt.top().second;
qt.pop();
if(vis[x])continue;
vis[x]=1;
for(int i=head[x];i;i=e[i].nxt)
{
int maxn=max(max(sec[e[i].to],e[i].l),dis[x]);
if(maxn<dis[e[i].to]&&maxn<=e[i].r)
{
dis[e[i].to]=maxn;
qt.push(make_pair(dis[e[i].to],e[i].to));
}
}
}
}
int main()
{
freopen("lunch.in","r",stdin);
freopen("lunch.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d%d",&b[i].x,&b[i].y,&b[i].l,&b[i].r);
add(b[i].x,b[i].y,b[i].l,b[i].r);
add(b[i].y,b[i].x,b[i].l,b[i].r);
}
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]==-1)
{
sec[i]=0x3f3f3f3f;
qs.push(make_pair(0x3f3f3f3f,i));
}
}
Dij();
DIJ();
for(int i=1;i<=n;i++)if(a[i]==1&&dis[i]==0x3f3f3f3f){puts("Impossible");return 0;}
for(int i=1;i<=m;i++)
{
if(a[b[i].x]==-1&&dis[b[i].y]<=b[i].l){puts("Impossible");return 0;}
if(a[b[i].y]==-1&&dis[b[i].x]<=b[i].l){puts("Impossible");return 0;}
}
for(int i=1;i<=m;i++)
{
if(a[b[i].x]==-1||a[b[i].y]==-1||b[i].r<max(dis[b[i].x],dis[b[i].y]))printf("%d\n",b[i].l);
else printf("%d\n",max(b[i].l,max(dis[b[i].x],dis[b[i].y])));
}
return 0;
}
rp++
[CSP-S模拟测试]:午餐(贪心+最短路)的更多相关文章
- [CSP-S模拟测试]:任务分配(最短路+贪心+DP)
题目传送门(内部题149) 输入格式 每个测试点第一行为四个正整数$n,b,s,m$,含义如题目所述. 接下来$m$行,每行三个非负整数$u,v,l$,表示从点$u$到点$v$有一条权值为$l$的有向 ...
- [CSP-S模拟测试]:迷宫(最短路)
题目传送门(内部题123) 输入格式 输入文件的第一行为四个正整数$n,m,k,d$. 接下来$m$行,每行三个整数$u,v,w$,描述一条无向道路. 输入文件最后一行包含$k$个整数,为$p_0,p ...
- [CSP-S模拟测试]:最小距离(最短路)
题目传送门(内部题97) 输入格式 第一行三个整数$n,m,p$,第二行$p$个整数$x_1\sim x_p$表示特殊点的编号.接下来$m$行每行三个整数$u,v,w$表示一条连接$u$和$v$,长度 ...
- [CSP-S模拟测试]:游戏(最短路)
题目传送门(内部题35) 输入格式 第一行,两个正整数$X,Y$.第二行,三个非负整数$A,B,C$.第三行,一个正整数$N$.接下来$N$行,每行两个非负整数$x_i,y_i$. 输出格式 一行,一 ...
- csp-s模拟测试92
csp-s模拟测试92 关于$T1$:最短路这一定建边最短路. 关于$T2$:傻逼$Dp$这一定线段树优化$Dp$. 关于$T3$:最小生成树+树P+换跟一定是这样. 深入(?)思考$T1$:我是傻逼 ...
- csp-s模拟测试99
csp-s模拟测试99 九九归一直接爆炸. $T1$一眼板子. $T2$一眼语文题(语文的唯一一次$120+$是给模拟出来的可知我的语文能力). $T3$一眼普及题. ?? Hours Later 板 ...
- csp-s模拟测试98
csp-s模拟测试98 $T1$??不是我吹我轻松手玩20*20.$T2$装鸭好像挺可做?$T3$性质数据挺多提示很明显? $One$ $Hour$ $Later$ 这$T1$什么傻逼题真$jb$难调 ...
- csp-s模拟测试95
csp-s模拟测试95 去世场祭. $T1$:这不裸的除法分块吗. $T2$:这不裸的数据结构优化$Dp$吗. $T3$:这不裸的我什么都不会搜索骗$30$分吗. 几分钟后. 这除法分块太劲了..(你 ...
- csp-s模拟测试85
csp-s模拟测试85 $T1$全场秒切没有什么区分度,$T2$全场成功转化题意但是我并不会打,$T3$暴力都没打很遗憾. 100 00:21:49 02:56:35 02:56:49 135 02: ...
随机推荐
- python-day39(正式学习)
目录 线程锁 死锁问题及递归锁 死锁 递归锁 信号量 GIL全局解释器锁 线程锁 from threading import Thread,Lock x=0 lock=Lock() def test( ...
- <input> disabled 属性
定义和用法 disabled 属性规定应该禁用输入字段. 被禁用的输入字段是无法使用和无法点击的. 如果使用该属性,则会禁用输入字段. 可以对 disabled 属性进行设置,使用户在满足某些条件时( ...
- 移动端实1px细线方法
前言 在移动端中,宽度100%,1px的线看起来要比pc端中宽度100%,1px的线粗, 那是因为css中的1px并不等于移动设备(物理像素)的1px.物理像素显示是1个像素代表2个像素,所以出现为2 ...
- Linux小知识:rm -rf/*会将系统全部删除吗
Linux小知识:rm -rf/*会将系统全部删除吗 本文是学习笔记,视频地址为:https://www.bilibili.com/video/av62839850 执行上面的命令并不会删除所有内容( ...
- Django实现websocket完成实时通讯
一 什么是Websocket WebSocket是一种在单个TCP连接上进行全双工通信的协议 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在WebS ...
- 借用jquery实现:使浏览器的“前进”按钮功能失效
我借用jquery实现了这种效果,但并没有禁用掉浏览器本身的“前进”按钮,以下是代码,希望有用的朋友借鉴以下: $(function () { jQuery(window).bind("un ...
- IE浏览器清除缓存及历史浏览数据
IE浏览器清除缓存方法如下: 打开IE浏览器,依次点击"工具-Internet选项-常规-删除",如下图所示, 有的时候发现你明明已经执行了删除,但是实际上还是有缓存数据,一般是因 ...
- Hive Server2(五)
HiveServer2 基本概念介绍 1.HiveServer2基本介绍 HiveServer2 (HS2) is a server interface that enables remote cli ...
- cmd中subst的使用
SUBST [drive1: [drive2:]path] drive1: 指定要指派路径的虚拟驱动器.[drive2:]path 指定物理驱动器和要指派给虚拟驱动器的路径. 路径替换 ...
- 【2017 北京集训 String 改编版】子串
题意 你有一个字符串,你需要支持两种操作: 1:在字符串的末尾插入一个字符 \(c\) 2:询问当前字符串的 \([l,r]\) 子串中的不同子串个数 为了加大难度,操作会被加密(强制在线). \(n ...