首页 > 其他分享 >倍增基础练习题

倍增基础练习题

时间:2023-12-20 18:12:24浏览次数:34  
标签:练习题 head syoj int d% 基础 tail 倍增

syoj 806. 序列翻转

P6148 [USACO20FEB] Swapity Swapity Swap S

\(n\) 个进行 \(m\) 次操作,每次操作将所给的 \(l\) 到 \(r\) 区间进行翻转。一共会重复 \(k\) 次上述操作。 \(k<=1e9\)。

倍增 \(k\),设 \(f[i][j]\) 表示总操作重复 \(2^i\) 次后的序列。

预处理时,转移方程为 \(f[i][j]=f[i-1][f[i-1][j]]\),即从上一次答案两次操作后转移过来。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,k;
int f[32][N],ans[N];
int main(){
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=n;i++) f[0][i]=i;
	for(int i=1;i<=m;i++){
		int l,r;
		scanf("%d%d",&l,&r);
		reverse(f[0]+l,f[0]+r+1);
	}
	for(int i=1;i<32;i++)
		for(int j=1;j<=n;j++) f[i][j]=f[i-1][f[i-1][j]];
	for(int i=1;i<=n;i++) ans[i]=i;
	int cnt=0;
	while(k){
		if(k&1) for(int i=1;i<=n;i++) ans[i]=f[cnt][ans[i]];
		k>>=1;
		cnt++;
	}
	for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
	return 0;
} 

syoj 877. 飞行的小鸟

P3509 [POI2010] ZAB-Frog

经典题目。单调队列优化 dp + 倍增。

\(n\) 个点进行 \(m\) 次操作。对于每个点,每次会移动到离自己距离第 \(k\) 远的位置上。\(m\) 次操作后,求原序列各点的现坐标。

\(nxt_i\) 表示距第 \(i\) 个点第 \(k\) 小的位置。该过程用单调队列维护,即让 \(head\) 和 \(tail\) 相差 \(k\)。(因为序列升序)

然后用倍增重复操作。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1000010;
int n, k;
ll m;
ll a[N];
int nex[N], tmp[N], ans[N];
int main()
{
	scanf("%d%d%lld", &n, &k, &m);
	for(int i = 1; i <= n; i ++ ) scanf("%lld", &a[i]);
	nex[1] = k + 1;
	int head = 1, tail = k + 1;
	
	for(int i = 2; i <= n; i ++ )
	{
		while(tail + 1 <= n && a[i] - a[head] > a[tail + 1] - a[i]) head ++, tail ++;
		if(a[i] - a[head] >= a[tail] - a[i]) nex[i] = head;
		else nex[i] = tail;
	}
	
	for(int i = 1; i <= n; i ++ ) ans[i] = i;
	
	while(m)
	{
		if(m & 1) for(int i = 1; i <= n; i ++ ) ans[i] = nex[ans[i]];	
		memcpy(tmp, nex, sizeof(tmp));
		for(int i = 1; i <= n; i ++ ) nex[i] = tmp[tmp[i]];
		m >>= 1;
	}
	
	for(int i = 1; i <= n; i ++ ) printf("%d ", ans[i]);
	return 0;
}

syoj 878. 巡逻

P4155 [SCOI2015] 国旗计划

鸽。


syoj 807. 蚂蚁爬树


P1967 [NOIP2013 提高组] 货车运输

鸽。


CF1175E Minimal Segment Cover

鸽。

标签:练习题,head,syoj,int,d%,基础,tail,倍增
From: https://www.cnblogs.com/Moyyer-suiy/p/17917176.html

相关文章

  • HighCharts 基础股票图
    需求:将基本图表转换为股票图表。修改库存的基本元素。注意范围的位置选择器、按钮数量、内容、初始选择和外观。同时定位菜单和标题。自定义底部的导航。分析:基本图表转换股票图表使用Highcharts.stockChart转换,修改库存基本元素stockTools解决定位菜单标题使用相关属性设定具体请......
  • VUE3学习基础之模板语法
    我的vue3学习之路总是学学停停,最开始在18年开发微信小程序,就发现小程序和vue的语法有些相似,然后就去看了vue2的文档,随后忙其它的事情就丢下了。直到22年又开始捡起来vue3,有了组合式api,语法简明很多,然后又不知道忙什么丢下。。。前段有些空时间,就把vue3的学习整理下,使用vite构建......
  • 【Pytorch基础实战】第二节,卷积神经网络
    项目地址https://gitee.com/wxzcch/pytorchbase/tree/master/leason_2源码importtorchfromtorchimportnn,optimfromtorch.autogradimportVariablefromtorch.utils.dataimportDataLoaderfromtorchvisionimportdatasets,transforms#定义一些超参数batch_......
  • Task基础-创建Task,Task传参,获取Task返回值
    Task基础-创建Task,Task传参,获取Task返回值Task基础介绍Task的创建获取Task的执行结果 补充细节1、Task基础介绍Task类是TaskProgrammingLibrary(TPL)中最核心的一个类,下面我将会像大家展示如何使用一些方法来创建不同类型的Task,取消Task,等待Task执行完成,获取Task执行......
  • 《中文版AutoCAD 2022基础教程》
    ......
  • Java零基础-反射
    前言Java是目前最流行的开发语言之一,在软件开发领域广泛应用。反射是Java的一项重要特性,它使得程序在运行时可以动态地获取和操作类、方法、属性等信息,极大地提高了Java的灵活性和可扩展性。本文将介绍Java反射的基本概念、使用方法、应用场景和优缺点,旨在为Java初学者提供一份简......
  • docker 常用基础镜像打包
    JAVADockerfile#8的镜像比较小,但是在某些机器运行可能会有问题#FROMopenjdk:8-jdk-alpine#ARM机器推荐#FROMarm64v8/openjdk:17-jdkFROMopenjdk:17-jdk-alpineENVLANGen_US.UTF-8RUNecho"http://mirrors.huaweicloud.com/alpine/v3.6/main">/etc/apk/reposito......
  • 中电金信:金融电子化 | 打磨算力基础设施,赋能金融业数字化转型
    10月8日,工信部、人民银行等六部门联合印发《算力基础设施高质量发展行动计划》(以下简称《行动计划》),在行业和产业界吸引了信息产业和相关应用行业的广泛关注。作为引领我国算力基础设施建设的重要指南,《行动计划》为我国信息产业带来哪些深远影响?对金融业算力基础设施建设会带来......
  • Kubernetes基础总结
    一、k8s简介kubernetes——容器、分布式架构kubernetes本质是一组服务器集群,可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。主要功能:自我修复弹性伸缩——自动调整运行的容器数量服务发现——自动找依赖负载均衡——自动实现请求的负载均衡版本退回存......
  • NX2306 基础-重新学习☆☆☆
    【写在每个笔记前面:个人学习记录,如有错误,烦请指正,不胜感激。】因为自己有很多野路子的操作,效率在很大程度上被限制了,于是觉得更有必要重新全面学习一下基本操作。一是学习更多的规范化操作;二是将零散知识点整理成体系化的内容,如下仅补充自己的漏洞,持续更新。 鼠标:中键:自己在......