abc--cf训练日常总结
ABC
最近遇到好多思维和位运算的题目不会做,特地过来总结一些小小的知识点。
- 思维题目
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--cf训练日常总结的更多相关文章
- 台州学院maximum cow训练记录
前队名太过晦气,故启用最大牛 我们的组队大概就是18年初,组队阵容是17级生詹志龙.陶源和16级的黄睿博. 三人大学前均无接触过此类竞赛,队伍十分年轻.我可能是我们队最菜的,我只是知道的内容最多,靠我 ...
- python调用NLPIR - ICTCLAS2013实现中文分词
环境:win7.VS2008.Python2.7.3 第一步:照着文档[2]将NLPIR库封装成Python的扩展: 第二步:新建一个名为“nlpir_demo”的目录,将第一步最后得到的名为“nlp ...
- 《You dont know JS》原生函数
原生函数 原生函数,即JavaScript的内建函数(built-in function).常用的原生函数有String().Number().Boolean().Array().Object().F ...
- NLPIR分词(c++接口整理)
C/C++接口——对应的各个函数 函数1-bool NLPIR_Init(const char * sInitDirPath=0, int encoding=GBK_CODE,constchar*sL ...
- CUGBACM Codeforces Tranning 3 题解
链接:http://acm.hust.edu.cn/vjudge/contest/view.action? cid=62515#overview 描写叙述:第三场CF训练了.这次做的挺搞笑的,我记得这 ...
- 集训队8月9日(组合计数+容斥原理+Mobius函数)
刷题数:4 今天看了组合计数+容斥原理+Mobius函数,算法竞赛进阶指南169~179页 组合计数 https://www.cnblogs.com/2462478392Lee/p/11328938. ...
- 2019新生赛 %%%xxh
笔记.md ...
- 「日常训练」ZgukistringZ(Codeforces Round #307 Div. 2 B)
题意与分析(CodeForces 551B) 这他妈哪里是日常训练,这是日常弟中弟. 题意是这样的,给出一个字符串A,再给出两个字符串B,C,求A中任意量字符交换后(不限制次数)能够得到的使B,C作为 ...
- 集训队日常训练20181117 DIV2
大佬们一顿操作猛如虎,拼命AC强啊 4262: 区间异或 Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByteTotal ...
- 「日常训练」 Fire!(UVA-11624)
与其说是训练不如说是重温.重新写了Java版本的代码. import java.util.*; import java.math.*; import java.io.BufferedInputStre ...
随机推荐
- Android OpenMAX(八)如何学习OMXNodeInstance
前面一篇文章中我们看到media.codec service创建OMX组件后会把组件传递给一个OMXNodeInstance对象,并且把OMXNodeInstance对象返回到Framework层,F ...
- pandas rank()函数简介
本文简单的说一下自己对pandas的rank()函数的简单讲解. 函数原型:rank(axis=0, method: str = 'average', numeric_only: Union[bool ...
- JavaSE 关键字和标识符
目录 关键字 标识符 标识符命名规则 标识符命名规范 字面值 关键字 具有特殊含义的 命名时不可以与关键字重名 标识符 也就是名字,对类名,变量名称,方法名称,参数名称等修饰 标识符命名规则 以字母, ...
- 腾讯云 BI 数据分析与可视化的快速入门指南
前言 腾讯云 BI 是一款商业智能解决方案,提供数据接入.分析.可视化.门户搭建和权限管理等全流程服务.它支持敏捷自助设计,简化报表制作,并通过企业微信等渠道实现协作.产品分为个人版.基础版.专业版和 ...
- 增补博客 第八篇 python 中国大学排名数据分析与可视化
[题目描述]以软科中国最好大学排名为分析对象,基于requests库和bs4库编写爬虫程序,对2015年至2019年间的中国大学排名数据进行爬取:(1)按照排名先后顺序输出不同年份的前10位大学信息, ...
- 企业快速落地IT服务管理体系的六大关键步骤
许多企业在实施信息化战略时,一味地追求"技术高消费"而忽视了对信息技术的管理和内部业务流程的变革,侧重点仍然只是事后的技术支持和故障解决方面,随着企业对于信息技术的依赖程度的加重, ...
- FFmpeg开发笔记(三十)解析H.264码流中的SPS帧和PPS帧
<FFmpeg开发实战:从零基础到短视频上线>一书的"2.1.1 音视频编码的发展历程"介绍了H.26x系列的视频编码标准,其中H.264至今仍在广泛使用,无论视频 ...
- Masonry的进阶使用技巧
Masonry是iOS开发中常见的视图约束框架,但是有人对他的使用还是浅尝辄止,接下来会提出几点比较少见但是又十分便捷的使用技巧. mas_greaterThanOrEqualTo mas_great ...
- Codeforces 1868C/1869E Travel Plan 题解 | 巧妙思路与 dp
为了更好的阅读体验,请点击这里 题目链接:Travel Plan 题目大意:\(n\) 个点的完全二叉树,每个点可以分配 \(1 \sim m\) 的点权,定义路径价值为路径中最大的点权,求所有路径的 ...
- 实验11.ACL实验
# 实验11.ACL实验 本实验用于测试ACL,类似于防火墙. 拓扑 要求阻塞PC1到PC2和server的全部协议,阻塞client1到server1的icmp协议 具体配置 首先利用ospf协议实 ...