ACM个人零散知识点整理

杂项:

1.输入输出外挂

  1. //读入优化 int 整数
  2. inline int read(){
  3. int x=0,f=1;
  4. char ch=getchar();
  5. while(ch<'0'||ch>'9') {
  6. if(ch=='-') f=-1;
  7. ch=getchar();
  8. }
  9. while(ch>='0'&&ch<= '9') {
  10. x=x*10+ch-'0';
  11. ch=getchar();
  12. }
  13. return x * f;
  14. }

2.关闭c+++输入输出限制流

使用的时候一定放在所有cin,cout的开头,不然会导致输入的内容发生错乱

  1. ios::sync_with_stdio(false);
  2. cin.tie(0);
  3. cout.tie(0);

图论:

1.链式前向星模板

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 1e6+5;
  4. //init()
  5. struct edgenode {
  6. int w,next,to;
  7. edgenode () {
  8. next=w=to=0;
  9. }
  10. } edges[maxn];
  11. int head[maxn];
  12. int cnt=0;
  13. //双向边调用两次即可
  14. void addedge(int u, int v, int w) {
  15. edges[cnt].to=v;
  16. edges[cnt].w=w;
  17. edges[cnt].next=head[u];
  18. head[u]=cnt;
  19. cnt++;
  20. }
  21. //遍历
  22. void ask(int x) {
  23. for(int i=head[x];i!=-1;i=edges[i].next) {
  24. }
  25. }
  26. void init() {
  27. memset(head,-1,sizeof(head));
  28. }
  29. int main() {
  30. return 0;
  31. }

2.最近公共祖先

  • tarjan离线

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. const int maxn = 500001;
    4. const int maxm = 1000001;
    5. struct enode {
    6. int next,to;
    7. } edges[maxm];
    8. struct qnode {
    9. int next,id,to;//id第几次查询
    10. } que[maxm];
    11. int head_e[maxn];//前向星 edges
    12. int head_q[maxn];//前向星 查询
    13. int vis[maxn];
    14. int f[maxn];//并查集父亲数组
    15. int res[maxn];//结果
    16. int cnte=0;
    17. int cntq=0;
    18. int n,m,s;
    19. inline void addedge(int u, int v) {
    20. edges[cnte].to=v;
    21. edges[cnte].next=head_e[u];
    22. head_e[u]=cnte++;
    23. }
    24. inline void addque(int u, int v, int id) {
    25. que[cntq].to=v;
    26. que[cntq].id=id;
    27. que[cntq].next=head_q[u];
    28. head_q[u]=cntq++;
    29. }
    30. //并查集访问父亲
    31. int find(int x) {
    32. return x==f[x] ? x : f[x] = find(f[x]);//压缩
    33. }
    34. void tarjan(int s) {
    35. vis[s]=1;//先标记,不能在回溯时标记,因为双向边
    36. f[s]=s;
    37. for(int i=head_e[s]; i!=-1; i=edges[i].next) {
    38. if(!vis[edges[i].to]) {
    39. tarjan(edges[i].to);
    40. f[edges[i].to]=s;
    41. }
    42. }
    43. for(int i=head_q[s]; i!=-1; i=que[i].next) {
    44. if(vis[que[i].to]==1) {
    45. res[que[i].id]=find(que[i].to);
    46. }
    47. }
    48. }
    49. inline void init() {
    50. memset(vis,0,sizeof(vis));
    51. memset(head_e,-1,sizeof(head_e));
    52. memset(head_q,-1,sizeof(head_q));
    53. for(int i=1; i<=n; ++i) f[i]=i;
    54. }
    55. int main() {
    56. ios::sync_with_stdio(false);
    57. cin.tie(0);
    58. cout.tie(0);
    59. cin>>n>>m>>s;
    60. init();
    61. int u,v;
    62. for(int i=1; i<n; ++i) {
    63. cin>>v>>u;
    64. addedge(v,u);
    65. addedge(u,v);
    66. }
    67. for(int i=1; i<=m; ++i) {
    68. cin>>v>>u;
    69. addque(u,v,i);
    70. addque(v,u,i);
    71. }
    72. tarjan(s);
    73. for(int i=1; i<=m; ++i) cout<<res[i]<<endl;
    74. return 0;
    75. }
  • ST倍增在线

    1. #include <iostream>
    2. #include <stdio.h>
    3. #include <string.h>
    4. #include <math.h>
    5. using namespace std;
    6. const int maxn = 100005;
    7. struct node {
    8. int to,next;
    9. } edges[maxn<<1];
    10. //注意head[]数组初始化
    11. int head[maxn],cnt,dp[maxn][15],dep[maxn];
    12. void add(int u, int v) {
    13. edges[cnt].to=v;
    14. edges[cnt].next=head[u];
    15. head[u]=cnt++;
    16. }
    17. //节点 父亲节点
    18. void dfs(int s, int x) {
    19. dp[s][0]=x;
    20. dep[s]=dep[x]+1;
    21. int t;
    22. //跟新到根节点一路上的祖先
    23. for(int i=1; (1<<i)<=dep[x]; ++i) dp[s][i]=dp[dp[s][i-1]][i-1];
    24. for(int i=head[s]; i!=-1; i=edges[i].next) {
    25. t=edges[i].to;
    26. if(t==x) continue;
    27. dfs(t,s);
    28. }
    29. }
    30. int lca(int u, int v) {
    31. if(dep[v]>dep[u]) swap(u,v);
    32. for(int i=14; i>=0; --i) {
    33. if((dep[u]-dep[v])>=(1<<i)) {
    34. u=dp[u][i];
    35. }
    36. }
    37. //此时深度一定相同
    38. if(u==v) return u;
    39. for(int i=14; i>=0; --i) {
    40. if((1<<i)<=dep[u]&&dp[u][i]!=dp[v][i]) {
    41. u=dp[u][i];
    42. v=dp[v][i];
    43. }
    44. }
    45. //循环过程中不加判断可能会超过最近公共祖先,所以跟新到lca的儿子节点即可
    46. return dp[u][0];
    47. }
    48. int main() {
    49. int n,m,u,v;
    50. scanf("%d %d",&n,&m);
    51. cnt=0;
    52. memset(head,-1,sizeof(head));
    53. for(int i=1; i<n; ++i) {
    54. scanf("%d %d",&u,&v);
    55. add(u,v);
    56. add(v,u);
    57. }
    58. dep[0]=1;
    59. dfs(1,1);
    60. for(int i=1; i<=m; ++i) {
    61. scanf("%d %d",&u,&v);
    62. printf("%d\n",lca(u,v));
    63. }
    64. return 0;
    65. }

    数论:

    1.快速幂(矩阵快速幂略)

    1. int pow(int base,int num){
    2. int ans=1;
    3. while(num!=0){
    4. if(num&1!=0)
    5.   ans*=base;
    6. base<<=1;
    7. b>>=1;
    8.   }
    9. return ans;
    10. }

    2.位数公式

    1. x=log(n)+1//求n有多少位

    3.莫比乌斯函数

  • 在线

    1. ll mubi(ll n) {
    2. ll mu=1;
    3. for(ll i=2;i*i<=n;++i) {
    4. if(n%i==0) {
    5. mu*=-1;
    6. ll k=0;
    7. do {
    8. k++;
    9. if(k>1) {
    10. mu=0;break;
    11. }
    12. n/=i;
    13. }while(n%i==0);
    14. }
    15. }
    16. if(n>1) mu*=-1;
    17. return mu;
    18. }
  • 离线

    1. mu[1]=1;
    2. for(i=2;i<=n;i++)
    3. {
    4. if(!not_prime[i])
    5. {
    6. prime[++tot]=i;
    7. mu[i]=-1;
    8. }
    9. for(j=1;prime[j]*i<=n;j++)
    10. {
    11. not_prime[prime[j]*i]=1;
    12. if(i%prime[j]==0)
    13. {
    14. mu[prime[j]*i]=0;
    15. break;
    16. }
    17. mu[prime[j]*i]=-mu[i];
    18. }
    19. }

    4.最小正整数逆元(ex_gcd)

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. typedef long long ll;
    4. ll exgcd(ll a, ll b, ll &x, ll &y) {
    5. if(!b) {
    6. x=1;y=0;return a;
    7. }
    8. ll ans=exgcd(b,a%b,x,y);
    9. ll temp=x;
    10. x=y;
    11. y=temp-a/b*y;
    12. return ans;
    13. }
    14. int main() {
    15. ios::sync_with_stdio(false);
    16. ll m,n;
    17. cin>>m>>n;
    18. ll x,y;
    19. exgcd(m,n,x,y);
    20. cout<<((x%n)+n)%n<<endl;
    21. return 0;
    22. }

ACM个人零散知识点整理的更多相关文章

  1. Android 零散知识点整理

    Android 零散知识点整理 为什么Android的更新试图操作必须在主线程中进行? 这是因为Android系统中的视图组件并不是线程安全的.通常应该让主线程负责创建.显示和更新UI,启动子线程,停 ...

  2. NDK开发-零散知识点整理

    JavaVM 标准Java平台下,每一个Process可以产生很多JavaVM对象,但在Android平台上,每一个Process只能产生一个Dalvik VM对象,也就是说在Android进程中是通 ...

  3. vue前端面试题知识点整理

    vue前端面试题知识点整理 1. 说一下Vue的双向绑定数据的原理 vue 实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来劫 ...

  4. kafka知识点整理总结

    kafka知识点整理总结 只不过是敷衍 2017-11-22 21:39:59 kafka知识点整理总结,以备不时之需. 为什么要使用消息系统: 解耦 并行 异步通信:想向队列中放入多少消息就放多少, ...

  5. JSP页面开发知识点整理

    刚学JSP页面开发,把知识点整理一下. ----------------------------------------------------------------------- JSP语法htt ...

  6. JS知识点整理(二)

    前言 这是对平时的一些读书笔记和理解进行整理的第二部分,第一部分请前往:JS知识点整理(一).本文包含一些易混淆.遗漏的知识点,也会配上一些例子,也许不是很完整,也许还会有点杂,但也许会有你需要的,后 ...

  7. Android零散知识点积累

    本文仅在记录android开发中遇到的零散知识点,会不断更新... 目录 .隐藏系统标题栏 .图片尺寸及屏幕密度 3.获取顶部状态栏高度 1.隐藏系统标题栏 1)在资源文件styles.xml中定义样 ...

  8. css入门知识点整理

    css入门知识点整理 不要嘲笑我这个蒟蒻..例子来源:w3school css其实就分为两个东西,一个是选择器,另外一个是声明.声明定义了某个对象的属性的值,这都是html的内容.重点要关注的是选择器 ...

  9. activity生命周期知识点整理

    activity生命周期知识点整理 Activity: 是一个应用组件,用户可与其提供的屏幕进行交互.窗口通常会充满屏幕,但也可以小于屏幕并浮动在其他窗口之上. 一个activity的什么周期: 启动 ...

随机推荐

  1. 使用spark-streaming实时读取Kafka数据统计结果存入MySQL

    在这篇文章里,我们模拟了一个场景,实时分析订单数据,统计实时收益. 场景模拟 我试图覆盖工程上最为常用的一个场景: 1)首先,向Kafka里实时的写入订单数据,JSON格式,包含订单ID-订单类型-订 ...

  2. python的小基础

    变量python中的变量为指向常量的地址当常量没有指向时,系统自动回收内存空间如A = 1B = AA = 2print(A,B)#2,1id(A),id(B)id()为python虚拟机的虚拟地址, ...

  3. iOS之 NSTimer(二)

    1. Stopping a Timer  关闭定时器 if you create a non-repeating timer, there is no need to take any further ...

  4. ios 类的内部结构

    1. Class 和 Object 的定义 /// An opaque type that represents an Objective-C class. typedef struct objc_c ...

  5. Matrices and Vectors

    Matrices and Vectors Matrices are 2-dimensional arrays: A vector is a matrix with one column and man ...

  6. .6-Vue源码之AST(2)

    上一节获取到了DOM树的字符串,准备进入compile阶段: // Line-9326 function compileToFunctions(template,options,vm) { // 获取 ...

  7. Linux中main是如何执行的

    Linux中main是如何执行的 这是一个看似简单的问题,但是要从Linux底层一点点研究问题比较多.找到了一遍研究这个问题的文章,但可能比较老了,还是在x86机器上进行的测试. 原文链接 开始 问题 ...

  8. python爬虫如何入门

    学爬虫是循序渐进的过程,作为零基础小白,大体上可分为三个阶段,第一阶段是入门,掌握必备的基础知识,第二阶段是模仿,跟着别人的爬虫代码学,弄懂每一行代码,第三阶段是自己动手,这个阶段你开始有自己的解题思 ...

  9. 每天一个linux命令(26):用SecureCRT来上传和下载文件(转载自竹子)

    用SSH管理linux服务器时经常需要远程与本地之间交互文件.而直接用SecureCRT自带的上传下载功能无疑是最方便的,SecureCRT下的文件传输协议有ASCII.Xmodem.Zmodem. ...

  10. Leetcode题解(六)

    21.Merge Two Sorted Lists 题目 直接上代码: class Solution { public: ListNode *mergeTwoLists(ListNode *l1, L ...