错误点总结

KMP 与 Sunday的比较

Gate

总结:一般来说使用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.hmemory.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下载链接

Here

TLE错误

  1. 多组输入时,一定要初始化图,不然会影响下一次的结果。在特别多数据时特容易导致超时
posted @ 2020-08-11 21:11  RioTian  阅读(316)  评论(0编辑  收藏  举报