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

  1. 表格控件表头栏目(Column)与数据表头步

    不用手工增加栏目的列,也就是Column,由数据库的查询结果自动创建. 用的是Delphi2010,安装了Dev,用CxGrid显示数据库查询结果.用什么控件没有关键,道理相同的.

随机推荐

  1. 使用word2vec对中文维基百科数据进行处理

    一.下载中文维基百科数据https://dumps.wikimedia.org/zhwiki/并使用gensim中的wikicorpus解析提取xml中的内容 二.利用opencc繁体转简体 三.利用 ...

  2. BZOJ 5326 [JSOI2017]博弈 (模拟费用流、线段树)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=5326 题解 终于成为第8个A掉这题的人--orz tzw神仙早我6小时 本以为这东西常数 ...

  3. windows 安装使用 Memcached

    Windows无官方版本:下载地址http://static.runoob.com/download/memcached-win64-1.4.4-14.zip 安装: 1.解压下载的压缩包2.命令行模 ...

  4. linux pwd指令的C实现

    linux pwd指令的C实现 pwd指令的功能介绍 linux pwd命令用于显示工作目录 执行pwd命令可立刻得知当前所在工作目录的绝对路径名称. 示例: 查询系统手册 如图所示,getcwd的描 ...

  5. CentOS 6.4编译安装和部署Zabbix 2.0版本监控(中文)

    [一].zabbix简介 zabbix是一个基于web界面的提供分布式系统监视以及网络监视功能的企业级开元解决方案 zabbix由2部分构成,zabbix_server和可选组件zabbix_agen ...

  6. 下载excle文件之工具

    创建万能的工具类,已备用 ExcelData.java 存放文件数据 package com.ulic.gis.dataCenter.util; import java.io.Serializable ...

  7. 【7】解决:移动端点击a链接出现蓝色边框

    [1]_blank : 浏览器总在一个新打开.未命名的窗口中载入目标文档. [2]title :  鼠标悬浮显示的文字. [3]href : 跳转到哪个链接.     a{    border: no ...

  8. 在 vue 中用 transition 实现轮播效果

    概述 今天我接到一个需求:轮播效果.本来我是打算使用 Swiper 实现的,但是想起来貌似 transition 也能实现.于是就试了下,真的可以,还挺简单的,于是就记录下来,供以后开发时参考,相信对 ...

  9. 阶段3 2.Spring_06.Spring的新注解_3 AnnotationConfigApplicationContext的使用

    目前这个配置文件除了导约束就没有其他的内容了. 删除这个bean.xml文件 但是测试类里面还是读取的xml的信息 注解 查看ApplicationContext的 关系图 查看实现类的实现类 之前我 ...

  10. python之openpyxl生成excel文件

    项目需要,需要自动生成PDF测试报告.经过对比之后,选择使用了reportlab模块. 项目背景:开发一个测试平台,供测试维护测试用例,执行测试用例,并且生成测试报告(包含PDF和excel),将生成 ...