题: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的更多相关文章

  1. Codeforces Round #600 (Div. 2) E. Antenna Coverage

    Codeforces Round #600 (Div. 2) E. Antenna Coverage(dp) 题目链接 题意: m个Antenna,每个Antenna的位置是\(x_i\),分数是\( ...

  2. 【cf比赛记录】Codeforces Round #600 (Div. 2)

    Codeforces Round #600 (Div. 2) ---- 比赛传送门 昨晚成绩还好,AC A,B题,还能上分(到底有多菜) 补了C.D题,因为昨晚对C.D题已经有想法了,所以补起题来也快 ...

  3. Codeforces Round #573 (Div. 1) 差F

    Codeforces Round #573 (Div. 1) E 题意:二维平面上有 n 个点,你可以放至多 m 条直线使得 (0,0) 与每个点的连线至少与一条直线相交.求原点与所有直线的距离最小值 ...

  4. Codeforces Round #541 (Div. 2) (A~F)

    目录 Codeforces 1131 A.Sea Battle B.Draw! C.Birthday D.Gourmet choice(拓扑排序) E.String Multiplication(思路 ...

  5. Codeforces Round #532 (Div. 2):F. Ivan and Burgers(贪心+异或基)

    F. Ivan and Burgers 题目链接:https://codeforces.com/contest/1100/problem/F 题意: 给出n个数,然后有多个询问,每次回答询问所给出的区 ...

  6. Codeforces Round #346 (Div. 2) E F

    因为很久没有个人认真做题了 昨天晚上开了场虚拟cf来锻炼个人手速 选的是第一次做cf的场 那时候7出3还被hack...之后也没补题 这次做的时候顺便回忆了一下以前比赛的时候是怎么想的 发现经验还是很 ...

  7. Codeforces Round #322 (Div. 2) E F

    E. Kojiro and Furrari 题意说的是 在一条直线上 有n个加油站, 每加一单位体积的汽油 可以走1km 然后每个加油站只有一种类型的汽油,汽油的种类有3种 求从起点出发到达终点要求使 ...

  8. Codeforces Round #506 (Div. 3) 1029 F. Multicolored Markers

    CF-1029F 题意: a,b个小正方形构造一个矩形,大小为(a+b),并且要求其中要么a个小正方形是矩形,要么b个小正方形是矩形. 思路: 之前在想要分a,b是否为奇数讨论,后来发现根本不需要.只 ...

  9. Codeforces Round #600 (Div. 2)

    传送门 A. Single Push 直接乱搞即可. Code /* * Author: heyuhhh * Created Time: 2019/11/16 22:36:20 */ #include ...

随机推荐

  1. Toolbar中系统自带返回键(setDisplayHomeAsUpEnabled)与Toolbar本身的inflateMenu冲突问题

    在APP的Toolbar中可以设置inflateMenu来添加右上角菜单栏,但是我又同时想用系统自带的左侧返回键,随之也产生了问题:右上角的inflateMenu会不生效,即不会产生菜单按钮,查阅资料 ...

  2. 使用DOM4J生成XML文档

    package xml; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; imp ...

  3. 把a表格的内容读取出来,然后写到b表格

    把a表格的内容读取出来,然后写到b表格 #!/usr/bin/env python3 import sys #控制台要输入的两个参数格式为:python script_name.py 参数1 参数2 ...

  4. Java基础查漏补缺(1)

    Java基础查漏补缺 String str2 = "hello"; String str3 = "hello"; System.out.println(str3 ...

  5. [SDOI2016]游戏(树剖+李超树)

    趁着我把李超树忘个一干二净的时候来复习一下吧,毕竟马上NOI了. 题解:看着那个dis就很不爽,直接把它转换成深度问题,然后一条直线x->y,假设其lca为z,可以拆分成x->z和z-&g ...

  6. OpenStack(四)——使用Kolla部署OpenStack多节点云

    (1).实验环境 主机名 IP地址 角色 内存 网卡 CPU 磁盘 OpenStack-con 192.168.128.110 controller(控制) 8G 桥接网卡ens32和ens33 4核 ...

  7. 直击JDD | 京东技术全景图首次展示 四大重磅智能技术驱动产业未来!

    11月19日,主题为"突破与裂变"的2019京东全球科技探索者大会(JDDiscovery)在京盛大开幕,京东集团展示了完整的技术布局与先进而丰富的对外技术服务,对外明确诠释了&q ...

  8. mint linux的几个问题

    刚开机登录时, 键盘不停的输入同一个字符 发现在虚拟机里安装的系统没有问题, 因此怀疑配置有冲突, 新建一个用户果然能解决问题 解决方法: 把 主目录下, 隐藏的配置目录删除, 重新登录后再配置. 4 ...

  9. 7)给tab下面添加一个子非模态对话框

    1)还是沿袭(6)那个代码 2)下面是步骤: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~·~~~~~~~~~~~~~~~~~~~~~~~~~~~ 然后,修改这个对 ...

  10. Thread--volatile详细