一些模板之类的

1. 现在用的头

#include <iostream>
#include <random>
#include <algorithm>
#include <cstdio>
#include <math.h>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <string.h>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define PER(i,a,n) for(int i=n;i>=a;--i)
#define hr putchar(10)
#define pb push_back
#define lc (o<<1)
#define rc (lc|1)
#define mid ((l+r)>>1)
#define ls lc,l,mid
#define rs rc,mid+1,r
#define x first
#define y second
#define io std::ios::sync_with_stdio(false)
#define endl '\n'
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int P = 1e9+7, INF = 0x3f3f3f3f;
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
ll qpow(ll a,ll n) {ll r=1%P;for (a%=P;n;a=a*a%P,n>>=1)if(n&1)r=r*a%P;return r;}
ll inv(ll x){return x<=1?1:inv(P%x)*(P-P/x)%P;}

2. Linux下对拍

while true; do
./r>input
./test<input>tmp.out
./right<input>tmp2.out
if diff tmp.out tmp2.out; then 
printf AC 
else
echo WA 
exit 0
fi 
done 

3. 生成一棵随机树, tp为边权范围, 为0表示无边权

int prufer[N], node[N], cnt;
set<int> gg;
int vis[N];
bool used[N];

void tree(int n, int tp) {
    gg.clear();
    memset(vis, 0, sizeof vis);
    memset(used, 0, sizeof used);
    cnt = 0;
    REP(i,1,n-2) {
        prufer[i]=rd()%n+1;
        ++vis[prufer[i]];
    }
    REP(i,1,n) if (!vis[i]) gg.insert(i);
    REP(i,1,n-2) {
        int v = *gg.begin(), u = prufer[i];
        if (tp>0) printf("%d %d %d\n", u,v,rd()%tp+1);
        else printf("%d %d\n",u,v);
        used[v] = 1;
        gg.erase(v);
        --vis[u];
        if (!vis[u]&&!used[u]) gg.insert(u);
    }
    auto it = gg.begin();
    int u=*it, v = *(++it);
    if (tp>0) printf("%d %d %d\n", u,v,rd()%tp+1);
    else printf("%d %d\n",u,v);
}

4. 二分判断有序序列$f$中是否存在$x$

int count(int x) {
    auto t = lower_bound(f+1,f+1+n,x);
    return t!=f+1+n&&*t==x;
}

5. 有序序列求最接近$x$的点距$x$的距离, 序列为空返回1e18 

ll calc(ll x) {
	auto t=lower_bound(a+1,a+1+n,x);
	ll mi = 1e18;
	if (t!=a+1+n) mi=min(mi,abs(*t-x));
	if (t!=a+1) --t,mi=min(mi,abs(*t-x));
	return mi;
}

6. 判断$abs(ab)$是否超出x, x为正

b&&abs(a)>x/abs(b)

7. 判断[L,R]范围内有多少个数被x整除

int calc(int L, int R) {
    if (L%x) L = (L+x-1)/x*x;
    if (R%x) R = R/x*x;
    if (L>R) return 0;
    return (R-L)/x+1;
}

8. 求两条树链公共部分

struct _ {int u,v,lca;};

_ solve(_ s, _ t) {
    if (!s.u) return t;
    if (!t.u) return s;
    _ r;
    int l;
    if (dep[l=lca(s.u,t.u)]>dep[s.lca]) r.u=l;
    else if (dep[l=lca(s.v,t.u)]>dep[s.lca]) r.u=l;
    else r.u=s.lca;
    if (dep[l=lca(s.v,t.v)]>dep[s.lca]) r.v=l;
    else if (dep[l=lca(s.u,t.v)]>dep[s.lca]) r.v=l;
    else r.v=s.lca;
    r.lca=lca(r.u,r.v);
    return r;
}

9. 预处理log2

Log[0] = -1;
REP(i,1,n) Log[i]=Log[i>>1]+1;

10. 离散化

REP(i,1,n) scanf("%d", a+i),b[i]=a[i];
sort(b+1,b+1+n),*b=unique(b+1,b+1+n)-b-1;
REP(i,1,n) a[i]=lower_bound(b+1,b+1+*b)-b;

猜你喜欢

转载自www.cnblogs.com/uid001/p/10496572.html