Skip to content

Commit

Permalink
3.4
Browse files Browse the repository at this point in the history
  • Loading branch information
dtcxzyw committed Mar 4, 2019
1 parent 2e36d94 commit 3f7005e
Show file tree
Hide file tree
Showing 14 changed files with 786 additions and 72 deletions.
11 changes: 7 additions & 4 deletions Queue.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
- [ ] LOJ#2265. 「CTSC2017」最长上升子序列
- [ ] LOJ#2392. 「JOISC 2017 Day 1」烟花棒
- [ ] LOJ#6500. 「雅礼集训 2018 Day2」操作
- [ ] [JLOI2011]不重复数字
# 题集
- [ ] PKUWC2018
- [ ] Ynoi2019模拟赛[By OldDriverTree](http://olddrivertree.blog.uoj.ac/blog/4656)
Expand Down Expand Up @@ -262,6 +263,8 @@
- [ ] UOJ 无限之环
- [ ] CF739E
- [ ] 星际竞速
- [ ] LOJ#6014. 「网络流 24 题」最长 k 可重区间集
- [ ] LOJ#6008. 「网络流 24 题」餐巾计划(做完补技巧总结)
# 分块及按大小分类
- [x] LOJ#6277-6285
# 插头dp
Expand All @@ -285,7 +288,7 @@
- [ ] LOJ#2341. 「WC2018」即时战略
- [ ] LOJ#2553. 「CTSC2018」暴力写挂
- [x] LOJ#2497. 「PA 2017」Banany
- [ ] LOJ#2065. 「SDOI2016」模式字符串
- [x] LOJ#2065. 「SDOI2016」模式字符串
- [x] P3727
- [ ] P3920
- [x] P2664
Expand All @@ -303,7 +306,7 @@
- [x] CF 613D
- [ ] UOJ#87. mx的仙人掌
# kdtree
- [ ] LOJ#6016. 崂山白花蛇草水
- [x] LOJ#6016. 崂山白花蛇草水
# 计算几何
- [ ] P4586
# 树的直径
Expand Down Expand Up @@ -371,7 +374,7 @@
# 置换
- [ ] LOJ#2528. 「ZJOI2018」树
# 支配树
- [ ] ZJOI 灾难
- [x] Luogu 2597 ZJOI 灾难
# DSU On Tree
- [ ] CF600E
- [ ] CF570D
Expand All @@ -383,7 +386,7 @@
- [ ] CF375D
- [ ] CF716E
# 分数规划
- [ ] P3778 [APIO2017]商旅
- [x] P3778 [APIO2017]商旅
# 贪心
- [ ] LOJ#2734. 「JOISC 2016 Day 2」女装大佬 (FJWC2019上厕所)
# 整体二分
Expand Down
1 change: 1 addition & 0 deletions Review/Graph/DominatorTree.tex
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
\section{支配树}
\index{D!DominatorTree}
\subsection{定义}
支配树基于某个原点$s$,若$s$到某个点$v$的节点必定经过$u$,则称$u$支配$v$
起点$s$与自己$v$称为平凡支配点。
Expand Down
6 changes: 1 addition & 5 deletions Review/NetworkFlows/NetworkFlows.tex
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,4 @@ \chapter{网络流}
\input{NetworkFlows/LimitedNetworkFlows}
\input{NetworkFlows/Models}
\input{NetworkFlows/Gomory-HuTree}
\section{本章注记}
胡伯涛在2007年国家集训队的论文《最小割模型在信息学竞赛中的应用》\cite{MCIOI}
十分经典,我将从这里补充更多的网络流/最小割模型。
网络流技巧详见\url{https://www.cnblogs.com/zhoushuyu/p/8137534.html}。
\index{*TODO!补充网络流经典模型与技巧}
\input{NetworkFlows/Tricks}
28 changes: 28 additions & 0 deletions Review/NetworkFlows/Tricks.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
\section{技巧总结}
\subsection{最大流}
\begin{itemize}
\item 若一个点只能被经过有限次,将其拆为入点和出点,入点到出点连流量为
经过次数限制的边。
\item 树形最大流可以贪心解决。
\end{itemize}
\subsection{最小割}
\begin{itemize}
\item 最大化收益可以理解为已经拿到所有收益,最小化损失。然后将其转化为最小割解决。
\item 使用$+\infty$边描述依赖关系,可以保证这条边不出现在最小割中。
\item$S,T$与点的连边来表示点的权。
\end{itemize}
\subsection{费用流}
\begin{itemize}
\item 要求费用最小且边数最小:类比进制的思想,实际费用乘以一个大于总边数的因子,再加上
1作为该边边权。
\item 若已知走一条边之前必定已经走完了另外几条边,则考虑动态加边。
\item 对于层数较少,结构简单的图,考虑使用其它数据结构贪心模拟费用流。
\item (待验证)判断一条边是否一定被选:在残量网络上跑SPFA,若距离差不等于边权则必选。
\item 餐巾计划问题:
\end{itemize}

上述内容参考了胡伯涛的2007年国家集训队论文《最小割模型在信息学竞赛中的应用》
\cite{MCIOI}和租酥雨的博客\footnote{
网络流总结\\
\url{https://www.cnblogs.com/zhoushuyu/p/8137534.html}
}。
5 changes: 5 additions & 0 deletions Review/Other/TricksAndIdeas.tex
Original file line number Diff line number Diff line change
Expand Up @@ -360,6 +360,11 @@ \subsection{启发式分治}
「随笔」一种基于启发式思想的分治策略——启发式分裂
\url{https://blog.csdn.net/DSL\_HN\_2002/article/details/81193576}
}。
\subsection{分段打表}
需求:少量大规模单点查询,查询上界已知,支持快速转移。比如求$1e9$范围内的模意义阶乘。

可以写一个打表程序,每隔$1e5$输出一个点,然后将其导入源程序,查询时寻找最近的点,
从该点开始转移。
\subsection{注意事项/常见转化/思想}
\begin{itemize}
\item 边读入边处理时不要跳出循环,若要跳出循环则需继续读入以跳过冗余数据。
Expand Down
3 changes: 3 additions & 0 deletions Review/Recommendation.tex
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ \section{好用的网站/工具}
\item BZOJ离线题库(BZOJCH)[By 阮行止] \\\url{http://ruanx.pw/bzojch/index.html}
\item BZOJ题号查找器(BZOJNO)[By 阮行止]
\url{http://ruanx.pw/bzojch/bzojno.html}
\item 马同学高等数学 \url{https://www.matongxue.com/}
\end{itemize}
\section{优秀资料}
\begin{itemize}
Expand All @@ -36,6 +37,8 @@ \section{优秀资料}
\item OI-Wiki \url{https://github.com/24OI/OI-wiki/}
\item 知乎上OI相关文章 \url{https://www.zhihu.com/collection/213577780}
\item 演算法筆記 江任捷\\\url{http://www.csie.ntnu.edu.tw/\~u91029/index.html}
\item 一份不太简短的\LaTeX{}$2_{\varepsilon}$介绍\\
\url{https://github.com/CTeX-org/lshort-cn/}
\end{itemize}
\section{经典书籍}
\begin{itemize}
Expand Down
93 changes: 93 additions & 0 deletions Source/DominatorTree/2597.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
#include <algorithm>
#include <cstdio>
int read() {
int res = 0, c;
do
c = getchar();
while(c < '0' || c > '9');
while('0' <= c && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
return res;
}
const int size = 70000;
template <int esiz>
struct G {
struct Edge {
int to, nxt;
} E[esiz];
int last[size], cnt;
G() : cnt(0) {}
void addEdge(int u, int v) {
++cnt;
E[cnt].to = v, E[cnt].nxt = last[u];
last[u] = cnt;
}
};
G<size * 2> A;
G<size> B;
int in[size], q[size], d[size], p[size][16], siz[size];
void DFS(int u) {
siz[u] = 1;
for(int i = B.last[u]; i; i = B.E[i].nxt) {
int v = B.E[i].to;
if(v != p[u][0]) {
DFS(v);
siz[u] += siz[v];
}
}
}
int getLCA(int u, int v) {
if(u == 0 || v == 0)
return u | v;
if(d[u] < d[v])
std::swap(u, v);
int delta = d[u] - d[v];
for(int i = 0; i < 16; ++i)
if(delta & (1 << i))
u = p[u][i];
if(u == v)
return u;
for(int i = 15; i >= 0; --i)
if(p[u][i] != p[v][i])
u = p[u][i], v = p[v][i];
return p[u][0];
}
int main() {
int n = read();
for(int i = 1; i <= n; ++i) {
int k = read();
while(k) {
++in[i];
A.addEdge(k, i);
k = read();
}
}
int qcnt = 0, rt = n + 1;
for(int i = 1; i <= n; ++i)
if(!in[i]) {
B.addEdge(rt, i);
p[i][0] = rt;
q[++qcnt] = i;
d[i] = 1;
}
for(int i = 1; i <= qcnt; ++i) {
int u = q[i];
for(int j = A.last[u]; j; j = A.E[j].nxt) {
int v = A.E[j].to;
p[v][0] = getLCA(p[v][0], u);
if(--in[v] == 0) {
B.addEdge(p[v][0], v);
d[v] = d[p[v][0]] + 1;
for(int k = 1; k < 16; ++k)
p[v][k] = p[p[v][k - 1]][k - 1];
q[++qcnt] = v;
}
}
}
DFS(rt);
for(int i = 1; i <= n; ++i)
printf("%d\n", siz[i] - 1);
return 0;
}
154 changes: 154 additions & 0 deletions Source/Fractional Programming/LOJ2734.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
#include <algorithm>
#include <cassert>
#include <cmath>
#include <csetjmp>
#include <cstdio>
#include <cstring>
namespace IO {
void init() {
assert(setvbuf(stdin, 0, _IONBF, 0) == 0);
assert(setvbuf(stdout, 0, _IONBF, 0) == 0);
}
const int size = 1 << 21;
char in[size];
char getc() {
static char *S = in, *T = in;
if(S == T)
S = in, T = in + fread(in, 1, size, stdin);
return S == T ? EOF : *S++;
}
}
int read() {
int res = 0, c;
bool flag = false;
do {
c = IO::getc();
flag |= c == '-';
} while(c < '0' || c > '9');
while('0' <= c && c <= '9') {
res = res * 10 + c - '0';
c = IO::getc();
}
return flag ? -res : res;
}
const int size = 105, maxk = 1005, inf = 0x3f3f3f3f;
typedef double FT;
const FT eps = 1e-2;
struct Edge {
int to, nxt;
FT w;
} E[size * size];
int last[size], cnt;
void addEdge(int u, int v, FT w) {
++cnt;
E[cnt].to = v, E[cnt].nxt = last[u], E[cnt].w = w;
last[u] = cnt;
}
FT dis[size];
bool vis[size];
jmp_buf buf;
bool pre(int u) {
FT cd = dis[u];
vis[u] = true;
bool res = false;
for(int i = last[u]; i; i = E[i].nxt) {
int v = E[i].to;
FT dv = cd + E[i].w;
if(dv < dis[v]) {
if(vis[v])
longjmp(buf, 1);
dis[v] = dv;
pre(v);
res = true;
break;
}
}
vis[u] = false;
return res;
}
void DFS(int u, int d) {
if(d == 0)
return;
FT cd = dis[u];
vis[u] = true;
for(int i = last[u]; i; i = E[i].nxt) {
int v = E[i].to;
FT dv = cd + E[i].w;
if(dv < dis[v]) {
if(vis[v])
longjmp(buf, 1);
dis[v] = dv;
DFS(v, d - 1);
}
}
vis[u] = false;
}
int link[size][size], off[size][size];
bool check(int n, int K, FT x) {
cnt = 0;
memset(last + 1, 0, sizeof(int) * n);
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j) {
if(off[i][j] != inf && link[i][j] != inf)
addEdge(i, j,
off[i][j] + link[i][j] * x);
}
memset(vis + 1, 0, sizeof(bool) * n);
memset(dis + 1, 0, sizeof(double) * n);
if(setjmp(buf))
return true;
else {
for(int i = 1; i <= n; ++i)
while(pre(i))
;
int end = 2 * n;
for(int k = 1; k < end; k <<= 1)
for(int i = 1; i <= n; ++i)
DFS(i, k);
return false;
}
}
int b[size][maxk], s[size][maxk];
int main() {
IO::init();
int n = read();
int m = read();
int K = read();
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= K; ++j) {
b[i][j] = read();
s[i][j] = read();
}
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j) {
int& mind = off[i][j];
mind = inf;
if(i == j)
continue;
for(int k = 1; k <= K; ++k)
if(b[i][k] != -1 && s[j][k] != -1)
mind = std::min(mind,
b[i][k] - s[j][k]);
}
memset(link, 0x3f, sizeof(link));
for(int i = 1; i <= m; ++i) {
int u = read();
int v = read();
int t = read();
link[u][v] = std::min(link[u][v], t);
}
for(int k = 1; k <= n; ++k)
for(int i = 1; i <= n; ++i)
if(link[i][k] != inf)
for(int j = 1; j <= n; ++j)
link[i][j] = std::min(
link[i][j],
link[i][k] + link[k][j]);
FT l = 100.0, r = 350.0;
while(floor(r + eps) - floor(l + eps) >= eps) {
FT m = (l + r) / 2.0;
(check(n, K, m) ? l : r) = m;
}
printf("%.0lf\n", floor(r + eps));
return 0;
}
Loading

0 comments on commit 3f7005e

Please sign in to comment.