CF 360E Levko and Game——贪心
题目:http://codeforces.com/contest/360/problem/E
官方题解与证明:http://codeforces.com/blog/entry/9529
一条可以调整的边的边权要么是 l [ i ] 要么是 r[ i ] 。
先把所有可调整边设成 r[ i ] ,然后看看有没有一条可调整的边 (x,y)满足 dis1[x]<=dis2[x] 且其边权还是 r[ i ];如果有,就把它改成 l [ i ]。
改完一条边之后就再做一遍 dij( ) ,然后再改;直到没有可改的边。
其实每次可以不止改一条边,可以把能改的边都改了。因为据证明,一条边 (x,y) 如果 dis1[x]<=dis2[x] ,不会在之后某次修改别的边的时候变成 dis1[x]>dis2[x] 了;所以一旦能改,就一直能改,所以一次改很多能改的边也是可以的。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
using namespace std;
const int N=1e4+,M=;
int n,m,t,hd[N],xnt,bh[M],l[M],r[M],s1,s2,F;
ll dis1[N],dis2[N];bool vis[N],ans[M];
priority_queue<pair<ll,int> > q;
struct Ed{
int x,to,nxt,w;
Ed(int f=,int a=,int b=,int c=):x(f),to(a),nxt(b),w(c) {}
}ed[N+M];
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
void add(int x,int y,int z){ed[++xnt]=Ed(x,y,hd[x],z);hd[x]=xnt;}
void dj()
{
memset(dis1,0x3f,sizeof dis1);dis1[s1]=;
memset(vis,,sizeof vis);
q.push(make_pair(,s1));
while(q.size())
{
int k=q.top().second;q.pop();
if(vis[k])continue;vis[k]=;
for(int i=hd[k],v;i;i=ed[i].nxt)
if(dis1[v=ed[i].to]>dis1[k]+ed[i].w)
dis1[v]=dis1[k]+ed[i].w,q.push(make_pair(-dis1[v],v));
}
memset(dis2,0x3f,sizeof dis2);dis2[s2]=;
memset(vis,,sizeof vis);
q.push(make_pair(,s2));
while(q.size())
{
int k=q.top().second;q.pop();
if(vis[k])continue;vis[k]=;
for(int i=hd[k],v;i;i=ed[i].nxt)
if(dis2[v=ed[i].to]>dis2[k]+ed[i].w)
dis2[v]=dis2[k]+ed[i].w,q.push(make_pair(-dis2[v],v));
}
}
int main()
{
n=rdn();m=rdn();t=rdn();
s1=rdn();s2=rdn();F=rdn();
for(int i=,u,v,z;i<=m;i++)
u=rdn(),v=rdn(),z=rdn(),add(u,v,z);
for(int i=,u,v;i<=t;i++)
{
u=rdn();v=rdn();l[i]=rdn();r[i]=rdn();
add(u,v,r[i]); bh[i]=xnt;
}
bool flag;
while()
{
dj();flag=;
for(int i=,d;i<=t;i++)
{
d=bh[i];
if(ed[d].w==l[i]||dis1[ed[d].x]>dis2[ed[d].x])continue;
ed[d].w=l[i];ans[i]=;flag=;
}
if(!flag)break;
}
dj();
if(dis1[F]>dis2[F]){puts("LOSE");return ;}
if(dis1[F]==dis2[F])puts("DRAW"); else puts("WIN");
for(int i=;i<=t;i++)printf("%d ",ans[i]?l[i]:r[i]);puts("");
return ;
}
CF 360E Levko and Game——贪心的更多相关文章
- CF 360 E Levko and Game —— 贪心+最短路
题目:http://codeforces.com/contest/360/problem/E 首先,每条边不是选 \( l[i] \) 就是选 \( r[i] \): 做法就是先把边权都设成 \( r ...
- CF #374 (Div. 2) D. 贪心,优先队列或set
1.CF #374 (Div. 2) D. Maxim and Array 2.总结:按绝对值最小贪心下去即可 3.题意:对n个数进行+x或-x的k次操作,要使操作之后的n个数乘积最小. (1)优 ...
- CF 435B Pasha Maximizes(贪心)
题目链接: [传送门][1] Pasha Maximizes time limit per test:1 second memory limit per test:256 megabytes ...
- [CF #288-C] Anya and Ghosts (贪心)
题目链接:http://codeforces.com/contest/508/problem/C 题目大意:给你三个数,m,t,r,代表晚上有m个幽灵,我有无限支蜡烛,每支蜡烛能够亮t秒,房间需要r支 ...
- cf 605A Sorting Railway Cars 贪心 简单题
其实就是求总长度 - 一个最长“连续”自序列的长度 最长“连续”自序列即一个最长的lis,并且这个lis的值刚好是连续的,比如4,5,6... 遍历一遍,贪心就是了 遍历到第i个时,此时值为a[i], ...
- CF D. Walking Between Houses (贪心)
题意: 现在有n个房子排成一列,编号为1~n,起初你在第1个房子里,现在你要进行k次移动,每次移动一都可以从一个房子i移动到另外一个其他的房子j里(i != j),移动的距离为|j - i|.问你进过 ...
- CodeForces 360E Levko and Game(Codeforces Round #210 (Div. 1))
题意:有一些无向边m条权值是给定的k条权值在[l,r]区间可以由你来定,一个点s1 出发一个从s2出发 问s1 出发的能不能先打到f 思路:最短路. 首先检测能不能赢 在更新的时候 如果对于一条边 ...
- CF:322D - Ciel and Duel 贪心 或者 DP 我用的贪心 。。难道sort跟qsort是不一样的么?
D. Ciel and Duel time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- cf D. Levko and Array
http://codeforces.com/contest/361/problem/D 用二分搜索相邻两个数的差的绝对值,然后用dp记录数改变的次数.dp[i]表示在i之前改变的次数,如果|a[i]- ...
随机推荐
- Tomcat中session共享问题的简单解决办法
tomcat-redis-session-manager 使用redis配置tomcat共享session 结构图: 分析: 分布式web server集群部署后需要实现session共享,针对 to ...
- su | sudo su | sudo -i
su <user> <user> <user> 需要输入user的密码,该命令改变user id,执行过后,以<user>中定义的用户运行shell,就 ...
- MySQL的登陆错误:ERROR 1049 (42000): Unknown database 'root'
当初刚装MySQL的时候,到网上查的命令行登陆MySQL的方法都是mysql -u root -p password mysql -r root -p 123456 但是奇怪的是这条命令我输进去死活都 ...
- NPOI:初次操作(新建Excel)
1. 由于在某些电脑上没有安装office,或者有权限限制,使用COM组件进行读写Excel的话会出现问题, 为此,NPOI是一个很好的选择,NPOI可以在上述环境中满足Office的操作需求,并且功 ...
- SQL基础整理(事务)
事务==流程控制 确保流程只能成功或者失败,若出现错误会自动回到原点 具体的实现代码如下: begin tran insert into student values(') goto tranroll ...
- nfs的简单搭建与原理
nfs最大的缺点是单点,只能一对一nfs统称存储服务器,放视频图片之类的东西,所以服务器的容量很大数字都是放在数据库里边的, nfs的挂载原理 客户端怎么知道服务端的开启端口? 找rpcbind,再启 ...
- bzoj1800
题解: 暴力枚举,然后判断是否是矩形 代码: #include<iostream> #include<cstdio> using namespace std; ],dis[]; ...
- vue项目使用vux框架配置教程
吐槽下,这个vux配置教程那..写的实在是坑,也不搞个示例代码...想上天吗???? 正常安装的话...100%报错...以下是正确配置 1.项目里安装vux npm install vux -- ...
- kibana安装
kibana,ELK中的K,主要为ES提供界面化操作,据说还是比较炫的,今天安装5.5.2版本进行尝试一把. 安装过程不难,简单的配置了一下端口和IP即可,难度不大. config下的kibana.y ...
- Flask-WTF表单
Web表单 Web 表单是 Web 应用程序的基本功能. 它是HTML页面中负责数据采集的部件.表单有三个部分组成:表单标签.表单域.表单按钮.表单允许用户输入数据,负责HTML页面数据采集,通过表单 ...