Skip to content

Commit

Permalink
generator
Browse files Browse the repository at this point in the history
  • Loading branch information
XorSum committed Aug 20, 2019
1 parent 21506f1 commit ca4f7c9
Show file tree
Hide file tree
Showing 40 changed files with 318 additions and 132 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,5 @@
# latex
latex/
!latex/*.tex

out/
12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
# AcmTemplates

ACM模板




### Install Source Code Pro Font

``` bash
wget https://www.fontsquirrel.com/fonts/download/source-code-pro.zip
sudo unzip source-code-pro.zip -d /usr/share/fonts/opentype
sudo fc-cache -f -v
```

150 changes: 87 additions & 63 deletions gen.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,37 +3,6 @@
import re


def scan_files(root_path):
file_pathes = []
for i,j,k in os.walk(root_path):
for l in k:
path = os.path.join(i,l)
# print(path)
file_pathes.append(path)
return file_pathes

def read_file(path):
with open(path,"r") as f:
content = f.read()
# print(content)
return content
return None

def extract_data(content):
pattern = re.compile('---\ntitle: (.*)\nchapter: (.*)\n---\n(.*)',re.DOTALL)
match = re.match(pattern, content)
if match is not None:
# print(match.group(1))
# print(match.group(2))
# print(match.group(3))
section = {
'title': match.group(1),
'chapter': match.group(2),
'code': match.group(3),
}
return section
return None

header = '''\\documentclass[twocolumn,a4,twoside]{book}
\\usepackage{xeCJK}
\\usepackage{amsmath, amsthm}
Expand Down Expand Up @@ -62,7 +31,7 @@ def extract_data(content):
breaklines = true,
captionpos = b,
tabsize = 4,
frame = shadowbox,
frame = box,
columns = fullflexible,
keywordstyle = \\bfseries,
basicstyle = \\small\\ttfamily,
Expand All @@ -73,7 +42,7 @@ def extract_data(content):
\\title{\\CJKfamily{hei} {\\bfseries ACM模板}}
\\author{han777404}
\\author{XORSUM}
\\renewcommand{\\today}{\\number\\year 年 \\number\\month 月 \\number\\day 日}
\\begin{document}\\small
Expand All @@ -85,39 +54,94 @@ def extract_data(content):
\\mainmatter
\\pagestyle{fancy}'''

def render_latex(documents):
with open("out.tex","w") as f:
f.write(header)
for chapter,sections in documents.items():
f.write('\n \\chapter{'+chapter+'}\n')
print("Chapter ",chapter)
for section in sections:
f.write(' \\section{'+section['title']+'}\n')
f.write(' \\begin{lstlisting}\n')
f.write(section['code'])
f.write(' \\end{lstlisting}\n')
print("Section ",section['title'])
f.write('\n')

f.write('\\end{document}') # footer
def read_file(path):
with open(path,"r") as f:
content = f.read()
# print(content)
return content
return None


if __name__ == '__main__':
print("start")
pathes = scan_files("./src")
documents = {}
for i in pathes:
# print(i)
content = read_file(i)
if content is not None:
section = extract_data(content)
# print(section)
def write_file(path,content):
with open(path,"w") as f:
f.write(content)
return content
return None



def extract_summary(content):
pattern = re.compile('---\nindex: (.*)\ntitle: (.*)\n---',re.DOTALL)
match = re.match(pattern, content)
if match is not None:
summary = {
'index': match.group(1),
'title': match.group(2),
}
return summary
return None

def extract_section(content):
pattern = re.compile('---\nindex: (.*)\ntitle: (.*)\n---\n(.*)\n---\n(.*)',re.DOTALL)
match = re.match(pattern, content)
if match is not None:
section = {
'index': match.group(1),
'title': match.group(2),
'description': match.group(3),
'code': match.group(4),
}
return section
return None



def scan_source(root_path="./src"):
document = []
for path in os.listdir(root_path):
path = os.path.join(root_path,path)
if os.path.isfile(path):
continue
summary = os.path.join(path,"summary.md")
if not os.path.exists(summary):
continue
chapter = extract_summary(read_file(summary))
# print(chapter)
sections = []
for file in os.listdir(path):
if file == 'summary.md':
continue
file = os.path.join(path,file)
section = extract_section(read_file(file))
if section is not None:
l = documents.get(section['chapter'],[])
l.append(section)
documents[section['chapter']]=l
# print(documents)
render_latex(documents)
sections.append(section)
sections.sort(key=lambda x:x['index'])
chapter['sections']=sections
document.append(chapter)
document.sort(key=lambda x:x['index'])
return document

def render_latex(document):
latex = header
for chapter in document:
latex = latex + '\n \\chapter{'+chapter['title']+'}\n'
sections = chapter['sections']
for section in sections:
latex = latex + ' \\section{'+section['title']+'}\n'
latex = latex + section['description'] + '\n'
latex = latex + ' \\begin{lstlisting}\n'
latex = latex + section['code']
latex = latex + ' \\end{lstlisting}\n'
print("Section ",section['title'])
latex = latex + '\n'
latex = latex + '\\end{document}' # footer
return latex


if __name__ == '__main__':
print("start")
document = scan_source()
latex = render_latex(document)
write_file("out/document.tex",latex)

print("end")
5 changes: 3 additions & 2 deletions src/datastructure/SegmentTree.cpp
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
---
index: 1
title: SegmentTree
chapter: DataStructure
---

segment tree, modify range, query the summary
---
struct STree{

int data[maxn<<2];
Expand Down
4 changes: 4 additions & 0 deletions src/datastructure/summary.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
index: 1
title: DataStructures
---
4 changes: 3 additions & 1 deletion src/datastructure/treap.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
---
index: 7
title: Treap
chapter: DataStructure
---
Treap
---

// 有封装
Expand Down
6 changes: 4 additions & 2 deletions src/datastructure/树状数组.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
---
title: TreeArray
chapter: DataStructure
index: 3
title: Tree Array
---
st
---

typedef long long ll;
Expand Down
7 changes: 4 additions & 3 deletions src/datastructure/树链剖分求点和.cpp
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
---
title: SegmentTree
chapter: DataStructure
index: 4
title: Tree Link Cut
---
st
---

STree st;
ll fa[maxn], dep[maxn], siz[maxn], top[maxn], w[maxn];
vector<ll> son[maxn];
Expand Down
6 changes: 4 additions & 2 deletions src/datastructure/树链剖分求边和.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
---
title: SegmentTree
chapter: DataStructure
index: 5
title: Tree Link Cut
---
st
---

#include <bits/stdc++.h>
Expand Down
4 changes: 3 additions & 1 deletion src/datastructure/线段树.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
---
index: 6
title: SegmentTree
chapter: DataStructure
---
st
---


Expand Down
4 changes: 3 additions & 1 deletion src/datastructure/线段树区间加法乘法求和.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
---
index: 2
title: SegmentTree
chapter: DataStructure
---
st
---

#include <bits/stdc++.h>
Expand Down
5 changes: 3 additions & 2 deletions src/graph/dijkstra.cpp
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
---
index: 1
title: Dijkstra
chapter: Graph
---

st
---
#include <bits/stdc++.h>

using namespace std;
Expand Down
6 changes: 4 additions & 2 deletions src/graph/lca.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
---
title: Dijkstra
chapter: Graph
index: 2
title: lca
---
st
---

typedef long long ll;
Expand Down
4 changes: 4 additions & 0 deletions src/graph/summary.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
index: 2
title: Graph
---
55 changes: 27 additions & 28 deletions src/graph/上下界网络流.cpp
Original file line number Diff line number Diff line change
@@ -1,55 +1,54 @@
---
title: Dijkstra
chapter: Graph
index: 3
title: Network Flow with Top Bottom
---
其实主要还是自己复习用

// //其实主要还是自己复习用
假定读者能够熟练打dinic的板子

// //假定读者能够熟练打dinic的板子
有上下界的网络流的核心是”调整”,我们通过一个初始的未必可行的流调整出一个可行流,还可以从可行的未必最大/最小的流调整出最大/最小流.

// 有上下界的网络流的核心是”调整”,我们通过一个初始的未必可行的流调整出一个可行流,还可以从可行的未必最大/最小的流调整出最大/最小流.
另一个常用技巧是有源汇的流和无源汇的流(循环流)的转换.除了无源汇可行流的求解,其他有源汇的上下界网络流都要用到这个技巧.

// 另一个常用技巧是有源汇的流和无源汇的流(循环流)的转换.除了无源汇可行流的求解,其他有源汇的上下界网络流都要用到这个技巧.
无源汇有上下界可行流(也就是循环流)
模型:一个网络,求出一个流,使得每条边的流量必须>=Li且<=Hi,每个点必须满足总流入量=总流出量(流量守恒)(这个流的特点是循环往复,无始无终).

// 无源汇有上下界可行流(也就是循环流)
// 模型:一个网络,求出一个流,使得每条边的流量必须>=Li且<=Hi,每个点必须满足总流入量=总流出量(流量守恒)(这个流的特点是循环往复,无始无终).
这个算法是有上下界网络流算法的基础,只要深刻理解这个算法其他算法也就水到渠成,因此我用大篇幅力图将这个算法的思想和细节阐述清楚.

// 这个算法是有上下界网络流算法的基础,只要深刻理解这个算法其他算法也就水到渠成,因此我用大篇幅力图将这个算法的思想和细节阐述清楚.
可行流算法的核心是将一个不满足流量守恒的初始流调整成满足流量守恒的流.

// 可行流算法的核心是将一个不满足流量守恒的初始流调整成满足流量守恒的流.
流量守恒,即每个点的总流入量=总流出量

// 流量守恒,即每个点的总流入量=总流出量
如果存在一个可行流,那么一定满足每条边的流量都大于等于流量的下限.因此我们可以令每条边的流量等于流量下限,得到一个初始流,然后建出这个流的残量网络.(即:每条边的流量等于这条边的流量上限与流量下限之差)这个初始流不一定满足流量守恒,因此最终的可行流一定是在这个初始流的基础上增大了一些边的流量使得所有点满足流量守恒.

// 如果存在一个可行流,那么一定满足每条边的流量都大于等于流量的下限.因此我们可以令每条边的流量等于流量下限,得到一个初始流,然后建出这个流的残量网络.(即:每条边的流量等于这条边的流量上限与流量下限之差)这个初始流不一定满足流量守恒,因此最终的可行流一定是在这个初始流的基础上增大了一些边的流量使得所有点满足流量守恒.
因此我们考虑在残量网络上求出一个另不满足流量守恒的附加流,使得这个附加流和我们的初始流合并之后满足流量守恒.即:

// 因此我们考虑在残量网络上求出一个另不满足流量守恒的附加流,使得这个附加流和我们的初始流合并之后满足流量守恒.即:
如果某个点在所有边流量等于下界的初始流中满足流量守恒,那么这个点在附加流中也满足流量守恒,

// 如果某个点在所有边流量等于下界的初始流中满足流量守恒,那么这个点在附加流中也满足流量守恒,
如果某个点在初始流中的流入量比流出量多x,那么这个点在附加流中的流出量比流入量多x.

// 如果某个点在初始流中的流入量比流出量多x,那么这个点在附加流中的流出量比流入量多x.
如果某个点在初始流中的流入量比流出量少x,那么这个点在附加流中的流出量比流入量少x.

// 如果某个点在初始流中的流入量比流出量少x,那么这个点在附加流中的流出量比流入量少x.
可以认为附加流中一条从u到v的边上的一个流量代表将原图中u到v的流量增大1

// 可以认为附加流中一条从u到v的边上的一个流量代表将原图中u到v的流量增大1
X的数值可以枚举x的所有连边求出.比较方便的写法是开一个数组A[],A[i]表示i在初始流中的流入量-流出量的值,那么A[i]的正负表示流入量和流出量的大小关系,下面就用A[i]表示初始流中i的流入量-流出量

// X的数值可以枚举x的所有连边求出.比较方便的写法是开一个数组A[],A[i]表示i在初始流中的流入量-流出量的值,那么A[i]的正负表示流入量和流出量的大小关系,下面就用A[i]表示初始流中i的流入量-流出量
但是dinic算法能够求的是满足流量守恒的有源汇最大流,不能在原网络上直接求一个这样的无源汇且不满足流量守恒的附加流.注意到附加流是在原网络上不满足流量守恒的,这启发我们添加一些原网络之外的边和点,用这些边和点实现”原网络上流量不守恒”的限制.

// 但是dinic算法能够求的是满足流量守恒的有源汇最大流,不能在原网络上直接求一个这样的无源汇且不满足流量守恒的附加流.注意到附加流是在原网络上不满足流量守恒的,这启发我们添加一些原网络之外的边和点,用这些边和点实现”原网络上流量不守恒”的限制.
具体地,如果一个点i在原网络上的附加流中需要满足流入量>流出量(初始流中流入量<流出量,A[i]<0),那么我们需要给多的流入量找一个去处,因此我们建一条从i出发流量=-A[i]的边.如果A[i]>0,也就是我们需要让附加流中的流出量>流入量,我们需要让多的流出量有一个来路,因此我们建一条指向i的流量=A[i]的边.

// 具体地,如果一个点i在原网络上的附加流中需要满足流入量>流出量(初始流中流入量<流出量,A[i]<0),那么我们需要给多的流入量找一个去处,因此我们建一条从i出发流量=-A[i]的边.如果A[i]>0,也就是我们需要让附加流中的流出量>流入量,我们需要让多的流出量有一个来路,因此我们建一条指向i的流量=A[i]的边.
当然,我们所新建的从i出发的边也要有个去处,指向i的边也要有个来路,因此我们新建一个虚拟源点ss和一个虚拟汇点tt(双写字母是为了和有源汇网络流中的源点s汇点t相区分).新建的指向i的边都从ss出发,从i出发的边都指向tt.一个点要么有一条边指向tt,要么有一条边来自ss,

// 当然,我们所新建的从i出发的边也要有个去处,指向i的边也要有个来路,因此我们新建一个虚拟源点ss和一个虚拟汇点tt(双写字母是为了和有源汇网络流中的源点s汇点t相区分).新建的指向i的边都从ss出发,从i出发的边都指向tt.一个点要么有一条边指向tt,要么有一条边来自ss,
指向tt的边的总流量上限一定等于ss流出的边的总流量上限,因为每一条边对两个点的A[i]贡献一正一负大小相等,所以全部点的A[i]之和等于0,即小于0的A[i]之和的绝对值=大于0的A[i]之和的绝对值.

// 指向tt的边的总流量上限一定等于ss流出的边的总流量上限,因为每一条边对两个点的A[i]贡献一正一负大小相等,所以全部点的A[i]之和等于0,即小于0的A[i]之和的绝对值=大于0的A[i]之和的绝对值.
如果我们能找到一个流满足新加的边都满流,这个流在原图上的部分就是我们需要的附加流(根据我们的建图方式,“新加的边都满流”和”附加流合并上初始流得到流量平衡的流”是等价的约束条件).

// 如果我们能找到一个流满足新加的边都满流,这个流在原图上的部分就是我们需要的附加流(根据我们的建图方式,“新加的边都满流”和”附加流合并上初始流得到流量平衡的流”是等价的约束条件).
那么怎样找出一个新加的边都满流的流呢?可以发现假如存在这样的方案,这样的流一定是我们所建出的图的ss-tt最大流,所以跑ss到tt的最大流即可.如果最大流的大小等于ss出发的所有边的流量上限之和(此时指向tt的边也一定满流,因为这两部分边的流量上限之和相等).

// 那么怎样找出一个新加的边都满流的流呢?可以发现假如存在这样的方案,这样的流一定是我们所建出的图的ss-tt最大流,所以跑ss到tt的最大流即可.如果最大流的大小等于ss出发的所有边的流量上限之和(此时指向tt的边也一定满流,因为这两部分边的流量上限之和相等).

// 最后,每条边在可行流中的流量=容量下界+附加流中它的流量(即跑完dinic之后所加反向边的权值).

// 代码(ZOJ2314 Reactor Cooling)
最后,每条边在可行流中的流量=容量下界+附加流中它的流量(即跑完dinic之后所加反向边的权值).

代码(ZOJ2314 Reactor Cooling)
---
#include<cstdio>
#include<cstring>
#include<algorithm>
Expand Down
Loading

0 comments on commit ca4f7c9

Please sign in to comment.