首页 > 其他分享 >abc--cf训练日常总结

abc--cf训练日常总结

时间:2024-06-09 13:00:50浏览次数:20  
标签:abc 题目 -- res ll 元素 cf int 1e8

ABC
最近遇到好多思维和位运算的题目不会做,特地过来总结一些小小的知识点。

  1. 思维题目
    https://atcoder.jp/contests/abc353/tasks/abc353_c
    这道题目要求我们计算连续的两个相邻的数组元素之和。我一开始用暴力,后面换了种错误的思路就wa了。
    其实这道题目是求和,然后找到和大于1e8的数减去1e8就欧克了。所以我们只需要找到有多少个和大于1e8的数减去
    数量X1e8就可以了。这里可以思考一下,题目的式子中每个元素加了多少遍?

正确答案是每个元素加了(n-1)遍,发现这个规律后,这样我们就能求出总和,现在只有一个问题,有多少和是大于1e8的呢?
这个我们不难想到,利用二分就可以找到下标,然后减去1e8的数量即可。
代码如下:

点击查看代码
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const ll MOD = 100000000;
ll n,m;
const ll N =3e5+9;
ll a[N],v[N];
ll ans=0,sum=0,pd=0;

/*
  
  每个数字都相当于加了(n-1)遍
  ,但是如果出现俩个数相加大于1e8
  ,就要减一个1e8,我们只要将所有的数*n-1·
  然后在计算一下剪掉1e8的个就行,排序
  ,然后二分或者lower_bound都行
 */
int check(int x){
	ll l=0,r=n+1;
	while(l+1!=r){
		ll mid = (l+r) >> 1;
		if(a[mid]>=x) r=mid;
		else l=mid;
	}
	return r;
}
int main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);

	cin>>n;

	for(int i=1;i<=n;i++) {
		cin>>a[i];
	    sum+=(n-1)*a[i];
	}
	 sort(a+1,a+n+1);
	ans=sum;
	for(int i=1;i<n;i++){
		if(a[i]+a[n]<MOD) continue;
		int res=check(MOD-a[i]);
		if(res<=i)res=i+1; if(res>n) continue;
		ans-=(n-res+1)*MOD;
	}
	cout<<ans;

	return 0;
}

继续的跟在上面的题是这道。
https://atcoder.jp/contests/abc353/tasks/abc353_d
如果你观察发现这两道题是连在一起的。

乍一眼一看感觉跟上面题目差不多啊也是加起来,只不过是单纯的物理加起来前面加上后面,有没有什么联系呢?
题面如下:

一开始我就掉入了思维陷阱,想着用上面的方法做,没有完全读懂题面,就直接做,这样很糟糕。
正确的想法是(每个元素出现的次数还是(n-1)遍相当于),所以小伙伴们以后写题千万别像我一样//

这道题的想法是什么呢?我们不用想着把没一个数一个一个算,这样肯定爆T。根据上面拿到题的思路可以知道每个数都是n-1次,
这里是前面的数直接加上后面的数,其实是什么呢?就是每一个数*后面元素的位数,这里设每一个元素为w,w后面一共不超过2×10
5
个元素,我们知道了每个w有(n-1)个,这里要想到每个w都与后的元素位数有关,也就是说后面的所有元素的位数知道了,
我们就能算出(n-1)个w元素的和。怎么做呢,我们只需要统计w后面元素的位数,存放在一起,sum+=让w乘上pow(10,后面每一位元素的位数),让所有的w加起来就可以了,但是这里可能数很大,所以题目要求取模,所以我们要用快速幂。2s够了。
代码如下:

点击查看代码
#include<bits/stdc++.h>
#define int  long long   
#define y second 
using namespace std;

typedef double D;
const int N = 3e5 + 10;
typedef pair<int, int> Pii;
int a[N];
int mod=998244353;
int n;
map<int,int>mp;
int ck(int x){
	int res=0;
	while(x){
		res++;x/=10;
	}
	return res;
}
int qmi(int x,int k){
	int res=1;
	while(k){
		if(k&1)res=res*x%mod;
		x=x*x%mod;
		k>>=1;
	}
	return res;
}
void solved()
{
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	int sum=0;
	for(int i=1;i<=n;i++){
		mp[ck(a[i])]++;
	}
	for(int i=1;i<=n;i++){
		sum+=(i-1)*a[i];
		mp[ck(a[i])]--;
		for(int j=1;j<=10;j++){
			sum=sum+a[i]*qmi(10,j)%mod*mp[j]%mod;
			sum%=mod;
		}
		
	}
	
	cout<<sum<<"\n";
	
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t;
	t=1;
	while (t--)
	{
		solved();
	}
	return 0;
}

ABC356——C
https://atcoder.jp/contests/abc356/tasks/abc356_c
这道题,也很有意思,就是问我们有多少种钥匙满足题目的条件,我当时的想法是统计数量,如果它的值为不为0,说明
这个元素只能为一个,因为在某个判断中它一定是正确或错误的。这样我们只需要找到为0的数目统计数量就找到有多少种可能,
但是这种方法是错误的,wa了,我猜想是如果给的元素多于k个,是x的,那么有可能这个元素是正确的,而我判断是错的,我
直接锁死了它的值,就少判断了。
正确的方法是枚举回溯。我基本没有用过这个方法,可能是写的太少了。我们可以这样考虑。
把真key设置为1,假的设置为0,然后一个一个枚举,如果满足上面所有的条件,ans++,这里思路大家都会。
问题在于怎么实现,我们可以这么考虑:
设置一个递归函数,f(x);
一开始主函数中f(1);
然后在递归里面记录被使用vis[x]=true;
然后继续f(x+1);,后面要回溯。
所以我们要vis[x]=fasle;
然后继续f(x+1);当x的数量到n个后就开始判断满不满足上面所有的条件。

点击查看代码
	cnt[x]=1;
	f(x+1);
	cnt[x]=0;
	f(x+1);

完整代码如下:

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int c[110];
int a[110][20];
char r[110];
int cnt[20];
int n,m,k;
int ans;
void f(int x){
	if(x==n+1){
		
		for(int i=1;i<=m;i++){
			int cntt=0;
			for(int j=1;j<=c[i];j++){
				if(cnt[a[i][j]]==1)cntt++;
			}
			bool x;
			if(cntt>=k)x=1;
			else x=0;
			
			if(r[i]=='x' && x==1)return;
			if(r[i]=='o' && x==0)return;
		}
		ans++;
		return;
	}
	//cout << x << " ";
	cnt[x]=1;
	f(x+1);
	cnt[x]=0;
	f(x+1);
	
}
int main(){
	
	cin >> n >> m >> k;
	for(int i=1;i<=m;i++){
		cin >> c[i];
		for(int j=1;j<=c[i];j++){
			cin >> a[i][j];
		}
		cin >> r[i];
	}
	f(1);
	cout << ans;
	return 0;
}
还有题目正在补充中。。。。

标签:abc,题目,--,res,ll,元素,cf,int,1e8
From: https://www.cnblogs.com/dontian/p/18239423

相关文章

  • 绘唐官网绘唐科技
    绘唐AI工具是一种基于人工智能技术的绘画辅助工具。使用教程:https://iimenvrieak.feishu.cn/docx/CWwldSUU2okj0wxmnA0cHOdjnF它可以根据用户提供的输入或指令生成各种类型的图像。绘唐AI工具可以理解用户的绘画需求,并根据用户的要求生成具有艺术风格的图像。用户可以通过......
  • test
    privatevoidTest2(){try{DateTimedt1=DateTime.Now;ArrayListal=newArrayList();//al.Add(@"C:\test\mergeTif\1.tif");//al.Add(@"C:\test......
  • Go 接收命令行参数
    在Go语言中,可以使用标准库中的os包和flag包来接收和处理命令行参数。使用os包os.Args是一个字符串切片,其中第一个元素是程序的名称,后续元素是传递给程序的命令行参数。示例代码packagemainimport("fmt""os")funcmain(){//os.Args[0]是程序......
  • JAVA第二次Blog
    前段时间PTA上发布了第四五六次的大作业。从第五次题目开始,题目并没有接着上次的试卷题目类的增加功能,而是改成了一道新的题目,涉及到物理电路的“家居电路设计”。注:由于老师提到不能放置太多源码防止泄露自己的代码,本期Blog中的代码均只有类的设计部分,一般不包含main函数的内容......
  • 【机器学习】与【数据挖掘】技术下【C++】驱动的【嵌入式】智能系统优化
    目录一、嵌入式系统简介二、C++在嵌入式系统中的优势三、机器学习在嵌入式系统中的挑战四、C++实现机器学习模型的基本步骤五、实例分析:使用C++在嵌入式系统中实现手写数字识别1.数据准备2.模型训练与压缩3.模型部署六、优化与分析1.模型优化模型量化模型剪枝......
  • 深入了解Git:从数据模型到集成IDEA
    Git是现代软件开发中不可或缺的版本控制工具。理解Git的数据模型、暂存区、命令行接口,并将其集成到IDE(如IntelliJIDEA),可以显著提升开发效率。本文将从底层开始,逐步深入Git的各个方面,并介绍如何将其集成到IntelliJIDEA中。目录Git的数据模型暂存区Git的命令行接口将Git集......
  • 【CTF MISC】XCTF GFSJ0290 reverseMe Writeup(图像处理)
    reverseMe暂无解法导入Photoshop。水平翻转,得到flag。Flagflag{4f7548f93c7bef1dc6a0542cf04e796e}声明本博客上发布的所有关于网络攻防技术的文章,仅用于教育和研究目的。所有涉及到的实验操作都在虚拟机或者专门设计的靶机上进行,并且严格遵守了相关法律法......
  • 【CTF MISC】XCTF GFSJ0249 misc_pic_again Writeup(LSB隐写+ZIP压缩包+反汇编)
    misc_pic_againflag=hctf{[a-zA-Z0-9~]*}解法用binwalk扫描,找到zip压缩包。binwalk719af25af2ca4707972c6ae57060238e.png用foremost提取,得到一张看起来一样的图片。foremost719af25af2ca4707972c6ae57060238e.png-o719再次用binwalk扫描,又找到......
  • 【Java】JDBC+Servlet+JSP实现搜索数据和页面数据呈现
    目录1.功能介绍2.实现流程3.项目环境4.相关代码4.1 Maven配置4.2SQL语句4.3 Java代码4.4 HTML代码4.5 JSP代码5.结果展示(原创文章,转载请注明出处)博主是计算机专业大学生,不定期更新原创优质文章,感兴趣的小伙伴可以关注博主主页支持一下,您的每一个点赞、......
  • Kotlin可空类型与非空类型以及`lateinit` 的作用
    Kotlin可空类型与非空类型以及lateinit的作用在Kotlin中,变量可以是可空类型或非空类型。可空类型表示变量可以包含一个空值(null),而非空类型表示变量不能包含空值。可空类型与非空类型非空类型:默认情况下,Kotlin中的变量是非空类型。例如,varrecyclerView:RecyclerView表......