星星之火,可以燎原

rush

1. 关于保留小数取整方面的问题:

 ①floor函数向下舍入为最接近的整数:-2.1,-2.9——>-3
3.1,3.9——>3
②ceil函数向上取整为最接近的整数:-2.1,-2.9——>-2
3.1,3.0——>4
③对浮点数的四舍五入 12.5——>13
12.4——>12

2. Windows 模拟文件读入结束

ctrl + Z 可以模拟文件输入的结束即EOF

3. 字符串读取

对于字符串的情况,尤其是要读取空格,可以使用getline读取一整行。注意是不是应该加上getchar吸收换行。含有空格的字符串输出可以用gets(),自带换行

4. 很多题目需要用到初始化,我常用的有三种:

 ①memset(数组名首地址,想要初始化的值,sizeof 初始化的范围)
例如memset(num,0,sizeof(num));注意只能是初始化成-1,0,0x3f3f3f3f,0x3f3f 其余的十六进制没有试过
②fill(数组名首地址,初始化的范围,初始化的值);
例如:fill(a,a+10,0);这个函数可以初始化成为任一值
③最最最保险的方法莫过于for循环,相对于以上两种方法估计还不会导致超时!!!==有的题目多组输入会因为每次进行初始化,消耗的时间会很长导致超时==

5. 半径为 r 的圆内整点

个数为1+4 * r+4 * ∑ ri=1sqrt(r * r - i * i)

6. m*n的矩形中正方形的个数,0<=n,m<=1000

ans=0;
for(int i=1;i<=min(n,m);i++)
ans+=(n-i+1)*(m-i+1);

7. 氧气优化 & 臭氧优化

#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")

8. a 年到 b 年的闰年的数量

(b/4-(a-1)/4)-(b/100-(a-1)/100)+(b/400-(a-1)/400)

9. 在堆内定义优先队列时,尤其是小根堆要注意!:

priority_queue <int ,vector<int> ,greater<int> 这里要加上空格> que;
两个>>在一起是位右移运算

10. 在堆内定义变量时,不要定义y1 不知道为什么会报编译错误,很多平台多这样比如洛谷

比较正式的解读:​​传送门​​ 不方便跳转可以直接看图:图片是上面那篇博客的

做题总结——连续更_循环节

11. 矩阵种固定两点,所在直线整数点的个数

2020.6.1更
以A,B两点为端点的直线,经过两点间整数点的个数
A(x1,y1) B(x2,y2)
xx=abs(x1-x2);
yy=abs(y1-y2);
ans=gcd(xx,yy)+1;
ans包括A B两点

12. 求下(上)一个排列

2020.7.7更
​​​原文链接​​​ STL中有关于全排列的函数:
1)next_permutation:求下一个排列组合

a.函数模板:next_permutation(arr, arr+size);
b.参数说明:
  arr: 数组名
  size:数组元素个数
c.函数功能: 返回值为bool类型,当当前序列不存在下一个排列时,函数返回false,否则返回true,排列好的数在数组中存储

d.注意:在使用前需要对欲排列数组按升序排序,否则只能找出该序列之后的全排列数。
    比如,如果数组num初始化为2,3,1,那么输出就变为了:{2 3 1} {3 1 2} {3 2 1}

2)prev_permutation:求上一个排列组合

13. 2020.7.15更新

  忠告:
1.cout比printf,putchar(),puts(),以及自己编写的输出函数要耗时更长(尤其是循环里的输出)
2.cin类比1.,比scanf getline(), gets(),getchar(),以及自己写的输入函数等耗时更长 (尤其是循环里的输如)
3.位运算比乘除运算符要快

14. Linux | Windows换行的不同

2020.7.17更

做题总结——连续更_数据结构_02


遇见图片上这种输入的时候,应该选用如下的输入方式:

cin>>n;

getchar();

getchar();

getline(cin,string);

Linux环境中的换行和win环境下的换行是不同的,当在acwing上测试代码的时候,不会出现正确的输出,而在win环境中测试以上样例的时候,得到的正是正确的输出,而判题姬是Linux环境的,所以容易被编译器演,所以一定要注意这种类型的输入。

15. double | long double | __int128

2020.8.15更

小细节:

%lf-----double

%Lf------long double

做题总结——连续更_数据结构_03


__int128占用 16个字节

16. n个点构成多少种树

2020.8.17更
n个点可以构成的不同的树有 n(n-2)

17. long long和double之间的范围大小和精度损失问题

2020.8.30更
long long 和double 在上面来看都是八个字节,每个字节是八位总共有64位,但是考虑到double 后面还有符号位,所以,对于整数部分,long long 是要比double要大一点的;附上​​​大佬博客​

18. ull 自然溢出问题

(2020.9.16更)
在C++中,对于数据过大会发生溢出这种情况,导致得到负值或者是其他相差很大的数,但是用unsigned long long的时候,如果溢出,会发生自然溢出现象,如果所存储的数据范围大于 264 -1 ,会自动 取余 264 -1;

19. C++ string查找是否存在某子串

(2020.9.27 更)
在C++中string的使用字符的子串的查找string.find() 与 string::npos
如果在一个字符串如

string s = "abcdefghijklmnopqrst";

如若查找子串 “ghi”
则要使用

s.find("ghi");

如若查找到,则返回的结果是所要查找的子串的第一个字母在主串中的下标
如若没有查找到,则是一个很大的数,所以说,如果想要如果要判断这个字符串是否在主串中出现的情况,则要使用

if(s.find("ghi") != string::npos)

用法实例:

做题总结——连续更_c++_04

20 . 比较特殊的多组输入

(2020.10.2更)

如果要连续输入若干个数,而且这些数中可能会有很多个空格或者是换行,比如:

做题总结——连续更_算法_05


这时应该使用

while(scanf("%d",&a[t])==1){

}

21. C++ string 的%s输出

(2020.10.4更)

很多时候在写代码的时候会用到string这种东西,但是却只能够用cout进行输出(如果强制使用printf输出会导致乱码),这就有可能被卡掉,而导致超时,无意之中看见了大神的代码

发现string中有一个函数 c_str可以转换为用printf进行输出,瞬间感觉舒服了

具体使用方法如下:

:

做题总结——连续更_c++_06

22 . STL内存消耗问题

2020.10.6更

在做题的时候无缘无故的发现被卡了内存超限,然后在codeforces上叫了一下发现没问题,然后去找题目的内存限制,发现Codeforces上面的内存设置的大小是 512M,然后发现UPC平台上是128M,又改了一下代码,将用C++STL 中的map容器计数换位普通的数组之后,就很神奇的通过了这道题,后来去网上百度了一下map容器的内存问题,具体可见:

​知乎大神的回答​​​​CSDN某大神的回答​

发现map的内存消耗确实是个问题

做题总结——连续更_循环节_07


做题总结——连续更_循环节_08


这样来说能不用STL就不用叭

从容的看了看内存消耗,发现

做题总结——连续更_初始化_09


做题总结——连续更_数据结构_10

差距过大!!!!!

22. 有关scanf()函数 返回值

2020.10.24更
有关scanf()函数 返回值的问题,比如要输入两个数a,b
如果a和b都被成功读入,那么scanf的返回值就是2,如果只有a被成功读入,返回值为1,如果a和b都未被成功读入,返回值为0,如果遇到错误或遇到end of file,返回值为EOF。(经常用在多组输入里面)
所以说scanf返回的就是已经读入的数的个数

23. 有关lower_bound()进行查找的格式

2020.12.04 更新
有关lower_bound()进行查找的时候,格式如下:

int ans =lower_bound(A,B,C) - firstpos;

其中,A是起始点,B是终止点,C是要查找的数,firstpos顾名思义就是首地址
用来查找第一个大于等于C的数对应的下标
具体的方法如下:

int ret = lower_bound(dp+1,dp+1+n,0x3f3f3f3f) - (dp + 1);

上面的式子对应的数据及结果便是

int ret = lower_bound(dp+1,dp+1+n,0x3f3f3f3f) - (dp + 1);
printf("%d\n",ret);
for(itn i = 1;i<=n;i++) cout <<dp[i] << ' ';
puts("");

做题总结——连续更_c++_11


一共六个数,第一个大于等于0x3f3f3f3f的数的后一个数是5,在下标为3的位置,所以最终的结果就是3

有关lower_bound()查找的时候,返回的是数组的下标,查找的区间(按照上面的例子来说)是从 [dp +1 ,dp + 1 + n),

这个区间是左闭右开

24. 数据范围与复杂度关系

2021-4-5更新

​原文网址​

做题总结——连续更_c++_12


5105 n * sqrt(n)
1e6 ~ 5e6 n * log
1e7 n
log -> TLE,要O(n)

6000 * 6000 * [1,16]常数可以接受

7000 * 7000 -> n^2

500 * 500 * 500 ->n 3

25 随机化

2021.8.20更新

做题总结——连续更_数据结构_13

mt19937_64 rnd(time(NULL));
for(int i=1; i<=10; i++) cout << rnd() <<endl;//随机产生一个数
uniform_int_distribution<int>ran(1,20);//生成1-20之间的整数
for(int i=1; i<=10; i++) {
cout << ran(rnd)<< endl;//随机选取生成的区间内的数
}

做题总结——连续更_c++_14

26. 浮点数转换为分式

2021-10-12更新
先只是考虑小数点后的部分:
对于一个浮点数做题总结——连续更_c++_15,假如它的循环节长度为6,即循环节为做题总结——连续更_数据结构_16,那么可以将其转换为
做题总结——连续更_循环节_17,循环节的长度是多少,就除以一个长度为多少的每位为9的数
假如小数点后面的数字不全属于循环节的部分,那么说我们就可以将不属于循环节的部分挪到整数部分,然后最终再把结果除一下即可
比方说:
做题总结——连续更_初始化_18 循环节长度为9 转换为分式就是做题总结——连续更_循环节_19
如果对于做题总结——连续更_初始化_20来讲,就是做题总结——连续更_循环节_21
而对于
做题总结——连续更_c++_22且循环节长度为2的情况,我们应该:
做题总结——连续更_算法_23 => 做题总结——连续更_算法_24