[技巧] 超级快读快写
原始来源:https://www.cnblogs.com/tudouuuuu/p/14091196.html
经过lhx 和 PeppaEvenPig 改动优化而成;
由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;
}
}
点击查看代码
#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;
}