其他分享
首页 > 其他分享> > CSP2020复赛前小结

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;
    }
}

End

删除Debug

检查long long,不确定就全开吧!

检查数组大小,无向图双倍

检查freopen和选手文件夹

标签:ch,string,CSP2020,char,读入,ans,小结,复赛,getchar
来源: https://www.cnblogs.com/send-off-a-friend/p/13939394.html