学习资料

本博客tag

我的Tag列表

FFT入门

线段树入门

数位dp入门

在n+m位二进制数中填入m个1的方案数为c(n+m,m),不填1的其余n位自动填0。再减去不符合要求的C(n+m,m-1)n次入栈m次出栈的合法排列次数。可参考卡特兰数公式。C(n+m,m)-C(n+m,m-1)

闲了滚去入门Python

tls题目集

叉姐的FFT讲义

字符串算法选讲

斐波那契循环节,数学

令人叹服的数学”巧合“

正n边形面积 n*a*a/(4*tan(PI/n))

2017多校5 01代码 bitset的使用

版权属于fls  

 

无脑背包

void ZeroOnePack(int cost,int weight) {
     for (int i = v; i >= cost; i--)
         dp[i] = max(dp[i],dp[i - cost] + weight);
 }
 void CompletePack(int cost,int weight) {
     for (int i = cost; i <= v; i++)
         dp[i] = max(dp[i],dp[i - cost] + weight);
 }
 void MultiplePack(int cost,int weight,int n) {
    if (cost * n > v) {
        CompletePack(cost,weight);
    } else {
        int k = 1;
        while (k < n) {
            ZeroOnePack(cost * k,weight * k);
            n -= k;
            k *= 2;
        }
        ZeroOnePack(cost * n,weight * n);
    }
}

矩阵模板

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=105;
int G;
struct MX
{
    ll v[N][N];
    void O()
    {
        memset(v,0,sizeof v);
    }
    void E()
    {
        memset(v,0,sizeof v);
        for(int i=0; i<G; i++)v[i][i]=1;
    }
    void P()
    {
        for(int i=0; i<G; i++)
            for(int j=0; j<G; j++)printf(j==G-1?"%d\n":"%d ",v[i][j]);
    }
    MX operator+(const MX &b) const
    {
        MX c;
        c.O();
        for(int i=0; i<G; i++)
            for(int j=0; j<G; j++)c.v[i][j]=v[i][j]+b.v[i][j];
        return c;
    }
    MX operator*(const MX &b)const
    {
        MX c;
        c.O();
        for(int k=0; k<G; k++)
            for(int i=0; i<G; i++)
                if(v[i][k])for(int j=0; j<G; j++)c.v[i][j]+=v[i][k]*b.v[k][j];
        return c;
    }
    MX operator^(int p)const
    {
        MX y,x;
        y.E(),memcpy(x.v,v,sizeof(v));
        for(; p; x=x*x,p>>=1)if(p&1)y=y*x;
        return y;
    }
} a,ans;

 马拉车

char a[110010];
char b[230000]="$";
int p[230000];
int len;
int main(){
    while(scanf("%s",a)!=EOF){
        for(int i=0;i==0 || a[i-1]!='\0';i++){
            b[i*2+1]='#';
            b[len=(i*2+2)]=a[i];
        }
        int mx=0,id=0,res=1;
        for(int i=1;i<len;i++){
            p[i]=mx>i?min(p[2*id-i],mx-i):1;
            while(b[i+p[i]]==b[i-p[i]])++p[i];
            if(i+p[i]>mx)mx=i+p[i],id=i;
            if(p[i]>res)res=p[i]-1;
        }
        printf("%d\n",res);
    }
    return 0;
}

 快速乘O(1)

inline long long multi(long long x,long long y,long long mod)
{
long long tmp=(x*y-(long long)((long double)x/mod*y+1.0e-8)*mod);
return tmp<0 ? tmp+mod : tmp;
}

 fastIO

namespace fastIO
{
#define BUF_SIZE 100000
bool IOerror=0;
inline char nc()
{
    static char buf[BUF_SIZE],*p1=buf+BUF_SIZE,*pend=buf+BUF_SIZE;
    if(p1==pend)
    {
        p1=buf,pend=buf+fread(buf,1,BUF_SIZE,stdin);
        if(pend==p1)
        {
            IOerror=1;
            return-1;
        }
    }
    return *p1++;
}
inline bool blank(charch)
{
    return ch==''||ch=='\n'||ch=='\r'||ch=='\t';
}
inline void read(int&x)
{
    charch;
    while(blank(ch=nc()));
    if(IOerror)return;
    for(x=ch-'0'; (ch=nc())>='0'&&ch<='9'; x=x*10+ch-'0');
}
#undef BUF_SIZE
};
using namespace fastIO;

 

 

具体数学中文版目录

黑书上的DP例题

天梯赛经验

TOJ贪心用栈实现经典

TOJ 题目分类

NB的在线编程

必应在线翻译

曾经的个人水博

/*  二分图匹配
* 匈牙利算法邻接表形式  
* 使用前用init()进行初始化,给uN赋值
* 加边使用函数addedge(u,v) 
*/ 
const int MAXN = 50100;//点数的最大值 
const int MAXM = 500100;//边数的最大值 
struct Edge {
    int to,next; 
}edge[MAXM]; 
int head[MAXN],tot,uN; 
void init(int un) {
    uN = un;
    tot = 0;     
    memset(head,-1,sizeof(head)); 
} 
void addedge(int u,int v) {
    //cout<<"add"<<u<<" "<<v<<endl;
    edge[tot].to = v; 
    edge[tot].next = head[u];     
    head[u] = tot++; 
} 
int linker[MAXN]; 
bool used[MAXN]; 
bool dfs(int u) {     
    for(int i = head[u]; i != -1;i = edge[i].next){
        int v = edge[i].to;
        if(!used[v]){
            used[v] = true;
            if(linker[v] == -1 || dfs(linker[v])){
                linker[v] = u;
                return true;
            }
        }
    }
    return false;
}
int hungary(){
    int res = 0;
    memset(linker,-1,sizeof(linker));
    for(int u = 0; u < uN;u++){//点的编号0~uN-1
        memset(used,false,sizeof(used));
        if(dfs(u))
            res++;
    }
    return res;
}

 简单的班级名字对比,当然也可以用C#直接操作excel文件

#include <bits/stdc++.h>
using namespace std;
set<string>S;
string s;
int main()
{
    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);
    for(int i=0;i<49;i++)
        cin>>s,S.insert(s);
    while(cin>>s)S.erase(s);
    for(auto X:S)
        cout<<X<<endl;
    return 0;
}

 

多边形重心

#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
 
double cross(double a[2],double b[2]){   //求向量a,b的叉积大小
    return a[0]*b[1]-a[1]*b[0];
}
 
int main(){
    int ncase;
    cin>>ncase;
    while(ncase--){
        int i,k;
        double S,tS,a[10002][2],sx,sy;
        cin>>k;
        for(i=1;i<=k;i++)
            cin>>a[i][0]>>a[i][1];
        S=0.;sx=0.;sy=0.;          //S面积,xy横纵坐标和
        for(i=1;i<=k;i++){
            tS=cross(a[i],a[i%k+1])/2.;
            S+=tS;
            sx+=tS*(a[i][0]+a[i%k+1][0])/3;
            sy+=tS*(a[i][1]+a[i%k+1][1])/3;
        }
        if(fabs(S)<1e-7)
            puts("0.000 0.000");
        else
            printf("%.3lf %.3lf\n",fabs(S),(sx+sy)/S);
    }
    system("pause");
    return 0;
}

 

posted @ 2017-08-14 15:59  暴力都不会的蒟蒻  阅读(680)  评论(0编辑  收藏  举报