错误点总结
KMP 与 Sunday的比较
总结:一般来说使用KMP能保证不出错
快读入门
https://www.wjyyy.top/3514.html
inline int read() {
int s = 0, w = 1;
char ch = getchar();
while (ch<'0' || ch>'9') { if (ch == '-')w = -1; ch = getchar(); }
while (ch >= '0'&&ch <= '9') s = s * 10 + ch - '0', ch = getchar();
return s * w;
}
//各类型 快读
template <class T>
void read(T& x) {
T s = 0, w = 1;
char ch = getchar();
while (ch < '0' || ch > '9')
w = (ch == '-' ? -1 : w), ch = getchar();
while (ch >= '0' && ch <= '9')
s = s * 10 + ch - '0', ch = getchar();
x = s * w;
}
int x;
read(x);
大佬们的神仙宏定义
#pragma warning(disable : 4996)
#include"bits/stdc++.h"
using namespace std;
#define ll long long
#define fo(i,n) for(ll i=0; i<(n); i++)
#define FO(i,a,b) for(auto i=a; i!=(b); i+=(b)>(a)?1:-1)
#define vll vector<ll>
#define vch vector<char>
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define sll set<ll>
#define all(c) c.begin(), c.end()
#define on(x) cout<<x<<"\n";
#define os(x) cout<<x<<' ';
#define nl cout<<"\n";
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
ll n, r, flag=0;
cin>>n;
while(n)
{
r=n%10;
n/=10;
if(r==7)
{
flag=1;
break;
}
}
if(flag) on("Yes")
else on("No")
return 0;
}
对比文件输入在OI中的应用
#ifndef ONLINE_JUDGE
#pragma warning(disalbe : 4996)
#endif
#include<iostream>
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif // !ONLINE_JUDGE
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
system("out.txt");
#endif // !ONLINE_JUDGE
return 0;
}
//////////////////下面的方法明显好很多,输出利用“黑框”即可////////////////////
#include<bits/stdc++.h>
using namespace std;
int main(){
freopen("in.txt","r",stdin);//注意点,在提交的时候要手动注释掉,不然会WA
return 0;
}
memset初始化问题
memset可以对高位数组进行初始化,非常方便。需要注意的是memset的头文件是string.h和memory.h 。
(注:一下dp高维数组都是全局变量,局部变量请自行修改sizeof语句)
一:赋 ‘0’ 与 赋 ‘-1’
memset(dp,0,sizeof(dp));
memset(dp,-1,sizeof(dp));
在计算机中,数据用补码保存。-1的补码(32位)是0xFFFFFFFF,(8位,一个字节)是0xFF,memset是按字节填充的,所以不影响赋值的真实性。
二:赋最大值
memset(dp,127,sizeof(dp));
127用8位二进制数表示是0b01111111:用4个0b01111111填充到一个32位的int中:
得到了一个接近32位无穷大(INT_MAX = 0x7FFFFFFF = 2147483647)的数。
三:赋最小值
memset(dp,-127,sizeof(dp));
-127用补码表示是 0b10000001 ,用4个 0b10000001 填充到int中:
得到了一个绝对值非常大的一个负数(-2122219135)
127可以利用八进制的0x7f替换,但一般不太可能会直接初始化为正无穷,而是初始化为0x3f,保留一定的算术可能性(防止溢出)
初始化优化
在初始化Floyd或者其他类似的东西
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
gra[i][j]=inf
for(int i=1;i<=b;i++)
gra[i][i]=0
是比
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i==j) gra[i][j]=0;
else gra[i][j]=inf
}
快的(测试大约1是2的80%的时间)
原因后者每次都要判断
返回值技巧
#include<bits/stdc++.h>
signed main() {
std::string s, t;
std::cin >> s;
while (std::cin >> t) {
if (s[0] == t[0] || s[1] == t[1])return std::cout << "YES", 0;
}
return std::cout << "NO", 0;//先输出,然后返回
}
Lowbit函数
定义一个Lowbit函数,返回参数转为二进制后,最后一个1的位置所代表的数值.
例如,Lowbit(34)的返回值将是2;而Lowbit(12)返回4;Lowbit(8)返回8。
Lowbit的一个简便求法:(C++)
int lowbit(int x){
return x&(-x);
}
或者使用宏定义
#define lowbit(x) (x & -x)
位运算永远都很快和便利
左移:$$1 << n = 2^n , n << 1 = 2n$$
右移:$$n >> 1 = [\frac{n}{2.0}]$$
算术右移等于除以2向下取整, \((-3) >> 1 = -2 , 3 >> 1 = 1\)
位运算使用技巧
关于剪枝的一个小总结:
剪枝分为可行性剪枝与最优化剪枝。
可行性剪枝一般的思考过程就是,我一共需要多少,在最多的情况下也无法达到,或最少的情况下也会超过。
那么至于最大与最小到底怎么取到,就本题而言,还有类似的每层递增的题目,可以考虑我从(1,1)开始每层加一,到现在的层数,面积和即为最小面积。而最大,就是把一个变量限制成最小,就可以取得另一个的最大,而对每一个“另一个”,都有一个“这个”的最大与之对应。
最优化剪枝,就是考虑,我现有的面积和已经比最小面积大了,那么不用继续讨论。或者,我现有的面积,加上最小面积,也比最小面积大,那么也可以不再继续。
KB算法模板PDF下载链接
TLE错误
- 多组输入时,一定要初始化图,不然会影响下一次的结果。在特别多数据时特容易导致超时