Codeforce1196_D_F
D RGB Substring
题意
给定一个只含RGB三种字符的字符串,问最少修改多少个字符,能使得修改后的字符串存在一个长度为\(k\)的子串是...RGBRGB...这个循环字符串的子串。
分析
- 只含有3种字符,考虑从...RGBRGB...这个循环字符串大力枚举。
- 子串要和这个循环字符串匹配只有三种情况,即开头是RGB,GBR和BRG。
- 预处理出这三种匹配的字符匹配个数的前缀和,然后可以O(1)求出长度为k的子串对应这种匹配需要修改多少个字符,取最小值即可。
代码
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+50;
int q,n,k;
char s[N];
int dp[N][3];
char to(int x){
if(x==0){
return 'R';
}else if(x==1){
return 'G';
}else{
return 'B';
}
}
int main(void){
// freopen("in.txt","r",stdin);
scanf("%d",&q);
while(q--){
scanf("%d%d",&n,&k);
scanf("%s",s+1);
//计算三种模式匹配下,到第i位匹配字符个数的前缀
for(int i=0;i<=n;i++){
dp[i][0]=dp[i][1]=dp[i][2]=0;
}
for(int i=0;i<3;i++){
for(int j=1;j<=n;j++){
dp[j][i]=dp[j-1][i];
if(to((i+j-1+3)%3)==s[j]){
dp[j][i]++;
}
}
}
int ans=0x3f3f3f3f;
for(int i=0;i<3;i++){
for(int j=1;j+k-1<=n;j++){
ans=min(ans,k-(dp[j+k-1][i]-dp[j-1][i]));
}
}
printf("%d\n",ans);
}
return 0;
}
F K-th Path
题意
给一个带权简单无向图,求第k小的最短路。
分析
k范围很小。
所求的最短路只可能出现两种情况:
- 只含一条边的前k短路。
- 由只含一条边的前k短路组成的最短路。
因此取出前k小边,离散化后跑floyd,再排序取第k小最短路径。
注意,但只含一条边的前k短路不止k条(比如相同的边就有k+1条,边权为x),选择哪一条进行floyd关系不大,简单证明:
- 如果答案是由一条边组成的,选哪一条答案都一样是x。
- 如果答案由多条边组成,那么答案肯定小于x,因为单条边的x就不止k个了,而小于x的又由多条边组成的,那么肯定是由小于x的单条边来组成,和x相同的边没有关系。
代码
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+50;
//400条边离散化会有800个点
const int M=1005;
typedef long long ll;
struct es{
int u,v,w;
bool operator <(const es& rhs)const{
return w<rhs.w;
}
}es[N];
int n,m,k;
map<int,int> mp;
ll dis[M][M];
int main(void){
// freopen("in.txt","r",stdin);
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&es[i].u,&es[i].v,&es[i].w);
}
sort(es+1,es+1+m);
//取出前k小的边
for(int i=1;i<M;i++){
for(int j=1;j<M;j++){
dis[i][j]=dis[j][i]=1e18;
if(i==j){
dis[i][j]=0;
}
}
}
int cnt=0;
for(int i=1;i<=k;i++){
if(mp.count(es[i].u)==0){
mp[es[i].u]=++cnt;
}
if(mp.count(es[i].v)==0){
mp[es[i].v]=++cnt;
}
dis[mp[es[i].u]][mp[es[i].v]]=dis[mp[es[i].v]][mp[es[i].u]]=1ll*es[i].w;
}
for(int a=1;a<=cnt;a++){
for(int i=1;i<=cnt;i++){
for(int j=1;j<=cnt;j++){
dis[i][j]=min(dis[i][j],dis[i][a]+dis[a][j]);
}
}
}
vector<ll> ans;
for(int i=1;i<=cnt;i++){
for(int j=i+1;j<=cnt;j++){
ans.push_back(dis[i][j]);
}
}
sort(ans.begin(),ans.end());
printf("%lld\n",ans[k-1]);
return 0;
}
Codeforce1196_D_F的更多相关文章
- 表格控件表头栏目(Column)与数据表头步
不用手工增加栏目的列,也就是Column,由数据库的查询结果自动创建. 用的是Delphi2010,安装了Dev,用CxGrid显示数据库查询结果.用什么控件没有关键,道理相同的.
随机推荐
- ES6非常棒的特性-解构
https://blog.csdn.net/maoxunxing/article/details/79772946
- The 10 Statistical Techniques Data Scientists Need to Master
原文 就我个人所知有太多的软件工程师尝试转行到数据科学家而盲目地使用机器学习框架来处理数据,例如,TensorFlow或者Apache Spark,但是对于这些框架背后的统计理论没有完全的理解.所以提 ...
- @ControllerAdvice 全局异常处理
使用@ControllerAdvice 定义 全局异常处理 package com.app; import java.io.IOException; import java.io.PrintWrite ...
- Docker—备份、恢复及迁移
用容器生成镜像 [root@git docker]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e950a988d ...
- spark 笔记 7: DAGScheduler
在前面的sparkContex和RDD都可以看到,真正的计算工作都是同过调用DAGScheduler的runjob方法来实现的.这是一个很重要的类.在看这个类实现之前,需要对actor模式有一点了解: ...
- java.net.BindException: Problem binding to [node2:45454] java.net.BindException: Cannot assign requested address
主要原因是网络的问题.可参考官方给出的详细解释. http://wiki.apache.org/hadoop/BindException 总之,这是网络或者配置网络的问题,跟 hadoop 基本没有关 ...
- DeepFaceLab:视频中有多人,仅替换特定人脸的方法!
DeepFaceLab自带的视频素材,一个是钢铁侠托尼斯塔克,一个是变形金刚男主角山姆.每一个视频中只有一个人.所以当你第一次玩的时候很顺畅,什么都不用管,一步一步按教程来就好好了. 直到有一天你 ...
- Netem参数说明
Netem参数说明 本文主要内容来自Linux基金会Wiki网站Netem文档,点击这里访问原文 netem通过模拟广域网的特性为测试协议提供网络仿真功能.当前版本模拟可变延迟,丢失,重复和重新排序. ...
- 【flask】表单-上传文件
依赖: flask-wtf upload_case.html <!DOCTYPE html> <html lang="en"> <head> & ...
- 微信小程序---选择图片和调用微信拍照
1.实现点击头像按钮实现选择图片或者拍照,将图片重新设置成头像: //index.js //获取应用实例 var app = getApp() Page({ data: { motto: 'Hello ...