CSP2020复赛前小结
今天用windows下的GUIDE打了一些板子,以下是我遇到的问题。
语言
未定义返回值类型的函数
inline isnum(char ch)
{
return ch>='0'&&ch<='9';
}
inline int read()
{
int x=0,fu=1;
char ch=getchar();
while(!isnum(ch)&&ch!='-') ch=getchar();
if(ch=='-') fu=-1,ch=getchar();
while(isnum(ch)) x=x*10+ch-'0',ch=getchar();
return x*fu;
}
上面是一个快读。isnum(char)忘记写返回值了,但是信息查看栏里面
--------开始编译--------
编译成功.
居然没有报错。
交到洛谷上
ISO C++ 不允许声明无类型的‘isnum’ [-fpermissive]
inline isnum(char ch)
这就很麻烦了啊。考试的时候别看见inline就忘记返回值了!
其实c++有一个在<cstdio>
内的函数isdigit(char)
可以用来判断是否为数字。
这是我一般写的快读(没有负数)
inline int read()
{
int x=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
x=ch-'0';ch=getchar();
while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
return x;
}
读入string
大家应该都知道,读入string
字符串一般用cin>>string
。但是如果想要快一点的话,如何读入呢?用scanf
?
使用scanf
的话,格式符是"%s"
,并且string
变量名不能像char
数组那样当作首元素的指针了,应该使用取地址符来进行读入。
string a;
scanf("%s",&a[0]);
看似很完美也很快的方法,结果读入了什么都没有!这是为什么?
因为string
属于\(STL\)的容器,这些容器以开始都是没有分配内存的,需要手动分配内存。
string a;
a.resize(10);//这个长度要手动设置
scanf("%s",&a[0]);
所以我还是打算老老实实的使用cin呢。
当然有人要问,为什么不用getchar()
再插入。因为string.push_back()
是\(C++11\)的语言了,csp应该是不能用。。。
栈大小
编译开大:
-Wl,-stack=67108864
总体开大:
sudo -s//管理员权限
ulimit -s unlimited//开大
ulimit//检查
算法
快速幂
可能会遇到模数为1的情况。所以别忘记给ans先%一个p或最后再%p一次
一般写法:
for(ans=1;b;b>>=1,a=a*a%p) if(b&1) ans=a*ans%p;
要改成
for(ans=1%p;b;b>>=1,a=a*a%p) if(b&1) ans=a*ans%p;
或
for(ans=1;b;b>>=1,a=a*a%p) if(b&1) ans=a*ans%p;ans%=p;
hack:1 0 1
因为b=0,故使用第一种程序时,不会取模,导致答案错误期望0,读到1
。
质数筛
埃氏筛没有问题,但是在洛谷上跑的时候最多40pts(不加快写20pts),这里就体现了快写线性筛的必要性。
book[1]=1;
for(re LL i=2;i<=n;i++)
{
if(!book[i]) prime[size++]=i,write(i);
for(re LL j=0;j<size&&i*prime[j]<=n;j++)
{
book[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
树状数组
树状数组有个O(1)插入的方法
for(re int i=1;i<=n;i++)
{
a[i]+=read();
if(i+(i&-i)<=n) a[i+(i&-i)]+=a[i];
}
结果我两次把\(1\)看成\(i\),一次忘记判断i+(i&-i)<=n
,挂的可快了!
单调队列
这里只列出来求区间最小值。
一定要先判断队列不为空!
队尾出不单调元素
插入下标进队尾
队头出过期元素
记着这些应该就没问题。
while(!mn.empty()&&a[mn.back()]>a[i]) mn.pop_back();
mn.push_back(i);
while(!mn.empty()&&mn.front()+k<=i) mn.pop_front();
if(i>=k) cout<<a[mn.front()]<<" ";
KMP
还是char好用,char下标可以从1开始
for(int i=2,j=0;i<=tl;i++)
{
while(j&&t[i]!=t[j+1]) j=nxt[j];
if(t[i]==t[j+1]) j++;
nxt[i]=j;
}
for(int i=1,j=0;i<=pl;i++)
{
while(j&&(p[i]!=t[j+1])) j=nxt[j];
if(p[i]==t[j+1]) j++;
if(j==tl) cout<<i-tl+1<<endl,j=nxt[j];
}
string只能从0开始,好可怜。。。
int j=-1;
nxt[0]=-1;
for(int i=1;i<b.size();i++)
{
while(j>-1&&b[i]!=b[j+1]) j=nxt[j];
if(b[i]==b[j+1]) j++;
nxt[i]=j;
}
j=-1;
for(int i=0;i<a.size();i++)
{
while(j>-1&&a[i]!=b[j+1]) j=nxt[j];
if(a[i]==b[j+1]) j++;
if(j==b.size()-1){
cout<<i-b.size()+2<<endl;
j=nxt[j];
}
}
逆元
记住三种就好
快速幂
\]
拓展欧几里得
void exgcd(int a,int b,LL &x,LL &y)
{
if(!b)
{
x=1;
y=0;
return;
}
exgcd(b,a%b,y,x);
y-=a/b*x;
}
//------------
exgcd(a,p,x,y);
x=(x%p+p)%p;
cout<<x;
线性
LL inv[100000010];
LL n,p=998244352;
int main()
{
cin>>n;
inv[0]=1;
inv[1]=1;
for(LL i=2;i<=n;i++)
{
inv[i]=(p-p/i)*inv[p%i]%p;
}
for(int i=1;i<=n;i++) cout<<inv[i]<<" ";
return 0;
}
End
检查long long
,不确定就全开吧!
检查数组大小,无向图双倍,线段树四倍
删除Debug
检查freopen和选手文件夹
赛时
死磕T1,1h30min后估30pts无从下手优化;
看到T2,貌似是组合数学,直接\(pass\)
看到T3,想到暴力——线段树——vector存展开指令——1h30min写完暴力继续T1;
继续T1,优化至能过50pts。再用手动倍增(2000years,10k、100k、1000k、10000kyear)预估时间复杂度为\(O(q*log_{10} n)\),但是大样例3,它\(1s\)只能过一半!
卡常,检查,于是。。。
有所感动的是,赛后代码都正常……呵呵!
无论自己现在做什么,日子还是要接着过,明天的太阳还是会正常升起。
过去的事情就让它过去吧。
After-story
以及待更新
CSP2020复赛前小结的更多相关文章
- CSP2020复赛游记
CSP2020复赛游记 由于本蒟蒻侥幸通过PJ和TG的分数线并且侥幸的拿了一等,所以侥幸的来参加复赛 11.04~11.05 期中考,挂 11.06 对答案,炸 11.07 开始了第一次CSP复赛 坐 ...
- csps前小结
冒着题没改完颓废被发现的风险来写博客 好像离csps只剩两天了,然而没啥感觉 最近考试有时考得还算可以,有时也会很炸 今天考试事实上心态啥崩,因为T1结论题一直没思路,想了一个小时连暴力都没打 过了一 ...
- TypeScript体系调研报告
作者简介:aoto 蚂蚁金服·数据体验技术团队 Q:为什么要写这边文章?这篇文章要表达什么? A:我们考虑在SPA应用中使用TS作为开发语言,我们需要一篇系统性介绍TS本身及周边的文章来论证在项目中使 ...
- Python(三)——文件操作
在我们用语言的过程中,比如要往文件内进行读写,那么势必要进行文件操作,那么咋操作呢?用眼睛直接看么?今天就定个小目标,把文件读写那些事扯一扯 文件操作 把大象放进冰箱分几步? 第一步:打开冰箱 第二步 ...
- 从柯洁对战AlphaGo,看商业智能
[摘要]李开复赛前说,AlphaGo和李世石的人机大战是第一次,可能还有悬念,那今天的AlphaGo已经在围棋的世界中彻底甩开了人类,不再拥有任何其他的可能.并指出,AlphaGo和柯洁的比赛并非没有 ...
- 达梦产品技术支持-DM8-数据库安装
(该文档只适合个人环境搭建,未涉及到数据库的各种参数配置,未涉及到数据库规划,若需要企业环境搭建请咨询专业人员) 基于Windows的安装 windows下安装是图形化界面,与linux下的图形化界面 ...
- dm8数据库的安装 for linux
目录 dm8数据库的安装 for linux 1.创建用户 2.修改limit的文件 3.解压文件安装包 4.挂载iso镜像 5.对于安装介质和目录进行权限授予 6.切换用户安装数据库软件 7.dm数 ...
- 达梦数据库学习(一、linux操作系统安装及数据库安装)
达梦数据库学习(一.linux操作系统安装及数据库安装) 环境介绍: 使用VM12+中标麒麟V7.0操作系统+达梦8数据库 一.linux系统搭建 本部分没有需要着重介绍,注意安装时基本环境选择&qu ...
- Luogu 2017 Autumn Camping 游记
颓得不行的我到D2才想起来自己可以写一篇low得不能再low的游记,然后就动笔了...... Day0 愉快地看着三联,想着别人放一天我放四天的悠闲生活,内心甚是平静.然而晚上回到家就开始浪了,看完了 ...
- DM8数据库单机安装
一.系统概要 表1 部署情况一览表 操作系统 Windows10 数据库版本 DM8(开发版) 数据库类型 单机 磁盘挂载 无 Key信息 无 二.操作系统信息检查 2.1 操作系统版本 [root@ ...
随机推荐
- 痞子衡嵌入式:了解主从系统中i.MXRT系列MCU从主处理器接收App数据包超时机制
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是主从系统中i.MXRT系列MCU从主处理器接收App数据包超时机制. 在痞子衡旧文 <RT四位数Boot模式> 里的 1.2 ...
- 为什么将malloc()和printf()称为不可重入?
转载自https://mlog.club/article/1807704 在unix系统中,我们知道malloc()是一个不可重入的函数(系统调用).为什么? 类似地,printf()也被认为是不可重 ...
- golang gin框架使用swagger生成接口文档
前言 一份清晰明了的接口文档能够极大地提高前后端双方的沟通效率和开发效率. 本文将介绍如何使用swagger生成接口文档. swagger介绍 Swagger本质上是一种用于描述使用JSON表示的RE ...
- Linux指令详解之:ctl相关命令大礼包
目录 6.4 服务管理命令(ctl大礼包) 6.4.1 systemctl 6.5.2 systemctl小结 6.5.3 timedatectl 6.5.4 localectl 6.5.5 netw ...
- Typora中插入分页符
博客地址:https://www.cnblogs.com/zylyehuo/ <div style="page-break-after:always"></div ...
- WIN2012域用户添加和批量添加工具
WIN2012域用户添加和批量添加,不需要进行复杂的进电脑管理去添加 直接在软件上就可单个用户添加,可批量添加,并把指定的用户加入组 可以自定义组织单位,使用起来比较简单方便. 链接:https:// ...
- 【深度学习】从VAE到GAN漫谈
正文 从AE说起 AE是一个特征提取模型,通过编解码的形式重构输入,完成低维特征表示工作 推导 存在一个输入\(x\),构造AE编码器\(p_\theta(x)\),得到离散低维特征\(z\): 通过 ...
- shader中的if语句优化
可以借用lerp和step来拼接模仿语句 lerp(a,b,step(value,c))
- 【漏洞扫描】Nuclei v3.4.1 下载方法(附快速下载链接)
简介 Nuclei v3.4.1是一款强大的漏洞扫描器,并且拥有社区维护的海量漏洞POC,工具质量十分的高.Nuclei 用于基于模板跨目标发送请求,从而实现零误报并提供对大量主机的快速扫描.Nucl ...
- WSL 安装配置 MySQL
在 WSL 安装并配置 MySQL 与在 Ubuntu Server 安装配置 MySQL 一样的步骤.简要记录一下配置的过程. 安装 MySQL 参考微软官方文档[1]安装MySQL. sudo a ...