首页 > 其他分享 >[技巧] 超级快读快写

[技巧] 超级快读快写

时间:2024-07-30 17:39:01浏览次数:9  
标签:opt 技巧 ++ 超级 register long 快读 inline obuf

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

经过lhxPeppaEvenPig 改动优化而成;

#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;
    }
};

实例: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;
}

标签:opt,技巧,++,超级,register,long,快读,inline,obuf
From: https://www.cnblogs.com/PeppaEvenPig/p/18333021

相关文章

  • 超级好用的JSON可视化工具
    理想的在线JSON工具,应该支持快速格式化、可压缩、快捷复制、可下载导出,对存在语法错误的地方能明确显示。提供搜索定位功能,可视区足够大,最好支持全屏。经过多方面对比,以下工具能满足这个需求: 工具地址直达:在线JSON可视化工具工具支持全屏模式操作,通过搜索框可以快速进行查找,双......
  • Linux安装redis(超级详细)
    持续关注我,我将分享一个网站完整的搭建过程!序号内容链接1linux安装jdk1.8https://blog.csdn.net/weixin_43836859/article/details/1404782392linux安装mysql5.7https://blog.csdn.net/weixin_43836859/article/details/1406272333linux安装redishttps://blog.csdn.net/we......
  • 【编码技巧】总结一个稳定而高效的方法,将二维关系数据转换为树形结构
        产品或项目开发过程中,经常遇到一些存在上下级关系的树形结构,但在数据库中存储为二维表关系数据的情况。而前端树形控件又要求按照树形层级组织数据,这就存在一个平铺的关系数据转换为树形层级结构的典型问题。    表结构及二维数据示例(以id,parentid自关联为例):......
  • SRC漏洞挖掘上分技巧(非常详细)零基础入门到精通,收藏这一篇就够了
    0x00简介今天就分享一下公益SRC漏洞的批量挖掘的技巧和所要用到的一些相关的工具和脚本出来和各位师傅交流一下,不足之处还希望师傅们多多指教。0x01国内的一些公益src漏洞平台漏洞盒子:https://www.vulbox.com``补天漏洞响应平台:https://www.butian.net``CNNVD信......
  • Python的使用技巧整理——100个Python使用技巧代码和运行结果(上)
    整理一些更实用的Python编程技巧,这些技巧将涵盖性能优化、代码简洁性、调试和测试等方面,并提供具体的代码示例和结果。以下是详细的内容:1.列表生成表达式列表生成表达式不仅简洁,还能提高性能。#示例代码squares=[x**2forxinrange(10)]print(squares)运行结果:[......
  • 关于管理者上台讲话技巧
    关于管理者上台讲话技巧的指南,它强调了四个关键要点,旨在帮助管理者提升演讲能力,增强沟通效果和个人影响力。首先,指出“讲话要大声”。       这一点强调了声音的力量,认为大声讲话不仅能使听众更清晰地听到内容,还能展现领导者的自信和气质。在公开场合,适度的音量提升可以显......
  • CSS学习文档(5):精灵图、CSS三角、用户界面样式、vertical-align属性应用、常见布局技巧
    目录一、精灵图1、目的:2、核心原理:3、精灵图基本使用二、CSS三角1、css三角:2、核心原理:3、京东三角案例:三、用户界面样式1、定义:2、鼠标样式:3、轮廓线outline4、防止拖拽文本域resize四、vertical-align属性应用1、使用场景2、解决图片底部空白缝隙问题五、......
  • 2024“钉耙编程”中国大学生算法设计超级联赛(2)
    女神的睿智voidsolve(){strings;cin>>s;inta=0,b=0;for(inti=0;i<s.size();++i){if(s[i]==s[0])a++;if(s[i]==s[4])b++;}if(s[0]==s[4])cout<<s[0]<<'\n'......
  • 【C语言】VS实⽤调试技巧
    VS实⽤调试技巧1.什么是bug?2.什么是调试?3.debug和release4.VS调试快捷键4.1环境准备4.2调试快捷键5.监视和内存观察5.1监视5.2内存6.调试举例17.调试举例28.调试举例3:扫雷9.编程常⻅错误归类9.1编译型错误9.2链接型错误9.3运⾏时错误1.什么是bug?......
  • 2024“钉耙编程”中国大学生算法设计超级联赛(4)
    Preface最唐氏的一集,有人写03一直过不去红温了然后白兰了一整场,怎么回事呢最后很可惜06因为多维数组调用时顺序出了点问题,导致cache爆了然后常数太大TLE了,但凡时间延长1min都改完过了由于今天过的题少就只写过了的六个题,剩下时间还要写昨晚CF的博客最优K子段......