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 ...
随机推荐
- C语言预处理理论2
C语言预处理理论1.头文件包含(1)#include <>和#include ""区别:<>专门用来包含系统提供的头文件(就是系统自带的,不是程序员自己写的 ...
- Day1-T3
原题目 Describe:两个限制条件,求第三属性的最大和 code: #pragma GCC optimize(2) #include<bits/stdc++.h> using name ...
- idea导入新项目后右键main方法没有Run xxx.main()
刚安装的idea2019.1,基本上没有什么配置.导入从github clone下来的工程.鼠标右键main方法时没有发现 run 选项,如下图所示: 这里是配置有问题造成的,对比下正常的工程,可以发 ...
- Spring Boot without the web server
https://stackoverflow.com/questions/26105061/spring-boot-without-the-web-server/28565277 1. spring.m ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 存储类
存储类定义 C++ 程序中变量/函数的范围(可见性)和生命周期.这些说明符放置在它们所修饰的类型之前.下面列出 C++ 程序中可用的存储类: auto register static extern m ...
- css3 实现渐变边框
(1)一个渐变的底边线border:1px solid transparent;border-image: -webkit-linear-gradient(right, #FF9848,#FF2A2B ...
- StringBuffer和StringBuilder类
对字符串进行修改的时候,需要使用StringBuffer和StringBuilder类(String类是不可改变的,一旦创建了String对象,那它的值就无法改变了). 和String类不同的是,St ...
- springboot 启动时加载数据库数据到本地Map
InitDataConfig.java import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Dict; impo ...
- VMWare WorkStation15--Win10下开机启动虚拟机
参考 https://www.cnblogs.com/qmfsun/p/6284236.html http://www.cnblogs.com/eliteboy/p/7838091.html VMWa ...
- IDEA--IDEA配置web项目
参考:https://blog.csdn.net/kfm1376822651/article/details/79666586 记学习springmvc时,使用idea部署web项目至tomcat. ...