当前位置: 首页 > article >正文

Codeforces Round 981 (Div. 3) (A~F)

文章目录

  • A. Sakurako and Kosuke
    • 思路
    • code
  • B. Sakurako and Water
    • 思路
    • code
  • C. Sakurako's Field Trip
    • 思路
    • code
  • D. Kousuke's Assignment
    • 思路
    • code
  • E. Sakurako, Kosuke, and the Permutation
    • 思路
    • code
  • F. Kosuke's Sloth
    • 思路
    • code

Codeforces Round 981 (Div. 3)

A. Sakurako and Kosuke

思路

签到题,直接判断奇偶即可

code

void solve(){
	int n;cin >> n;
	if(n & 1) cout << "Kosuke" << endl;
	else cout << "Sakurako" << endl;
	return ;
}

B. Sakurako and Water

思路

考点:模拟

从头开始遍历,如果当前数 < 0,则说明这个数需要进行增加操作,那就遍历这个数的对角线,找出最大值,将这个对角线都加上最大值即可
将这些最大值全部累加,最后输出即可

code

const int N=1000;
int a[N][N];
void solve(){
	int n;cin >> n;
	for(int i=1;i<=n;++i)
	   for(int j=1;j<=n;++j){
	   	cin >> a[i][j];
	   }
	int ans=0;
	for(int i=1;i<=n;++i)
	   for(int j=1;j<=n;++j){
	   	if(a[i][j]<0){
	   		int k=min(n-i+1,n-j+1);
	   		int s=0; 
	   		for(int z=0;z<k;++z){
	   			if(a[i+z][j+z]<0) s=max(s,abs(a[i+z][j+z]));
			   }
			for(int z=0;z<k;++z){
	   			a[i+z][j+z]+=s;
			   }
			ans+=s;
		   }
	   }
	cout << ans << endl;
	return ;
}

C. Sakurako’s Field Trip

思路

考点:模拟

暴力解法,我们只需要考虑每一项 i i i 和它的镜像 n − i + 1 n-i+1 ni+1 前后四项的值
如果这四个数有3个数的值相同,ans++,如果这四个数都相同,ans+=2

这时还需要考虑边界的问题,如果这个数为奇数并且遍历到中间这个数
那么我们就只需要考虑3个数,中间这个数和它前后这两个数

  • 如果这三个数都相同,ans+=2
  • 中间的数和前面的数相同或者中间的数和后面的数相同,ans++

如果这个数为偶数并且遍历到中间这两个数
那么我们只需要判断这两个数是否相同即可,相同ans++

讲起来有点复杂,实际上代码挺简单的

code

int a[N];
void solve(){
	int n;cin >> n;
	for(int i=1;i<=n;++i) cin >> a[i];
	int ans=0;
	for(int i=1,j=n;i<j;++i,--j){
		map<int,int> m;
		m.clear();
		if(i+1<j-1){
			m[a[i]]++,m[a[i+1]]++,m[a[j]]++,m[a[j-1]]++;
			for(auto x : m){
				if(x.se==3) ans++;
				if(x.se==4) ans+=2;
			}
		}
		else if(i+1==j-1){
			int x=a[i],y=a[i+1],z=a[j];
			if(x==y){
				if(x==z) ans+=2;
				else ans+=1;
			}
			else{
				if(y==z) ans+=1;
			}
		}
		else{
			if(a[i]==a[j]) ans+=1;
		}
	}
	cout << ans << endl;
	return ;
}

D. Kousuke’s Assignment

思路

考点:前缀和

对于数组 a a a ,先计算出它的前缀和,对于这个前缀和,我们维护当前 i i i 的上一个下标
如果遇见相同的前缀和,查询该前缀和的上一个下标是否小于上一段线段的结束位置
如果小于则选择,更新该前缀和的上一个下标为 i − 1 i-1 i1

code

int a[N],sum[N];
void solve(){
	int n;cin >> n;
	for(int i=1;i<=n;++i){
		cin >> a[i]; 
		sum[i]=sum[i-1]+a[i];
	} 
	int ans=0,mx=-1;
	map<int,int> m;
	m[0]=0;
	for(int i=1;i<=n;++i){
		if(m.count(sum[i])){
			if(m[sum[i]]>mx){
				ans++;
				mx=i-1;
			}
		}
		m[sum[i]]=i;
	}
	cout << ans << endl;
	return ;
}

E. Sakurako, Kosuke, and the Permutation

思路

我们可以将这题看成一个环, i − > p i − > p p i − > ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ − > i i ->p_i->p_{pi}->······->i i>pi>ppi>⋅⋅⋅⋅⋅⋅>i 为一个循环节
我们需要将这个环拆分成若干个自环和环节数为2的环
如果这个环为自环,代表自己指向自己,如果这个环的环节为2,代表这个环里的两个数相互指向对面

把玩一下不难发现,替换 p p i = i p_{pi}=i ppi=i 优于 p i = i p_i=i pi=i 的操作
因为进行 p i = i p_i=i pi=i 的替换只能保证一个数是准确的,让这个数形成自环
而进行 p p i = i p_{pi}=i ppi=i 不仅可以保证一个数是准确的,还有可能会形成环节为2的环

因此我们只需要考虑 p p i = i p_{pi}=i ppi=i 的操作即可,用map存储环,每次进行替换操作维护map即可

code

int a[N];
void solve(){
	int n;cin >> n;
	map<int,int> m;
	for(int i=1;i<=n;++i){
		cin >> a[i];
		m[a[i]]=i;
	} 
	int ans=0;
	for(int i=1;i<=n;++i){
		if(a[i]!=i && a[a[i]]!=i){
			int s=m[i];
			int t=a[i]; 
			swap(a[s],a[t]);
			m[a[s]]=s;
			m[a[t]]=t;
			ans++;
		}
	}
	cout << ans << endl;
	return ;
}

F. Kosuke’s Sloth

思路

斐波那契数列在模 k k k 意义下有周期性(皮萨诺周期),且这个周期 < = 6 k <=6k <=6k
暴力枚举求出周期 r r r,则第 n n n 个数的下标为 r n rn rn

code

int f[N];
void solve(){
	int n,k;
	cin >> n >> k;
	f[1]=1,f[2]=1;
	if(k==1){
		cout << n%mod << endl;
		return ;
	}
	int ans=0;
	for(int i=3;i<=6e5+5;++i){
		f[i]=(f[i-1]+f[i-2])%k;
		if(f[i]%k==0){
			ans=i;
			break;
		}
	}
	cout << ((n%mod)*(ans%mod))%mod << endl;
	return ;
}

http://www.kler.cn/a/378058.html

相关文章:

  • C++--------------树
  • linux 常用 Linux 命令指南
  • Java 中 getClass() 方法的使用与原理分析:深入理解对象类型信息
  • python fastapi docs UI 失效解决方案
  • 大数据-256 离线数仓 - Atlas 数据仓库元数据管理 正式安装 启动服务访问 Hive血缘关系导入
  • 2024-12-24 NO1. XR Interaction ToolKit 环境配置
  • Java入门10——封装(private)
  • 【Linux】--- 开发工具篇:yum、vim、gcc、g++、gdb、make、makefile
  • 萤石私有化设备视频平台EasyCVR视频融合平台如何构建农业综合监控监管系统?
  • 面试题整理 4
  • 阿里云docker安装禅道记录
  • TCP三次握手,四次挥手,以及11种状态详解
  • Oracle 第17章:数据字典与视图
  • python的数据结构列表方法及扩展(栈和队列)
  • InstructIR: High-Quality Image Restoration Following Human Instructions 论文阅读笔记
  • IDEA 好用的插件分享
  • Blender进阶:贴图与UV
  • 【C++篇】跨越有限与无限的边界:STL之set容器中的自我秩序与无限可能
  • 【踩坑】修复高版本dgl中distributed.load_partition不返回orig_id问题
  • nodejs入门教程19:nodejs dns模块
  • 第三百零五节 Log4j教程 - Log4j日志记录方法
  • Excel常用函数与操作
  • ArcGIS软件之“新建中学最适合地址”地图制作
  • 十款思维导图软件推荐,有适合你的一款!!!
  • JavaScript的第十二天
  • 使用PostgreSQL进行高效数据管理