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 ...
随机推荐
- 全局唯一性ID生成方法小结
全局ID通常要满足分片的一些要求:1 不能有单点故障.2 以时间为序,或者ID里包含时间.这样一是可以少一个索引,二是冷热数据容易分离.3 可以控制ShardingId.比如某一个用户的文章要放在同一 ...
- Codeforces_449B 最短路+统计
也是给这个题目跪了一天...时间不多了,也不多讲 首先要用 nlogn的优先队列dijstla来求最短路,n^2的会超时,不过发现SPFA好像也可以过,他的复杂度应该介于NlogN和N^2之间. 然后 ...
- idea以yarn-client 提交任务到yarn
鉴于很多小白经常问我如何用idea提交任务到yarn,这样测试的时候不用频繁打包. 昨天,晚上健身回来录了一个小视频,说是小视频但是耗时也比较长,将近40min.可能是健身脱水太多,忘了补充盐分,无力 ...
- 寒假day20
今天解决了部分信息爬取不下来的问题
- spring装配bean的三种方式及其混合装配
在spring容器中装配bean有三种基本方式和混合装配方式: 隐式的bean自动发现机制和自动装配 在java中进行显式配置 在xml中配置 混合装配(在多个java文件中配置.在JavaConfi ...
- 14. react 基础 redux 的编写 TodoList 功能
1. 安装 redux 监听工具 ( 需要翻墙 ) 打开 谷歌商店 搜索 redux devtool 安装第一个即可 2. 安装 redux yarn add redux 3. 创建 一个 store ...
- tensorflow 分布式训练
TF实现分布式流程 1.创建集群 ClusterSpec & Server cluster = tf.train.ClusterSpec({"ps": ps_hosts, ...
- @Autowired的几个使用细节
1.使用@Autowired的当前类也必须由spring容器托管(打@Coponent.@Controller.@Service .@repository) 2.不管是public 和 privat ...
- while read line do done < file
zzx@zzx120:~/test1$ cat file.txt 1122zzx@zzx120:~/test1$ cat ./read.sh #!/bin/bashwhile read line ...
- 信号分析——从傅里叶变化到FFT
我们眼中的世界就像皮影戏的大幕布,幕布的后面有无数的齿轮,大齿轮带动小齿轮,小齿轮再带动更小的. 在最外面的小齿轮上有一个小人——那就是我们自己. 我们只看到这个小人毫无规律的在幕布前表演,却无法预测 ...