Modelcode

个人用的 模板 不喜勿喷

考试有用的部分

1.这个是自己非用STL写的板子 优化极差 还是建议STL

void sortfast(int l,int r){
    int i,j,mid,p;
    i=l;j=r;
    mid=a[(l+r)/2];
    do{
        while(a[i]<mid) i++;
        while(a[j]>mid) j--;
        if(i<=j)
        {
            p=a[i];a[i]=a[j];a[j]=p;
        }
      }
      while(i<=j);
      if(l>j) sortfast(l,j);
      if(i<r) sortfast(i,r);
    }
    

2.一个并没用什么卵用的冒泡排序 适用于写一写红题

void maopao(int m,int n){
    for(int i=n;i>0;i--){
        for(int j=1;j<i;j++){
            if(a[j]>=a[j+1])
            sqrt(a[j],a[j+1]);
        }
    }
}

3.这个是考试必备的freopen (据说我们这届机房有个人退役前次次炸freopen)

//freopen
freopen("std.in","r",stdin);
freopen("std.out","w",stdout);
/*中间开始写代码*/
fclose(stdin);fclose(stdout);

奇奇怪怪的板子

4.这是一个不怎么建议用的指针建树

//建树
typedef struct node;
typedef node*tree;
struct node{
    char data;
    tree lchild,rchild;
}; tree bt;
void build(tree &bt){
    int x=0;
    while(s[x]!='!'){
    bt=new node;
    bt->data=s[x];//s[x]是在main函数里输入的
    build(bt->lchild);
    build(bt->rchild);
    x++; 
    }
}

提高组的某些板子

5.个人建议用链式前向星


//链式前向星
int tot,head[N>>1];
struct point{
	int n;
	int v;
	ll w;
	int nex;
}p[N];
void add(int a,int b){
	p[++tot]=(point){a,b,head[a]};
	head[a]=tot;
}

6.这个堆我没咋用 用stl的大根堆

//堆
void put(int d)
{
    int now,next;
    heap[++heap_size]=d
    now=heap_size;
    while(now>1)
    {
        next=now>>1;//>>相当于/2
        if(heap[now]>=heap[next])return;//符合条件,返回
        swap(heap[now],heap[next]);
    }
}

//stl的大根堆<->小根堆
struct node{
    int first,second;
    friend bool operator < (node x,node y){return x.first>y.first;}
};
priority_queue<node>q;

7.据说是一个优化cin的方法 但是有个bug 有人在csp的考场上试过

//时间差
ios::sync_with_stdio(false);
//优化。打消iostream的输入输出缓存
使得cin cout 时间和printf scanf 相差无几

8.快读的模板


//快读
inline int read(){
    int x=0; bool f=1; char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
    for(; isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';
    if(f) return x;
    return 0-x;
}
//模板2
int read() {

    int s=0,f=1;char ch=getchar();

    while(ch<'0' || ch>'9') {if(ch=='-')f=-1;ch=getchar();}

    while(ch>='0' && ch<='9'){s=(s<<3)+(s<<1)+(ch^48);ch=getchar();}

    return s*f;

}


9.压缩过的完全背包的板子 直接背诵即可
```cpp
//完全背包
const ll MAXN=1e6+7;
ll f[10000005],v[10000005],c[10005],tiji,num;

int main(){
    cin>>tiji>>num;
    for(ll i=1;i<=num;i++) cin>>v[i]>>c[i];
    for(ll i=1;i<=num;i++)
        for(ll j=v[i];j<=tiji;j++)
            f[j]=max(f[j],f[j-v[i]]+c[i]);
    cout<<f[tiji];
    return 0;
}

背包问题

10.一个最基础的01背包 没什么好说的

//01背包问题
const int MAXN=1e6;
ll f[MAXN],v[MAXN],c[MAXN],tiji,num;

int main(){
    cin>>tiji>>num;
    for(ll i=1;i<=num;i++) cin>>v[i]>>c[i];
    for(ll i=1;i<=num;i++)
        for(ll j=tiji;j>=v[i];j--)
            f[j]=max(f[j],f[j-v[i]]+c[i]);
    cout<<f[tiji];
    return 0;
}
  1. 多重背包
//多重背包
for(int i=1;i<=n;i++)
{
    if(w[i]*a[i]>m)
    {
        for(int c=0;c<=m;c++)
        {
        if(c>=w[i])
        f[c]=max(f[c],f[c-w[i]]+v[i]);
        }
    }
    else
    {
         k=1;amount=a[i];
         while(k<amount)
         {
             for(int c=k*w[i];c>=0;c--)
             {
                 if(c>=w[i])
                 f[c]=max(f[c],f[c-w[i]]+k*v[i]);
             }
             amount-=k;
             k<<=1;
         }  
         for(int c=amount*w[i];c>=0;c--)
         {
             f[c]=max(f[c],f[c-w[i]]+amount*v[i]);
         }
    } 
}

几何问题

  1. 叉积求法与距离
struct c {
	double x,y;
} a[100010],s[100010];

double work(c a,c b)
{
	return sqrt((b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y));
}

double check(c k,c x,c y)
{
	return (x.x-k.x)*(y.y-k.y)-(x.y-k.y)*(y.x-k.x);
}

图论部分

  1. dij 多起点搜索
void dijkstra() {

//	memset(vis,0,sizeof(vis));
	while(!q.empty()) {
		int x=q.top().second;
		q.pop();
		for(int i=head[x]; i; i=p[i].nxt) {
		    if(vis[p[i].v]) continue;
			if(dis[p[i].v] > dis[x] + 1) {
				dis[p[i].v] = dis[x] + 1;
				vis[p[i].v]=1;
				q.push((node){dis[p[i].v],p[i].v});
			}
		}
	}
	for(int i = 1;i <= n ;i ++)
	{
	    cout<<dis[i]<<" ";
	}
}
int main()
{
	//省略读入节点过程
	 memset(dis,INF,sizeof(dis));
	for(int  i = 1 ; i <= q1; i ++)
	{
	    int tmp = read( );
	    dis[tmp] = 0;
	    q.push((node){dis[tmp],tmp});

	}dijkstra();
}

数据结构

树上结构

1.FHQ

#include <iostream>
#include <cstdio>
#include <bits/stdc++.h>
#define _for(i,a,b) for(int (i) = (a); i <= (b); i++)
using namespace std;

int T;
int n,m,k;
int f[100002];

struct node
{
	int val,key,siz;
	int ls,rs;
}t[1000002];
int root[100002],tot =0 ;

mt19937 rnd(time(0));

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

//FHQ's soul
void push_up(int p)
{
	t[p].siz  = t[t[p].ls].siz+ t[t[p].rs].siz+1;
	return; 
}

void split_val(int p ,int val,int &x,int &y)
{
	if(p == 0) 
	{
		x = y = 0;
		return;
	}
	if(t[p].val <= val)
	{
		x = p;
		split_val(t[p].rs,val,t[p].rs,y);
	}
	else
	{
		y = p ;
		split_val(t[p].ls,val,x,t[p].ls);
	}
	push_up(p);
	return ;
	//按照权值来分裂 
}

void split_rank(int p ,int k,int &x,int &y)
{
	if(p == 0)
	{
		x = y =0;
		return;
	}
	if(t[t[p].ls].siz  < k)
	{
		x = p;
		split_rank(t[p].rs,k - t[t[p].ls].siz - 1,t[p].rs,y);
		//把它丢到左子树上处理 val那个同理,懒得写了;
		//里面的最多不可能为k了
	}
	else 
	{
		y = p ; 
		split_rank(t[p].ls,k,x,t[p].ls);
	}
	push_up(p);
	return ;
}

int merge(int x,int y)
{
	if(!x||!y) return x|y;
	if(t[x].key < t[y].key)
	{
		t[x].rs = merge(t[x].rs,y);
		push_up(x);
		return x;
	}
	else
	{
		t[y].ls = merge(x,t[y].ls);
		push_up(y);return y;
	}
}

vector<int> pool;

int newnode(int val)
{
	int tmp;
	if(pool.empty( )) tmp = ++tot;
	else
	{
		tmp = pool.back( );
		pool.pop_back( );
	}
	t[tmp].val = val; t[tmp].key = rnd();
	t[tmp].siz = 1;t[tmp].ls = t[tmp].rs = 0;
	return tmp;
}

int _find(int p ,int val)
{
	int x,y,z;
	split_val(root[p],val -1,x,y);
	split_val(y,val,y,z);
	int ans = (y == 0 ? -1 : y);
	root[p] = merge(merge(x,y),z);
	return ans;
}

void _delete(int p,int val)
{
	int x,y,z;
	split_val(root[p],val - 1,x,y);
	split_rank(y,1,y,z);
	pool.push_back(y);
	root[p] = merge(x,z);
	return ;
}

int insert(int p, int val)
{
	int tmp = _find(p,val);
	while(tmp != -1)
	{
		_delete(p,val);
		val++ ;tmp = _find(p,val);
	}
	int x,y;
	split_val(root[p],val - 1,x, y);
	root[p] = merge(merge(x,newnode(val)),y);
	return val;
}

int ask_max(int p)
{
	p = root[p];
	while(t[p].rs) p = t[p].rs;
	return t[p].val;
}

void print_tree(int p)
{
	if(p == 0) return;
	if(t[p].ls) print_tree(t[p].ls);
	printf("%d ",t[p].val);
	if(t[p].rs) print_tree(t[p].rs);
	return;
}

int main( )
{
	// freopen("food.in","r",stdin);
	// freopen("food.out","w",stdout);
	T = read( );	
	while(T--)
	{
		n = read( );m = read( );k = read( );
		tot=0;pool.clear();
		int ans = 0 ;

		_for(i,1,m) f[i] = read(),root[i] = 0;
		_for(i,1,n)
		{
			int c = read( ),val = read( );
			int tmp = insert(c,val);
			// print_tree(root[c]);
			// cout<<endl;
			if(k == 1)
			{
				if(_find(f[c],tmp) != -1)
				{
					_delete(c,tmp);
					_delete(f[c],tmp);
				}
			}
		}
		_for(i,1,m) ans = max(ans,ask_max(i));
		printf("%d\n",ans);
	}
	fclose(stdin);fclose(stdout);
}
dubug的时候一定要注意你传了什么参数,否则会把自己抵死
posted @   mhunice  阅读(855)  评论(0)    收藏  举报
相关博文:
阅读排行:
· .NET中全新的MongoDb ORM框架 - SqlSugar
· 我救了一个网站,性能提升了1500 多倍!
· dotnet 代码调试方法
· .NET程序员的多语言笔记本:Polyglot Notebook
· 别再被 Spring Security 和 Shiro 劝退了!这款国产 Java 权限框架真香!
点击右上角即可分享
微信分享提示