【codeforces】 ZeptoLab Code Rush 2015 A,B,C,D,E题解

2023-11-17

D E统统FST...

差一点就飞升了...

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

A.King of Thieves

给你一张地图,让你从某个*开始跳等步长的四次。如果均在*则输出yes,否则输出no


枚举起始点和步长直接做就可以了

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

B.Om Nom and Dark Park

给你一棵满二叉树。每条边上有路灯。要求从根走到叶子节点经过的路灯数相同。问最少添加几盏路灯


这题我们可以递归处理。每次让两棵子树的路径灯数相同就可以了

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

C.Om Nom and Candies

有两种糖。质量分别为wr,wb。快乐度分别为hr,hb

你只能吃总质量不超过c的糖,问你最多可以获得多少快乐的


【absi:这题不就是乱搞么】

首先看到数据范围。我们可以想到肯定要多选h/w大的那一个。那么就可以贪心选把c缩小很多

然后缩到多小呢。缩小到wr*wb就可以了

然后我们枚举wr和wb中大的那一个。更新ans即可

最后枚举部分的复杂度是sqrt(c)所以完全无压力

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

D.Om Nom and Necklace

给你一个字符串,要你输出从1到i可否表示成k个AB+一个A的形式。1到n均有询问


我们可以枚举AB的长度,然后倍增判断是否可以复制n段。最后那个A直接hash和开头比较就可以了。二分A的长度看看最长是多少然后那一段都+1即可

也可以用KMP的next数组辅助判定(如下面那段Loriex的程序)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

E.Transmitting Levels

给你一个环,q个询问。每次询问把环分成不超过bi的若干段【若单个数大于bi则这个数可以单独一段】。问最少可以分成几段


先把整个数组复制到后面一遍断环。每次处理next[i]表示从i开始最远延伸到next[i]使得这段不超过bi。扫一遍即可求出

然后从n到1扫一遍。fx表示需要多少段,fl表示最后一段延伸到哪里。fx[i]=fx[next[i]]+1 fl[next[i]]=max(fl[next[i]],next[i])

然后枚举起点。在判断一下终止节点是否在起点前面然后把ans加1或者不加就可以了

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

code:

A.King of Thieves

#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int a[1001];
int main()
{
	 int n;
	 scanf("%d",&n);
	 string x;
	 cin>>x;
	 int i;
	 for(i=1;i<=n;i++)
	 {
	      if(x[i-1]=='.')
	           a[i]=0;
	      else
	           a[i]=1;
	 }
	 int j,k;
	 for(i=1;i<=n;i++)
	 {
	      int s;
	      int d=i;
	      if(a[i]==0)
	           continue;
	      for(j=1;j<=n;j++)
	      {
	      	   d=i;
	      	   s=1;
	      	   for(k=1;k<=4;k++)
	      	   {
	      	   	    if(d+j>n)
	      	   	         break;
	                if(a[d+j]==0)
	                     break;
	                else
	                     s++;
	                d+=j;
	           }
	           if(s==5)
	           {
	                printf("yes\n");
	                return 0;
	           }
	      }
	 }
	 printf("no\n");
     return 0;
}


B.Om Nom and Dark Park

#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct line
{
     int s,t;
     int x;
     int next;
}a[100001];
int head[100001];
int edge;
inline void add(int s,int t,int x)
{
	 a[edge].next=head[s];
     head[s]=edge;
     a[edge].s=s;
     a[edge].t=t;
     a[edge].x=x;
}
bool v[100001];
int fx[100001];
int ans=0;
inline int absx(int x)
{
     if(x<0)
          x=-x;
     return x;
}
inline void dfs(int d)
{
	 v[d]=true;
     int i;
     for(i=head[d];i!=0;i=a[i].next)
     {
     	  int t=a[i].t;
          if(!v[t])
          {
               dfs(t);
          }
     }
     int s=0,s1=0,s2=0;
     for(i=head[d];i!=0;i=a[i].next)
     {
          int t=a[i].t;
          if(t!=d/2)
          {
               if(s==0)
               {
                    s++;
                    s1=a[i].x;
               }
               else
                    s2=a[i].x;
          }
     }
     ans+=absx(s2+fx[d*2]-(s1+fx[d*2+1]));
     fx[d]+=max(s2+fx[d*2],s1+fx[d*2+1]);
}
int main()
{
     int n;
     scanf("%d",&n);
     int i,j;
     int s=0;
     int d=1;
     int x;
     for(i=1;i<=n;i++)
     {
          for(j=1;j<=1<<i;j++)
          {
               scanf("%d",&x);
               if(s==0)
               {
                    s++;
                    edge++;
                    add(d,d*2,x);
                    edge++;
                    add(d*2,d,x);
               }
               else
               {
                    s=0;
                    edge++;
                    add(d,d*2+1,x);
                    edge++;
                    add(d*2+1,d,x);
                    d++;
               }
          }
     }
     dfs(1);
     printf("%d\n",ans);
     return 0;
}


C.Om Nom and Candies

#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
long long c,hr,hb,wr,wb;
long long ans=0;
inline void prepare()
{
    if((long long)2*wb*wr<=c)
    {
        long long t=wb*wr;
        long long t2=c/t-2;
        c=c%t+t+t;
        if(wb*hr>wr*hb)
            ans+=hr*wb*t2;
        else
            ans+=hb*wr*t2;
    }
}
int main()
{
    scanf("%I64d%I64d%I64d%I64d%I64d",&c,&hr,&hb,&wr,&wb);
    if(wr>wb)
    {
    	long long t=wr;
    	wr=wb;
    	wb=t;
    	t=hr;
    	hr=hb;
    	hb=t;
    }
    prepare();
    long long i;
    long long ansx=0;
    for(i=0;i<=c/wb;i++)
        ansx=max(ansx,ans+(c-i*wb)/wr*hr+i*hb);
    printf("%I64d\n",ansx);
    return 0;
} 


D.Om Nom and Necklace

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <set>
#include <map>
using namespace std;
#define N 1001111
#define mod1 1000000007
#define mod2 1000000009
typedef long long LL;
int geti() {
	static int res;
	static char pp;
	pp = getchar();
	while (pp < '0' || pp > '9')
		pp = getchar();
	res = 0;
	while (pp <= '9' && pp >= '0')
		res = res * 10 - '0' + pp, pp = getchar();
	return res;
}
int n, K, Next[N], tr[N], sr[N];
bool ok[N];
char p[N];
void kmp() {
	for (int i = 2; i <= n; i++) {
		int c = Next[i-1];
		while (c && p[c+1] != p[i])
			c = Next[c];
		if (!c)
			Next[i] = p[1]==p[i];
		else
			Next[i] = c + 1;
	}
}
LL power(LL a, int b) {
	LL res = 1;
	int c = b + 2;
	while (b) {
		if (b & 1) res = res * a % c;
		b >>= 1;
		a = a * a % c;
	}
	return res;
}
LL Hash1[N], Hash2[N], pow1[N], pow2[N];
LL Ha1(int l, int r) {
	return (Hash1[r] - Hash1[l-1]*pow1[r-l+1]%mod1 + mod1) % mod1;
}
LL Ha2(int l, int r) {
	return (Hash2[r] - Hash2[l-1]*pow2[r-l+1]%mod2 + mod2) % mod2;
}

int fr(int bg, int ls) {
	if (Ha1(bg + 1, bg + ls) == Hash1[ls] && Ha2(bg + 1, bg + ls) == Hash2[ls])
		return ls + 1;
	int l = 0, r = ls;
	while (l != r) {
		int mid = l + r >> 1;
		if (Ha1(bg + 1, bg + mid) == Hash1[mid] && Ha2(bg + 1, bg + mid) == Hash2[mid])
			l = mid + 1;
		else
			r = mid;
	}
	return l;
}
void pre() {
	Hash1[1] = Hash2[1] = p[1];
	pow1[1] = 3311;
	pow2[1] = 3311;
	pow1[0] = pow2[0] = 1;
	for (int i = 2; i <= n; i++) {
		Hash1[i] = (Hash1[i-1] * 3311 + p[i]) % mod1;
		Hash2[i] = (Hash2[i-1] * 3311 + p[i]) % mod2;
		pow1[i] = pow1[i-1] * 3311 % mod1;
		pow2[i] = pow2[i-1] * 3311 % mod2;
	}
}
int rc[N];
int main() {
	scanf("%d%d", &n, &K);
	if (K == 1) {
		for (int i = 1; i <= n; i++)
			printf("1");
		printf("\n");
		return 0;
	}
	scanf("%s", p + 1);
	pre();
	kmp();
	for (int i = 1; i <= n; i++) {
		sr[i] = i - Next[i];
		tr[i] = i % sr[i] == 0 ? i / sr[i] : 1;
	}
	for (int i = 1; i * K <= n; i++) {
		if (tr[i*K] % K == 0) {
			int r = fr(i * K, i);
			rc[i * K]++;
			rc[i * K + r]--;
		}
	}
	for (int i = 1; i <= n; i++)
		rc[i] += rc[i-1];
	for (int i = 1; i <= n; i++)
		printf("%d", rc[i] > 0 ? 1 : 0);
	printf("\n");
	return 0;
}


E.Transmitting Levels

#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
long long a[3000001],que[3000001];
long long b[3000001];
int next[3000001],fx[3000001],fl[3000001];
int main()
{
     int n,q;
     scanf("%d%d",&n,&q);
     int i,j;
     for(i=1;i<=n;i++)
          scanf("%I64d",&a[i]);
     for(i=n+1;i<=2*n;i++)
          a[i]=a[i-n];
     long long x;
     long long sum;
     for(i=1;i<=q;i++)
     {
     	  memset(next,0,sizeof(next));
		  memset(fx,0,sizeof(fx));
		  memset(fl,0,sizeof(fl));
          scanf("%I64d",&b[i]);
          sum=0;
          int l=0,r=1;
          l++;
          que[r]=a[1];
          sum+=a[1];
          for(j=2;j<=n*2;j++)
          {
               sum+=a[j];
               r++;
               que[r]=a[j];
               while(sum>b[i])
               {
                    next[l]=r-1;
                    sum-=a[l];
                    l++;
               }
          }
          while(l!=r)
          {
               next[l]=n*2;
               l++;
          }
          for(j=n;j>=1;j--)
          {
               fx[j]=fx[next[j]+1]+1;
               fl[j]=max(fl[next[j]+1],next[j]);
          }
          int ans=2100000000;
          for(j=1;j<=n;j++)
          {
               int xt=fx[j];
               if(fl[j]-n<j-1&&next[fl[j]-n]>=j-1)
                    xt++;
               else if(next[fl[j]-n]<j-1)
                    continue;
               ans=min(xt,ans);
          }
          printf("%d\n",ans);
     }
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【codeforces】 ZeptoLab Code Rush 2015 A,B,C,D,E题解 的相关文章

随机推荐

  • 记一次解决挖矿病毒的过程(sysupdate、networkservice)

    对于挖矿病毒 我们如何发现它呢 其实有个很显然的问题 挖矿病毒会超级占用cpu 当你发现你的服务器变的很卡的时候 这时候 可能就是挖矿病毒或者其他病毒正在攻击你的服务器 我也是有一段时间服务器变的很卡 那时我还以为是我自己的软件装太多导致的
  • sqlserver数据库 id主键自增

    CREATE TABLE Ce id INT IDENTITY ff id INT NOT NULL a VARCHAR 40 NOT NULL b VARCHAR 40 NOT NULL b VARCHAR 40 NOT NULL d V
  • 致远oa系统unix 服务器,致远oa手机客户端服务器

    致远oa手机客户端服务器 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 BoostKit ARM 嵥 致远oa手机客户端
  • 三张图搞定TCP 握手、HTTPS、TLS加密过程

    1 抓包内容 WireShark 2 搞定握手 挥手 SSL加密过程 3 消息内容 Charles 之前看到写的比较好的文章 有文字详细叙述 TLS版本差异 https zhuanlan zhihu com p 27524995 utm s
  • 3dmax森林树木植物插件 Forest Pack Pro 6.3.1

    名称 Itoo Forest Pack Pro 中文名为专业森林制作 散布工具 版本 6 3 1 支持的版本 3dmax 2014 2015 2016 2017 2018 2019 2020 2021 V Ray 1 5 SP3 SP6 V
  • (10)stata的基本使用--短面板数据处理

    面板数据处理 数据描述 数据预览 告诉计算机这是面板数据 描述变量 查看其他变量 绘图 混合回归 聚类稳健标准误 cluster后的变量表示聚类标准 表示使用以state变量聚类的聚类稳健标准误 普通稳健标准误 对比普通稳健标准误与聚类稳健
  • 树05--二叉搜索树的后序遍历序列

    树05 二叉搜索树的后序遍历序列 jz23 题目概述 解析 参考答案 注意事项 说明 题目概述 算法说明 输入一个整数数组 判断该数组是不是某二叉搜索树的后序遍历的结果 如果是则返回true 否则返回false 假设输入的数组的任意两个数字
  • 数字钟实训经历

    第一次写博客 多多关照 先说一点自己的感悟吧 我是电气工程及其自动化专业的大三学生 大一时加入了学校的电子技术协会 转眼一晃两年就这样过去了 这不暑假了还在学校准备今年的全国电子设计竞赛 在这自学单片机的两年时间里 遇到了许多疑难困惑 通过
  • linux下MMC/SD/SDIO驱动系列之四 ---- SDIO的识别与操作

    从上篇文章的最后 我们知道host在扫描卡的过程中 其识别的顺序为SDIO SD MMC 并且从它的注释可以看出 这个顺序是很重要的 那这篇文章 我们就看看SDIO的识别过程 它对应的函数就是mmc attach sdio host 函数位
  • C++笔记一(C语言基础)

    1 变量命名规则 1 1 标识符可由三类字符 字母 下划线 数字组成 标识符只能由字母或下划线开头 标识符不能具有二义性 标识符有长度要求 在起定的名字中 超出长度规定的部分将被截掉 2 部分基础数据类型 2 1 常用数据类型长度 bool
  • EXE文件打不开的解决方法

    EXE文件打不开 打开 我的电脑 或随便一个文件夹 点击菜单 工具 选择 文件夹选项 选择 文件类型 中的 新建 新建扩展名 EXE 单击 高级 关联的文件类型 中选择 应用程序 在命令提示符 cmd 在 开始 菜单 所有程序 的 附件 中
  • C和C++打印指针值和地址

    1 C 中指针变量的地址和指针变量的值是两个不同的概念 指针变量的地址 这是指针变量这个变量在内存中的存储地址 如图所示0x1211 指针的值 里面存放的是一个地址 此地址即为指向的内存单元的地址 如图所示0x1101 2 假如要输出指针变
  • IntelliJ IDEA安装教程,三分钟手把手教会,非常简单!

    使用IntelliJ IDEA写java程序需要配置jdk 链接 JDK安装教程 一 IntelliJ IDEA下载 1 进入官网 官网地址 https www jetbrains com 2 点击 Developer Tools 开发者工
  • jQuery遍历之next()、nextAll()方法使用实例

    jquery遍历 next 和nextAll 方法 实例如下 复制代码 代码如下
  • element踩坑之el-select中的placeholder属性不显示

    直接上图 咱想要这种效果 但现实却给了这种效果 明明ui代码一模一样
  • 编译freeRTOS “error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token”错误解决

    今日编译ESP8266 RTOS SDK的时候有个头文件声明了extern 结构体 结果一旦加入这个头文件编译就各种报错 提示error expected asm or attribute before token 一通搜索之后并未解决我的
  • IDEA的好用小工具Test RESTful web Service

    Test RESTful web Service 一 2021版IDEA界面 二 2019版 我安了个插件叫Old REST Client来还原这个样子 三 代码demo示例 补充 好处 可以减少postman的使用 简单的可以用这个 脚本
  • 【C语言】详解getchar函数该如何使用

    目录 getchar函数 getchar函数的声明 getchar函数返回值问题 getchar函数的无法返回字符串的情况 输出通过getchar函数获得的一个字符 getchar函数的进一步使用 最后这里给大家推荐一个库函数的网站 Ref
  • 浪潮nf5180m5服务器安装系统,NF5180M5-IPMI设置

    登录 默认用户名需注意 用户名 admin 密码 admin 主页面 Web 界面分为四个部分 如下图所示 界面左上角 表示 Web 界面的名称 界面右上角各按钮含义 点击系统摘要按钮 返回系统摘要页面 2 点击刷新按钮 进行页面刷新 3
  • 【codeforces】 ZeptoLab Code Rush 2015 A,B,C,D,E题解

    D E统统FST 差一点就飞升了 A King of Thieves 给你一张地图 让你从某个 开始跳等步长的四次 如果均在 则输出yes 否则输出no 枚举起始点和步长直接做就可以了