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;
}
- 多重背包
//多重背包
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]);
}
}
}
几何问题
- 叉积求法与距离
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);
}
图论部分
- 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的时候一定要注意你传了什么参数,否则会把自己抵死
【推荐】FlashTable:表单开发界的极速跑车,让你的开发效率一路狂飙
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET中全新的MongoDb ORM框架 - SqlSugar
· 我救了一个网站,性能提升了1500 多倍!
· dotnet 代码调试方法
· .NET程序员的多语言笔记本:Polyglot Notebook
· 别再被 Spring Security 和 Shiro 劝退了!这款国产 Java 权限框架真香!