Codeforces Round #600 (Div. 2)E F
题:https://codeforces.com/contest/1253/problem/E
题意:给定n个信号源,俩个参数x和s,x代表这个信号源的位置,s代表这个信号源的波及长度,即这个信号源可以遍及[x-s,x+s]范围,然后你可以消耗一个代价来换取某个信号源的s加1,
给定m,问信号覆盖1到m所有数的最小代价是什么
分析:考虑dp[i]:表示[i+1,m]被覆盖所要花费的最小代价,dp[0]就是答案,枚举[0,m-1],从后往前枚举,若i+1在某个初始范围里面则dp[i]=dp[i+1],否则
就枚举在i位置后面的信号源 ,然后贪心取dp+cost的最小值
#include<bits/stdc++.h>
using namespace std;
const int M=2e5+;
typedef long long ll;
struct node{
int x,s;
bool operator <(const node &b)const{
return x<b.x;
}
}a[];
int dp[M];
map<int,int>mp;
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)
scanf("%d%d",&a[i].x,&a[i].s); sort(a,a+n);
dp[m]=;
for(int i=;i<m;i++)
dp[i]=m-i;
for(int i=m-;i>=;i--){
for(int j=;j<n;j++){
int l=max(,a[j].x-a[j].s);
int r=min(m,a[j].x+a[j].s);
if(l<=i+&&i+<=r){
dp[i]=dp[i+];
break;
}
if(i<l){
int dis=(l-i)-;
int RR=min(m,r+dis);
dp[i]=min(dp[i],dis+dp[RR]);
}
} }
printf("%d\n",dp[]);
return ;
}
F:https://codeforces.com/contest/1253/problem/F
分析:题目给定的起点和终点总是充电站,所以要保证机器人要可以走到最近的充电站且从充电站返回的时候不能减少电量(其实这俩个要求是一样的)
充电站到普通点最近,我们考虑做这些充电站的多源最短路,然后就可以找出普通点到最近充电站的距离,在这里我们定义为d[u]。
我们假设x为机器人到u点还剩的电量,机器人的容量为c,显然x要大于等于d[u](因为终点肯定是充电站,所以点u走到最近的充电站无疑是个正确的贪心策略)得到条件:x>=d[u](x<=c-d[u])),且x=c-d[u]
然后我们考虑俩个一般点u,v,之间的消耗为w,那么要满足x-w>=d[v],因为u到达v后要保证v在达到终点充电站前还可以走向最近的充电站,带入上面分析的x,得(c-d[u])-w>=d[v],即d[u]+d[v]+w<=c;
因此我们新建一个图,要求最小容量,那么在u,v之间建一条d[u]+d[v]+w边权的边,那么题目的问题就转化为找a到b路径中权值最大的边(这里的权值是新的边权)
因为这里我们要找最小的满足机器人可走容量,也就是说是在尽量小的条件下挑出最大值,这就和MST的很像了。
因为有多个询问,所以暴力一下在MST中们开个对每一点开一个set,记录经过并查集处理后在这个集合中的点,然后当前找到的w,若查询到在这俩个集合中,那么这就是我们上面分析要的答案了
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define dep(i,a,b) for(int i=(a);i>=(b);--i)
#define pb push_back
#define pii pair<int,int>
typedef long long ll;
const int maxn=(int)1e5+;
const int mod=(int)1e9+;
const ll INF=(ll)1ll<<;
int n,m,k,q,fa[maxn];
ll dis[maxn],ans[maxn*];
vector<pair<int,ll> > g[maxn*];
vector<pii> que[maxn];
vector<tuple<ll,int,int> > e;
set<int> ele[maxn];
void dij(){
priority_queue<pair<ll,int> > Q;
rep(i,,n){
if(i<=k) Q.push({,i});
else dis[i]=INF;
}
while(!Q.empty()){
int u=Q.top().second;Q.pop();
for(auto [v,w]:g[u]){
if(dis[u]+w<dis[v]){
dis[v]=dis[u]+w;
Q.push({-dis[v],v});
}
}
}
}
void init(){rep(i,,n) fa[i]=i,ele[i].insert(i);}
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
int main(){
scanf("%d%d%d%d",&n,&m,&k,&q);
rep(i,,m){
int u,v;ll w;scanf("%d%d%lld",&u,&v,&w);
g[u].pb({v,w});g[v].pb({u,w});
}
dij();
rep(u,,n) for(auto [v,w]:g[u]) if(u<v) e.pb({dis[u]+dis[v]+w,u,v});
sort(e.begin(),e.end());
rep(i,,q){
int u,v;scanf("%d%d",&u,&v);
que[u].pb({v,i});que[v].pb({u,i});
}
init();
for(auto [w,x,y]:e){
x=find(x);y=find(y);
if(x==y) continue;
if(ele[x].size()<ele[y].size()) swap(x,y);降低时间复杂度而已
fa[y]=x;
for(auto u:ele[y]) for(auto [v,id]:que[u]) if(ele[x].count(v)) ans[id]=w;
for(auto u:ele[y]) ele[x].insert(u);
}
rep(i,,q) printf("%lld\n",ans[i]);
}
Codeforces Round #600 (Div. 2)E F的更多相关文章
- Codeforces Round #600 (Div. 2) E. Antenna Coverage
Codeforces Round #600 (Div. 2) E. Antenna Coverage(dp) 题目链接 题意: m个Antenna,每个Antenna的位置是\(x_i\),分数是\( ...
- 【cf比赛记录】Codeforces Round #600 (Div. 2)
Codeforces Round #600 (Div. 2) ---- 比赛传送门 昨晚成绩还好,AC A,B题,还能上分(到底有多菜) 补了C.D题,因为昨晚对C.D题已经有想法了,所以补起题来也快 ...
- Codeforces Round #573 (Div. 1) 差F
Codeforces Round #573 (Div. 1) E 题意:二维平面上有 n 个点,你可以放至多 m 条直线使得 (0,0) 与每个点的连线至少与一条直线相交.求原点与所有直线的距离最小值 ...
- Codeforces Round #541 (Div. 2) (A~F)
目录 Codeforces 1131 A.Sea Battle B.Draw! C.Birthday D.Gourmet choice(拓扑排序) E.String Multiplication(思路 ...
- Codeforces Round #532 (Div. 2):F. Ivan and Burgers(贪心+异或基)
F. Ivan and Burgers 题目链接:https://codeforces.com/contest/1100/problem/F 题意: 给出n个数,然后有多个询问,每次回答询问所给出的区 ...
- Codeforces Round #346 (Div. 2) E F
因为很久没有个人认真做题了 昨天晚上开了场虚拟cf来锻炼个人手速 选的是第一次做cf的场 那时候7出3还被hack...之后也没补题 这次做的时候顺便回忆了一下以前比赛的时候是怎么想的 发现经验还是很 ...
- Codeforces Round #322 (Div. 2) E F
E. Kojiro and Furrari 题意说的是 在一条直线上 有n个加油站, 每加一单位体积的汽油 可以走1km 然后每个加油站只有一种类型的汽油,汽油的种类有3种 求从起点出发到达终点要求使 ...
- Codeforces Round #506 (Div. 3) 1029 F. Multicolored Markers
CF-1029F 题意: a,b个小正方形构造一个矩形,大小为(a+b),并且要求其中要么a个小正方形是矩形,要么b个小正方形是矩形. 思路: 之前在想要分a,b是否为奇数讨论,后来发现根本不需要.只 ...
- Codeforces Round #600 (Div. 2)
传送门 A. Single Push 直接乱搞即可. Code /* * Author: heyuhhh * Created Time: 2019/11/16 22:36:20 */ #include ...
随机推荐
- Kali桥接模式下配置静态ip
以管理员身份运行虚拟机 打开控制面板-->网络和Internet-->更改适配器 再在虚拟机处桥接到这个WLAN2 点击 编辑-->编辑虚拟网卡 没有网卡就点上图的添加网络作为桥接网 ...
- docker-compose 安装 mongodb
1. 修改 docker-compose.yml version: "2.1" services: php7.1: build: ./php image: php7.1-ext p ...
- Linux系统中的变量PATH
PATH 作用 在Linux安装一些可执行文件通常要添加路径环境变量PATH,PATH环境变量通俗的讲就是把程序的路径"备案"到系统中,这样执行这些程序时就不需要输入完整路径,直接 ...
- php添加openssl扩展
很多时候都会用到openssl组件,下面就介绍一下linux下php安装openssl扩展: 安 装openssl组件,一般php安装目录中都有许多扩展组件的安装包,当然也包括openssl,例如我的 ...
- 送票啦~ | 京东云邀您参加AI顶级盛会GTC CHINA 2019
本年度不可错过的AI顶级盛会 GTC CHINA2019 即将于12月16–19日在苏州举行 京东云重量级技术专家将携 AI前沿热议话题亮相 京东云相关AI最新动态,也会一并为您带上 小小剧透,快来看 ...
- 201612-2 工资计算 Java
思路: 税+税后所得A=税前工资S. 因为工资是整百的数,每次减100来判断.好理解但是超时. import java.util.Scanner; //只有90分,超时了 public class M ...
- python笔记(很乱)、打算抽个时间再好好整理
最近刚开始学python.总结的可能不是很好 print:打印值 input:可以进行等候赋值.进行一个交互 python中 需要两个==才为判断 变量:数字.字母.下划线组成 类型:int整数.st ...
- 吴裕雄--天生自然MySQL学习笔记:MySQL 事务
MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成 ...
- 吴裕雄--天生自然 PHP开发学习:Switch 语句
<?php $favcolor="red"; switch ($favcolor) { case "red": echo "你喜欢的颜色是红色! ...
- PAT Advanced 1123 Is It a Complete AVL Tree (30) [AVL树]
题目 An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child ...