[技巧] 超级快读快写

原始来源:https://www.cnblogs.com/tudouuuuu/p/14091196.html

经过lhxPeppaEvenPig 改动优化而成;

lhx提供终极版;

#define FI(n) FastIO::read(n)
#define FO(n) FastIO::write(n)
#define Flush FastIO::Fflush()
namespace FastIO {
    const int SIZE = 1 << 16;
    char buf[SIZE], obuf[SIZE], str[60];
    int bi = SIZE, bn = SIZE, opt;
    inline int read(register char *s) {
        while(bn) {
            for (; bi < bn && buf[bi] <= ' '; bi = -~bi);
            if (bi < bn) break;
            bn = fread(buf, 1, SIZE, stdin);
            bi &= 0;
        }
        register int sn=0;
        while(bn) {
            for (; bi < bn && buf[bi] > ' '; bi = -~bi) s[sn++] = buf[bi];
            if(bi < bn) break;
            bn = fread(buf,1,SIZE,stdin);
            bi &= 0;
        }
        s[sn] &= 0;
        return sn;
    }
    inline bool read(register int &x){
        int n = read(str), bf = 0;
        if(!n) return 0;
        register int i=0;
        (str[i] == '-') && (bf = 1, i = -~i);
		(str[i] == '+') && (i = -~i);
        for (x = 0; i < n; i = -~i) x = (x << 3) + (x << 1) + (str[i] ^ 48);
        bf && (x = ~x + 1);
        return 1;
    }
    inline bool read(register long long &x) {
        int n = read(str), bf = 1;
        if(!n) return 0;
        register int i=0;
        (str[i] == '-') && (bf = -1,i = -~i);
        for (x = 0; i < n; i= -~i) x = (x << 3) + (x << 1) + (str[i] ^ 48);
        (bf < 0) && (x = ~x + 1);
        return 1;
    }
    inline void write(register int x) {
        if(!x) obuf[opt++] = '0';
        else {
            (x < 0) && (obuf[opt++] = '-', x = ~x + 1);
            register int sn = 0;
            while(x) str[sn++] = x % 10 + '0', x /= 10;
            for (register int i = sn - 1; i >= 0; i = ~-i) obuf[opt++] = str[i];
        }
        (opt >= (SIZE >> 1)) && (fwrite(obuf, 1, opt, stdout), opt &= 0);
    }
    inline void write(register long long x) {
        if(!x) obuf[opt++] = '0';
        else {
            (x < 0) && (obuf[opt++] = '-', x = ~x + 1);
            register int sn = 0;
            while(x) str[sn++] = x % 10 + '0', x /= 10;
            for (register int i = sn - 1; i >= 0; i = ~-i) obuf[opt++] = str[i];
        }
        (opt >= (SIZE >> 1)) && (fwrite(obuf, 1, opt, stdout), opt &= 0);
    }
    inline void write(register unsigned long long x){
        if(!x) obuf[opt++] = '0';
        else {
            register int sn=0;
            while(x) str[sn++] = x % 10 + '0', x /= 10;
            for (register int i = sn - 1 ; i >= 0 ; i = ~-i)obuf[opt++] = str[i];
        }
        (opt >= (SIZE >> 1)) && (fwrite(obuf, 1, opt, stdout), opt &= 0);
    }
    inline void write(register char x) {
        obuf[opt++] = x;
        (opt >= (SIZE >> 1)) && (fwrite(obuf, 1, opt, stdout), opt &= 0);
    }
    inline void Fflush(){
        opt && fwrite(obuf, 1, opt, stdout);
        opt &= 0;
    }
}

实例:Luogu P2495 [SDOI2011] 消耗战

cpalhx 大力卡常而成;

点击查看代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define ls id<<1
#define rs id<<1|1
using namespace std;
#define FI(n) FastIO::read(n)
#define FO(n) FastIO::write(n)
#define Flush FastIO::Fflush()
namespace FastIO {
    const int SIZE = 1 << 16;
    char buf[SIZE], obuf[SIZE], str[60];
    int bi = SIZE, bn = SIZE, opt;
    double D[] = {0.1, 0.01, 0.001, 0.0001, 0.00001, 0.000001, 0.0000001, 0.00000001, 0.000000001, 0.0000000001};
 
    inline int read(register char *s) {
        while (bn) {
            for (; bi < bn && buf[bi] <= ' '; bi=-~bi);
            if (bi < bn) break;
            bn = fread(buf, 1, SIZE, stdin);
            bi &= 0;
        }
        register int sn = 0;
        while (bn) {
            for (; bi < bn && buf[bi] > ' '; bi=-~bi) s[sn++] = buf[bi];
            if (bi < bn) break;
            bn = fread(buf, 1, SIZE, stdin);
            bi &= 0;
        }
        s[sn] &= 0;
        return sn;
    }
 
    inline bool read(register int &x) {
        int n = read(str), bf = 0;
        if (!n) return 0;
        register int i = 0;
        if (str[i] == '-') bf = 1, i=-~i; else if (str[i] == '+') i=-~i;
        for (x = 0; i < n; i=-~i) x = (x<<3)+(x<<1)+(str[i]^48);
        if (bf) x = ~x+1;
        return 1;
    }
 
    inline bool read(register long long &x) {
        int n = read(str), bf;
        if (!n) return 0;
        register int i = 0;
        if (str[i] == '-') bf = -1, i=-~i; else bf = 1;
        for (x = 0; i < n; i=-~i) x = (x<<3)+(x<<1)+(str[i]^48);
        if (bf < 0) x = ~x+1;
        return 1;
    }
 
    inline void write(register int x) {
        if (!x) obuf[opt++] = '0';
        else {
            if (x < 0) obuf[opt++] = '-', x = ~x+1;
            register int sn = 0;
            while (x) str[sn++] = x % 10 + '0', x /= 10;
            for (register int i = sn - 1; i >= 0; i--) obuf[opt++] = str[i];
        }
        if (opt >= (SIZE >> 1)) {
            fwrite(obuf, 1, opt, stdout);
            opt &= 0;
        }
    }
 
    inline void write(register long long x) {
        if (!x ) obuf[opt++] = '0';
        else {
            if (x < 0) obuf[opt++] = '-', x = ~x+1;
            register int sn = 0;
            while (x) str[sn++] = x % 10 + '0', x /= 10;
            for (register int i = sn - 1; i >= 0; i--) obuf[opt++] = str[i];
        }
        if (opt >= (SIZE >> 1)) {
            fwrite(obuf, 1, opt, stdout);
            opt &= 0;
        }
    }
 
    inline void write(register unsigned long long x) {
        if (!x) obuf[opt++] = '0';
        else {
            register int sn = 0;
            while (x) str[sn++] = x % 10 + '0', x /= 10;
            for (register int i = sn - 1; i >= 0; i--) obuf[opt++] = str[i];
        }
        if (opt >= (SIZE >> 1)) {
            fwrite(obuf, 1, opt, stdout);
            opt &= 0;
        }
    }
 
    inline void write(register char x) {
        obuf[opt++] = x;
        if (opt >= (SIZE >> 1)) {
            fwrite(obuf, 1, opt, stdout);
            opt &= 0;
        }
    }
 
    inline void Fflush() {
        if (opt) fwrite(obuf, 1, opt, stdout);
        opt &= 0;
    }
};
long long n, m;
struct sss{
	long long t, ne, w;
}ed[1000005], e[1000005];
long long he[1000005], ccnt;
inline void adde(register long long u,register  long long v, register long long ww) {
	ed[++ccnt]={v,he[u],ww};
	he[u]=ccnt;
}
long long s[1000005], scnt;
long long h[1000005], cnt;
inline void add(register long long u, register long long v,register  long long ww) {
	e[++cnt].t = v;
	e[cnt].ne = h[u];
	s[++scnt] = u;
	h[u] = cnt;
	e[cnt].w = ww;
}
long long b[1000005];
long long f[500005][20];
long long dfn[1000005], dep[1000005], dcnt, siz[1000005], hson[1000005], htop[1000005], nfd[1000005];
long long d[1000005], o;
long long a[1000005], acnt;
bool vis[1000005];
namespace seg{
	struct sas{
		long long l, r, mi;
	}tr[3000005];
	inline void bt(register long long id,register  long long l,register  long long r) {
		tr[id].l = l;
		tr[id].r = r;
		if (l == r) {
			tr[id].mi = b[nfd[l]];
			return;
		}
		register long long mid = (l + r) >> 1;
		bt(ls, l, mid);
		bt(rs, mid + 1, r);
		tr[id].mi = min(tr[ls].mi, tr[rs].mi);
		}
	inline long long ask(register long long id,register  long long l,register  long long r) {
		if (tr[id].l >= l && tr[id].r <= r) return tr[id].mi;
		register long long mid = (tr[id].l + tr[id].r) >> 1;
		if (r <= mid) return ask(ls, l, r);
		else if (l > mid) return ask(rs, l, r);
		return min(ask(ls, l, mid), ask(rs, mid + 1, r));
	}
}
inline void dfs1(register long long x,register  long long fa) {
	f[x][0] = fa;
	dep[x] = dep[fa] + 1;
	siz[x] = 1;
	hson[x] = -1;
	for (register long long i = he[x]; i; i = ed[i].ne) {
		register long long u = ed[i].t;
		if (u == fa) continue;
		dfs1(u, x);
		siz[x] += siz[u];
		if (hson[x] == -1 || siz[hson[x]] < siz[u]) hson[x] = u;
	}
}
inline void dfs(register long long x) {
	for (register long long i = he[x]; i; i = ed[i].ne) {
		register long long u = ed[i].t;
		if (u == f[x][0]) continue;
		b[u] = ed[i].w;
		dfs(u);
	}
}
inline void dfs2(register long long x,register  long long t) {
	htop[x] = t;
	dcnt=-~dcnt;
	dfn[x] = dcnt;
	nfd[dcnt] = x;
	if (hson[x] == -1) return;
	dfs2(hson[x], t);
	for (register long long i = he[x]; i; i = ed[i].ne) {
		register long long u = ed[i].t;
		if (u != f[x][0] && u != hson[x]) dfs2(u, u);
	}
}
inline long long lca(register long long x,register  long long y) {
	if (x == y) return x;
	if (dep[x] < dep[y]) swap(x, y);
	for (register long long i = 18; i >= 0; i--) {
		if (dep[f[x][i]] >= dep[y]) x = f[x][i];
	}
	if (x == y) return x;
	for (register long long i = 18; i >= 0; i--) {
		if (f[x][i] != f[y][i]) {
			x = f[x][i];
			y = f[y][i];
		}
	}
	return f[x][0];
}
inline bool cmp(register long long x,register  long long y) {
	return dfn[x] < dfn[y];
}
inline long long min(register long long x,register long long y){return x<y?x:y;}
inline long long ask_dis(register long long x,register  long long y) {
	register long long ans = 0x3f3f3f3f3f3f3f3f;
	while(htop[x] ^ htop[y]) {
		if (dfn[htop[x]] < dfn[htop[y]]) swap(x, y);
		ans = min(ans, seg::ask(1, dfn[htop[x]], dfn[x]));
		x = f[htop[x]][0];
	}
	if (x == y) return ans;
	if (dfn[x] > dfn[y]) swap(x, y);
	ans = min(ans, seg::ask(1, dfn[x] + 1, dfn[y]));
	return ans;
}
inline void bvt() {
	acnt &= 0;
	sort(d + 1, d + 1 + o, cmp);
	for (register long long i = 1; i < o; i=-~i) {
		a[acnt=-~acnt] = d[i];
		a[acnt=-~acnt] = lca(d[i], d[i + 1]);
	}
	a[acnt=-~acnt] = d[o];
	sort(a + 1, a + 1 + acnt, cmp);
	acnt = unique(a + 1, a + 1 + acnt) - (a + 1);
	for (register long long i = 1; i < acnt; i=-~i) {
		register long long lc = lca(a[i], a[i + 1]);
		add(lc, a[i + 1], ask_dis(lc, a[i + 1]));
	}
}
long long ff[1000005];
inline void initdfs(register long long x) {
	ff[x] &= 0;
	for (register long long i = h[x]; i; i = e[i].ne) {
		register long long u = e[i].t;
		initdfs(u);
	}
}
inline void dpfs(register long long x) {
	for (register long long i = h[x]; i; i = e[i].ne) {
		register long long u = e[i].t;
		dpfs(u);
		if (!vis[u]) ff[x] = ff[x] + min(ff[u], e[i].w);
		else ff[x] = ff[x] + e[i].w;
	}
}
int main() {
	FI(n);
	register long long x, y, w;
	for (register long long i = 1; i <= n - 1; i=-~i) {
		FI(x);
		FI(y);
		FI(w);
		adde(x, y, w);
		adde(y, x, w);
	}
	dfs1(1, 0);
	dfs(1);
	dfs2(1, 1);
	seg::bt(1, 1, dcnt);
	for (register long long j = 1; j <= 18; j=-~j) {
		for (register long long i = 1; i <= n; i=-~i) {
			f[i][j] = f[f[i][j - 1]][j - 1];
		}
	}
	FI(m);
	register long long ss;
	for (register long long i = 1; i <= m; i=-~i) {
		FI(ss);
		o &= 0;
		for (register long long j = 1; j <= ss; j=-~j) {
			FI(d[o=-~o]);
			vis[d[o]] = true;
		}
		d[o=-~o] = 1;
		bvt();
		initdfs(1);
		dpfs(1);
		FO(ff[1]);
		FO('\n');
		cnt &= 0;
		for (register long long j = 1; j <= scnt; j=-~j) {
			h[s[j]] &= 0;
		}
		scnt &= 0;
		for (register long long j = 1; j <= o; j=-~j) vis[d[j]] &= 0;
	}
	Flush;
	return 0;
}
posted @ 2024-07-30 17:40  Peppa_Even_Pig  阅读(57)  评论(2编辑  收藏  举报