小技巧

http://www.docin.com/p-686190550.html

查看数组占用内存大小


exit(0);

搜索到答案后(只需一个答案)强制退出函数


ios::sync_with_stdio(0);//cincout加速


求最大值的最小化,直接联想到二分


读入优化

inline int read()
{
    int k=1;int x=0;
    char c=getchar();
    while ((c<'0'||c>'9')&&c!='-')c=getchar();
    if(c=='-')
    k=-1,c=getchar();
    while(c>='0'&&c<='9')
    x=(x<<3)+(x<<1)+c-'0',c=getchar();
    return k*x;
} 

*** 输出优化***

inline void print(long long x)
{
    if(x<0)
        {
            putchar('-');
            x=-x;
        }
    if(x>9)
        print(x/10);
    putchar(x%10+'0');
}

#### 硬核优化

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")

线性筛素数

#define SIZE 1000000
int main()
{
    int check[SIZE] = {0};//元素值为0代表是素数
    int prime[SIZE] = {0};
    int pos=0;
    int flag;
    for (int i = 2 ; i < SIZE ; i++)
    {
        if (!check[i])//如果是素数
            prime[pos++] = i;

        for (int j = 0 ; j < pos && i*prime[j] < SIZE ; j++)
        {
            check[i*prime[j]] = 1;//筛掉
            //标注一
            if (i % prime[j] == 0)
                break;
        }
    }

    printf("%.2f", (double)clock()/CLOCKS_PER_SEC);

    return 0;
}

高精度压位

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
 
#define p 8//要压的位数 
#define carry 100000000//相应的10的P次方 用于进位 
//这样如果要改变压位的位数只要改这里就可以 
using namespace std;
 
const int Maxn=50001;
 
char s1[Maxn],s2[Maxn];
int a[Maxn],b[Maxn],ans[Maxn];
 
int change(char s[],int n[])//压位的核心部分 
{
    char temp[Maxn];//中间变量 记录每p位的数 
    int len=strlen(s+1),cur=0;
    while(len/p){//如果len大于等于p 
        strncpy(temp,s+len-p+1,p);//从后面截出来p位数 
        n[++cur]=atoi(temp);//把temp搞成数字 
        len-=p;//继续下p位 
    }
    if(len){//如果最后len不是正好p的倍数 也就是还剩下点不够p位的 
        memset(temp,0,sizeof(temp));
        strncpy(temp,s+1,len);//全截下来 
        n[++cur]=atoi(temp);//赋上 
    }
    return cur;//返回一个位数 
}
//这里就是(二)中的内容了 计算正常计算就行 
int add(int a[],int b[],int c[],int l1,int l2)
{
    int x=0,l3=max(l1,l2);
    for(int i=1;i<=l3;i++){
        c[i]=a[i]+b[i]+x;
        x=c[i]/carry;//进位 
        c[i]%=carry;
    }
    while(x>0){c[++l3]=x%10;x/=10;}
    return l3;//返回答案的位数 
}
 
void print(int a[],int len)
{ 
    printf("%d",a[len]);//处理高位 
    for(int i=len-1;i>=1;i--)printf("%0*d",p,a[i]);//输出p位 不足补0 
    printf("\n");
}
 
int main()
{
//  freopen("t.in","r",stdin);
//  freopen("t.out","w",stdout);
    scanf("%s%s",s1+1,s2+1);//读入两个字符串 
 
    int la=change(s1,a);//将s1这个字符串转化为a这个整型数组 
    int lb=change(s2,b);//同上 
    
    int len=add(a,b,ans,la,lb); 
    //计算长度为la的a数组和长度为lb的b数组最后把答案赋给ans数组 并顺便计算出ans的长度(便于输出) 
    print(ans,len);//输出函数 
}

建图

void add(int u,int v,int w)
{
    t[++num]=(node){ head[u],v,w };
    head[u]=num;
}

(a + b) % p = (a%p + b%p) %p (对)

(a - b) % p = (a%p - b%p) %p (对)

(a * b) % p = (a%p * b%p) %p (对)

(a / b) % p = (a%p / b%p) %p (错)


```

上一篇:未解之谜-暂时走到这里


下一篇:Codeforces Round #129 (Div. 1)E. Little Elephant and Strings