ACM个人零散知识点整理
ACM个人零散知识点整理
杂项:
1.输入输出外挂
//读入优化 int 整数
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<= '9') {
x=x*10+ch-'0';
ch=getchar();
}
return x * f;
}
2.关闭c+++输入输出限制流
使用的时候一定放在所有cin,cout的开头,不然会导致输入的内容发生错乱
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
图论:
1.链式前向星模板
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+5;
//init()
struct edgenode {
int w,next,to;
edgenode () {
next=w=to=0;
}
} edges[maxn];
int head[maxn];
int cnt=0;
//双向边调用两次即可
void addedge(int u, int v, int w) {
edges[cnt].to=v;
edges[cnt].w=w;
edges[cnt].next=head[u];
head[u]=cnt;
cnt++;
}
//遍历
void ask(int x) {
for(int i=head[x];i!=-1;i=edges[i].next) {
}
}
void init() {
memset(head,-1,sizeof(head));
}
int main() {
return 0;
}
2.最近公共祖先
tarjan离线
#include <bits/stdc++.h>
using namespace std;
const int maxn = 500001;
const int maxm = 1000001;
struct enode {
int next,to;
} edges[maxm];
struct qnode {
int next,id,to;//id第几次查询
} que[maxm];
int head_e[maxn];//前向星 edges
int head_q[maxn];//前向星 查询
int vis[maxn];
int f[maxn];//并查集父亲数组
int res[maxn];//结果
int cnte=0;
int cntq=0;
int n,m,s;
inline void addedge(int u, int v) {
edges[cnte].to=v;
edges[cnte].next=head_e[u];
head_e[u]=cnte++;
}
inline void addque(int u, int v, int id) {
que[cntq].to=v;
que[cntq].id=id;
que[cntq].next=head_q[u];
head_q[u]=cntq++;
}
//并查集访问父亲
int find(int x) {
return x==f[x] ? x : f[x] = find(f[x]);//压缩
}
void tarjan(int s) {
vis[s]=1;//先标记,不能在回溯时标记,因为双向边
f[s]=s;
for(int i=head_e[s]; i!=-1; i=edges[i].next) {
if(!vis[edges[i].to]) {
tarjan(edges[i].to);
f[edges[i].to]=s;
}
}
for(int i=head_q[s]; i!=-1; i=que[i].next) {
if(vis[que[i].to]==1) {
res[que[i].id]=find(que[i].to);
}
}
}
inline void init() {
memset(vis,0,sizeof(vis));
memset(head_e,-1,sizeof(head_e));
memset(head_q,-1,sizeof(head_q));
for(int i=1; i<=n; ++i) f[i]=i;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>s;
init();
int u,v;
for(int i=1; i<n; ++i) {
cin>>v>>u;
addedge(v,u);
addedge(u,v);
}
for(int i=1; i<=m; ++i) {
cin>>v>>u;
addque(u,v,i);
addque(v,u,i);
}
tarjan(s);
for(int i=1; i<=m; ++i) cout<<res[i]<<endl;
return 0;
}
ST倍增在线
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
using namespace std;
const int maxn = 100005;
struct node {
int to,next;
} edges[maxn<<1];
//注意head[]数组初始化
int head[maxn],cnt,dp[maxn][15],dep[maxn];
void add(int u, int v) {
edges[cnt].to=v;
edges[cnt].next=head[u];
head[u]=cnt++;
}
//节点 父亲节点
void dfs(int s, int x) {
dp[s][0]=x;
dep[s]=dep[x]+1;
int t;
//跟新到根节点一路上的祖先
for(int i=1; (1<<i)<=dep[x]; ++i) dp[s][i]=dp[dp[s][i-1]][i-1];
for(int i=head[s]; i!=-1; i=edges[i].next) {
t=edges[i].to;
if(t==x) continue;
dfs(t,s);
}
}
int lca(int u, int v) {
if(dep[v]>dep[u]) swap(u,v);
for(int i=14; i>=0; --i) {
if((dep[u]-dep[v])>=(1<<i)) {
u=dp[u][i];
}
}
//此时深度一定相同
if(u==v) return u;
for(int i=14; i>=0; --i) {
if((1<<i)<=dep[u]&&dp[u][i]!=dp[v][i]) {
u=dp[u][i];
v=dp[v][i];
}
}
//循环过程中不加判断可能会超过最近公共祖先,所以跟新到lca的儿子节点即可
return dp[u][0];
}
int main() {
int n,m,u,v;
scanf("%d %d",&n,&m);
cnt=0;
memset(head,-1,sizeof(head));
for(int i=1; i<n; ++i) {
scanf("%d %d",&u,&v);
add(u,v);
add(v,u);
}
dep[0]=1;
dfs(1,1);
for(int i=1; i<=m; ++i) {
scanf("%d %d",&u,&v);
printf("%d\n",lca(u,v));
}
return 0;
}
数论:
1.快速幂(矩阵快速幂略)
int pow(int base,int num){
int ans=1;
while(num!=0){
if(num&1!=0)
ans*=base;
base<<=1;
b>>=1;
}
return ans;
}
2.位数公式
x=log(n)+1//求n有多少位
3.莫比乌斯函数
在线
ll mubi(ll n) {
ll mu=1;
for(ll i=2;i*i<=n;++i) {
if(n%i==0) {
mu*=-1;
ll k=0;
do {
k++;
if(k>1) {
mu=0;break;
}
n/=i;
}while(n%i==0);
}
}
if(n>1) mu*=-1;
return mu;
}
离线
mu[1]=1;
for(i=2;i<=n;i++)
{
if(!not_prime[i])
{
prime[++tot]=i;
mu[i]=-1;
}
for(j=1;prime[j]*i<=n;j++)
{
not_prime[prime[j]*i]=1;
if(i%prime[j]==0)
{
mu[prime[j]*i]=0;
break;
}
mu[prime[j]*i]=-mu[i];
}
}
4.最小正整数逆元(ex_gcd)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll exgcd(ll a, ll b, ll &x, ll &y) {
if(!b) {
x=1;y=0;return a;
}
ll ans=exgcd(b,a%b,x,y);
ll temp=x;
x=y;
y=temp-a/b*y;
return ans;
}
int main() {
ios::sync_with_stdio(false);
ll m,n;
cin>>m>>n;
ll x,y;
exgcd(m,n,x,y);
cout<<((x%n)+n)%n<<endl;
return 0;
}
ACM个人零散知识点整理的更多相关文章
- Android 零散知识点整理
Android 零散知识点整理 为什么Android的更新试图操作必须在主线程中进行? 这是因为Android系统中的视图组件并不是线程安全的.通常应该让主线程负责创建.显示和更新UI,启动子线程,停 ...
- NDK开发-零散知识点整理
JavaVM 标准Java平台下,每一个Process可以产生很多JavaVM对象,但在Android平台上,每一个Process只能产生一个Dalvik VM对象,也就是说在Android进程中是通 ...
- vue前端面试题知识点整理
vue前端面试题知识点整理 1. 说一下Vue的双向绑定数据的原理 vue 实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来劫 ...
- kafka知识点整理总结
kafka知识点整理总结 只不过是敷衍 2017-11-22 21:39:59 kafka知识点整理总结,以备不时之需. 为什么要使用消息系统: 解耦 并行 异步通信:想向队列中放入多少消息就放多少, ...
- JSP页面开发知识点整理
刚学JSP页面开发,把知识点整理一下. ----------------------------------------------------------------------- JSP语法htt ...
- JS知识点整理(二)
前言 这是对平时的一些读书笔记和理解进行整理的第二部分,第一部分请前往:JS知识点整理(一).本文包含一些易混淆.遗漏的知识点,也会配上一些例子,也许不是很完整,也许还会有点杂,但也许会有你需要的,后 ...
- Android零散知识点积累
本文仅在记录android开发中遇到的零散知识点,会不断更新... 目录 .隐藏系统标题栏 .图片尺寸及屏幕密度 3.获取顶部状态栏高度 1.隐藏系统标题栏 1)在资源文件styles.xml中定义样 ...
- css入门知识点整理
css入门知识点整理 不要嘲笑我这个蒟蒻..例子来源:w3school css其实就分为两个东西,一个是选择器,另外一个是声明.声明定义了某个对象的属性的值,这都是html的内容.重点要关注的是选择器 ...
- activity生命周期知识点整理
activity生命周期知识点整理 Activity: 是一个应用组件,用户可与其提供的屏幕进行交互.窗口通常会充满屏幕,但也可以小于屏幕并浮动在其他窗口之上. 一个activity的什么周期: 启动 ...
随机推荐
- 使用spark-streaming实时读取Kafka数据统计结果存入MySQL
在这篇文章里,我们模拟了一个场景,实时分析订单数据,统计实时收益. 场景模拟 我试图覆盖工程上最为常用的一个场景: 1)首先,向Kafka里实时的写入订单数据,JSON格式,包含订单ID-订单类型-订 ...
- python的小基础
变量python中的变量为指向常量的地址当常量没有指向时,系统自动回收内存空间如A = 1B = AA = 2print(A,B)#2,1id(A),id(B)id()为python虚拟机的虚拟地址, ...
- iOS之 NSTimer(二)
1. Stopping a Timer 关闭定时器 if you create a non-repeating timer, there is no need to take any further ...
- ios 类的内部结构
1. Class 和 Object 的定义 /// An opaque type that represents an Objective-C class. typedef struct objc_c ...
- Matrices and Vectors
Matrices and Vectors Matrices are 2-dimensional arrays: A vector is a matrix with one column and man ...
- .6-Vue源码之AST(2)
上一节获取到了DOM树的字符串,准备进入compile阶段: // Line-9326 function compileToFunctions(template,options,vm) { // 获取 ...
- Linux中main是如何执行的
Linux中main是如何执行的 这是一个看似简单的问题,但是要从Linux底层一点点研究问题比较多.找到了一遍研究这个问题的文章,但可能比较老了,还是在x86机器上进行的测试. 原文链接 开始 问题 ...
- python爬虫如何入门
学爬虫是循序渐进的过程,作为零基础小白,大体上可分为三个阶段,第一阶段是入门,掌握必备的基础知识,第二阶段是模仿,跟着别人的爬虫代码学,弄懂每一行代码,第三阶段是自己动手,这个阶段你开始有自己的解题思 ...
- 每天一个linux命令(26):用SecureCRT来上传和下载文件(转载自竹子)
用SSH管理linux服务器时经常需要远程与本地之间交互文件.而直接用SecureCRT自带的上传下载功能无疑是最方便的,SecureCRT下的文件传输协议有ASCII.Xmodem.Zmodem. ...
- Leetcode题解(六)
21.Merge Two Sorted Lists 题目 直接上代码: class Solution { public: ListNode *mergeTwoLists(ListNode *l1, L ...