首页 > 编程语言 >C++常用模板

C++常用模板

时间:2024-05-20 21:45:08浏览次数:19  
标签:rt 常用 tot return int ll C++ long 模板

常用模板:

1. 组合数(注意 \(N\) 与 \(mod\))

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=1e3+10,mod=998244353;
ll n,a[N],jc[N],dp[N],ans;
void init(){
	jc[0]=1;
	for(int i=1;i<N;i++) jc[i]=jc[i-1]*i%mod;
} 
ll ksm(ll a,ll b){
	ll ct=1;
	while(b){
		if(b&1) ct=ct*a%mod;
		b>>=1,a=a*a%mod;
	}
	return ct;
}
ll C(ll n,ll m){
	return jc[n]*ksm(jc[n-m],mod-2)%mod*ksm(jc[m],mod-2)%mod;
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>n;init();
	for(int i=1;i<=n;i++) cin>>a[i];
	
	return 0;
}

2. 线段树(注意数组开 \(4\) 倍)

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=1e5+10;
ll b,p,q,k,n,m,t[N*4],a[N],lazy[N*4];
void build(ll rt,ll l,ll r){
	if(l==r){t[rt]=a[l];return;}
	ll mid=l+r>>1;
	build(rt<<1,l,mid);
	build((rt<<1)+1,mid+1,r);
	t[rt]=t[rt<<1]+t[(rt<<1)+1];
}
void fun(ll rt,ll l,ll r,ll v){
	t[rt]+=(r-l+1)*v;
	lazy[rt]+=v;
}
void pushdown(ll rt,ll l,ll r){
	ll mid=l+r>>1;
	fun(rt<<1,l,mid,lazy[rt]);
	fun((rt<<1)+1,mid+1,r,lazy[rt]);
	lazy[rt]=0;
}
void update(ll rt,ll l,ll r,ll rl,ll rr,ll k){
	if(r<rl||rr<l) return;
	if(l>=rl&&rr>=r){fun(rt,l,r,k);return;}
	pushdown(rt,l,r);
	ll mid=l+r>>1;
	update(rt<<1,l,mid,rl,rr,k);
	update((rt<<1)+1,mid+1,r,rl,rr,k);
	t[rt]=t[rt<<1]+t[(rt<<1)+1];
}
ll query(ll rt,ll l,ll r,ll rl,ll rr){
	if(r<rl||rr<l) return 0;
	if(l>=rl&&rr>=r) return t[rt];
	pushdown(rt,l,r);
	ll mid=l+r>>1;
	return query(rt<<1,l,mid,rl,rr)+query((rt<<1)+1,mid+1,r,rl,rr);
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,1,n);
  
}

3. dijkstra(\(N,M\) 和 \(inf\) 可能要改)

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=1e5+10,M=2e5+10,inf=(1ll<<31)-1;
ll n,m,s,dist[N],x,y,v;
vector<pair<ll,ll> > e[M];
set<pair<ll,ll> > q;
void dijkstra(ll s){
	q.clear();
	for(int i=1;i<=n;i++) dist[i]=inf;
	dist[s]=0;
	for(int i=1;i<=n;i++) q.insert({dist[i],i});
	while(!q.empty()){
		ll x=q.begin()->second;
		q.erase(q.begin());
		if(dist[x]==inf) break;
		for(auto y:e[x]){
			if(dist[x]+y.second<dist[y.first]){
				q.erase({dist[y.first],y.first});
				dist[y.first]=dist[x]+y.second;
				q.insert({dist[y.first],y.first});
			}
		}
	}
	for(int i=1;i<=n;i++)
		cout<<dist[i]<<" ";
}
int main(){
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin>>n>>m>>s;
    for(int i=1;i<=m;i++){
    	cin>>x>>y>>v;
    	e[x].push_back({y,v});
	}
	dijkstra(s);
	return 0;
}

4. lca

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=5e5+10;
ll n,a,b,s,m,l,ans,tot,f[N][55],h[N],de[N],r;
struct P{
	ll a,n;
}d[N*2];
void dfs(ll now,ll fa){
	f[now][0]=fa,de[now]=de[fa]+1;
	for(int i=1;i<=20;i++)
		f[now][i]=f[f[now][i-1]][i-1];
	for(int i=h[now];i!=0;i=d[i].n)
		if(d[i].a!=fa)
			dfs(d[i].a,now);
}
ll lca(ll x,ll y){
	if(de[x]>de[y]) x^=y^=x^=y;
	for(int i=20;i>=0;i--)
		if(de[f[y][i]]>=de[x])
			y=f[y][i];
	if(x==y) return x;
	for(int i=20;i>=0;i--)
		if(f[x][i]!=f[y][i])
			x=f[x][i],y=f[y][i];
	return f[x][0];
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>n>>m>>s;
	for(int i=1;i<n;i++){
		cin>>a>>b;
		d[++tot].a=b,d[tot].n=h[a],h[a]=tot;
		d[++tot].a=a,d[tot].n=h[b],h[b]=tot;
	}
	dfs(s,0);
	while(m--){		
		cin>>l>>r;
		cout<<lca(l,r)<<"\n";
	}
	return 0;
} 

标签:rt,常用,tot,return,int,ll,C++,long,模板
From: https://www.cnblogs.com/jianhe/p/18202839

相关文章

  • C123【模板】扩展域并查集 P1892 [BOI2003] 团伙
    视频链接:C123【模板】扩展域并查集P1892[BOI2003]团伙_哔哩哔哩_bilibili  P1892[BOI2003]团伙-洛谷|计算机科学教育新生态(luogu.com.cn)//扩展域并查集#include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;intn,m,a,b,......
  • 信息安全事件应急处理报告模板
    目录一、概述1.1应急处理服务背景1.2应急处理服务目的1.3应急处理服务范围1.4应急处理服务依据1.4.1应用处理服务委托协议1.4.2基础标准与法律文件1.4.3参考文件二、应急处理服务流程三、应急处理服务内容和方法3.1准备阶段3.1.1准备阶段工作流程3.1.2准备阶段处理过程3......
  • Java基础 韩顺平老师的 常用类 的部分笔记
    459,八大Wrapper类包装类的分类 1)针对八种基本数据类型相应的引用类型—包装类 2)有了类的特点,就可以调用类中的方法。  460,装箱和拆箱 packagecom.hspedu.Wrapper;publicclassWrapperType{publicstaticvoidmain(String[]args){//演示......
  • Visual Studio(VS)常用快捷键整理
    ​ 前言在使用VisualStudio编写代码时,使用快捷键能够提高编码效率,作为程序员,我们有必要记住一些比较常用的快捷键。这篇文章将记录我自己比较常用的快捷键,并根据我的使用情况,更新常用快捷键,以便更快更高效地编写代码,建议收藏到浏览器文件夹,并通过Ctrl+F,输入关键字快速定位到需......
  • C++的四种智能指针及简单实现
    C++的四种智能指针及简单实现参考:C++智能指针讲解及模拟实现一、auto_ptrauto_ptr有拷贝语义,拷贝后源对象变为空指针,可能引发严重问题template<classT>classmy_unique_ptr{private:T*_ptr;public://普通构造函数my_unique_ptr(T*ptr):_ptr(ptr){}......
  • [笔记]Git常用命令大全
    Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解`[笔记]Git常用命令大全日期:2018-6-16阿珏折腾代码浏览:1796次评论:4条继上一次后,抽空整理了个比较全的Git常用命令,找到了一张非常棒的导图,......
  • Oracel数据库常用命令集
    一、数据库常用查询1.查询数据库用户名SELECT*FROMALL_USERS;--或selectusernamefromsys.dba_users;2、查询数据库名selectnamefromv$database;---如果是管理员等同权限,也可通过SQL*Plus或SQLcl中使用以下语句showparameterdb;3、查询数据库的实例名se......
  • C++算法刷题基础
    1.main函数的返回类型一定是int2.C++语言为我们准备了一组内置库,包含了很多常用的功能,并且这些内置库可以直接使用,而其中的内置库:iostream,就提供了输入和输出的功能,允许开发者从键盘读取输入并在屏幕上输出结果。3.在iostream库中,我们有两个对象可以使用,分别是cin和cout。......
  • 侯捷C++上期笔记
    1.头文件和类、构造函数c++和c最大的不同在于C++会把数据以及处理数据的函数放到一个对象objects(class)里,不同类之间不可见,类似C中结构体struct防止头文件重复声明ifndefcomplex//当之前没有声明过这个头文件时,才进行后续的声明definecomplex(2)补充定义(1)类定义(3)类功能解释......
  • ide创建maven项目时,选择哪个模板
    创建新的java项目时,选择maven框架比较节省时间,因为部分文件和目录都会给你建好,免得自己再费力创建。  我们常用的三个框架为:1、cocoon-22-archetype-webapp 【如果创建带有页面的项目,可以选择这个】目录结构: 2、maven-archetype-quickstart  【......