bzoj

bzoj 5293 树上差分 and 倍增

匿名 (未验证) 提交于 2019-12-02 23:57:01
题意:问你树上两点之间路径上 sigma(每个点深度^k); 解: 1、树上倍增时维护每个深度k次幂到根的前缀和 2、树上差分+简单容斥 #include < bits / stdc ++. h > using namespace std ; #define MAXN 300010 #define maxn 300010 #define en '\n' #define ll long long int MAXLOG ; const int mo = 998244353 ; const int INF = 1e8 ; const int inf = 1e8 ; int T , tot = 1 ; int dep [ maxn ], anc [ maxn ][ 66 ], n , m ; int val [ 66 ]; int a [ maxn ][ 66 ]; template < class T > void rep ( T & x ){ x %= mo ; x += mo ; x %= mo ;} template < class T > void rd ( T & x ) { x = 0 ; int f = 0 ; char ch = getchar (); while ( ch < '0' || ch > '9' ) { f |=( ch == '-' ); ch =

BZOJ 3998: [TJOI2015]弦论 SAM

匿名 (未验证) 提交于 2019-12-02 23:56:01
title BZOJ 3998 LUOGU 3975 Description 对于一个给定的长度为 \(n\) 的字符串,求出它的第 \(k\) 小子串是什么。 analysis 建出 \(SAM\) 求 \(K\) 大。 \(T=0\) 除了根以外的状态都代表 \(1\) 个串; \(T=1\) 每个状态 \(fail\) 子树结束结点个数即为串的个数。 code #include < bits / stdc ++. h > using namespace std ; const int maxn = 5e5 + 10 ; char buf [ 1 << 15 ],* fs ,* ft ; inline char getc () { return ( ft == fs &&( ft =( fs = buf )+ fread ( buf , 1 , 1 << 15 , stdin ), ft == fs ))? 0 :* fs ++; } template < typename T > inline void read ( T & x ) { x = 0 ; T f = 1 , ch = getchar (); while (! isdigit ( ch ) && ch ^ '-' ) ch = getchar (); if ( ch == '-' ) f =- 1 , ch =

BZOJ 4236 \"JOIOJI\"(前缀和+map)

匿名 (未验证) 提交于 2019-12-02 23:49:02
传送门:   [1]: BZOJ   [2]: 洛谷   定义数组 a,b,c 分别表示 'J' , 'O' , 'I' 的前缀和;   要想使区间 (L,R] 满足条件当且仅当 a[R]-a[L] = b[R]-b[L] = c[R]-c[L];   提前预处理出 a,b,c 数组后;   对于 i 位置,查找之前是否含有满足 a i -b i = a j -b j && b i -c i = b j -c j 的位置 j,并且 j 尽可能的小;   如何高效的查找呢?   使用 map<pair<int ,int > , int >;   对于之前处理过的位置 j ,将 a j -b j 和 b j -c j 存入到 pair<int ,int > 中,每次查找是否存在 (a i -b i ,b i -c i ) 即可;   如果存在,求解当前答案,反之,将其加入到map中; 转载请标明出处: BZOJ 4236 \"JOIOJI\"(前缀和+map) 文章来源: BZOJ 4236 "JOIOJI"(前缀和+map)

BZOJ 3990 排序

匿名 (未验证) 提交于 2019-12-02 23:47:01
题目描述 : 小A有一个 1~2 N 的排列A[1..2 N ],他希望将数组 A 从小到大排序。小 A 可以执行的操作有 N 种,每种操作最多可以执行一次。对于所有的 i(1<=i<=N) ,第 i 种操作为:将序列从左到右划分成 2 N-i+1 段,每段恰好包含2 i-1 个数,然后整体交换其中的两段。小A想知道可以将数组 A 从小到大排序的不同的操作序列有多少个。小 A 认为两个操作序列不同,当且仅当操作的个数不同,或者至少一个操作不同(种类不同或者操作的位置不同)。 下面是一个操作示例: N=3,初始排列 A[1..8] Ϊ [3,6,1,2,7,8,5,4] 。 第一次操作:执行第3种操作,交换 A[1..4] 和 A[5..8] ,交换后的 A[1..8] Ϊ [7,8,5,4,3,6,1,2] ; 第二次操作:执行用第1种操作,交换 A[3] 和 A[5] ,交换后的 A[1..8] Ϊ [7,8,3,4,5,6,1,2] ; 第三次操作:执行用第2种操作,交换 A[1..2] 和 A[7..8] ,交换后的 A[1..8] Ϊ [1,2,3,4,5,6,7,8] 。 第一行,一个整数N。 第二行,2 N 个整数,A[1]、 A[2] …A[2 N ]。 一行,一个整数,表示可以将数组A从小到大排序的不同的操作序列的个数。 3 7 8 5 6 1 2 4 3 6

BZOJ 2132 圈地计划 最小割

夙愿已清 提交于 2019-12-02 23:32:49
首先黑白染色 因为相邻的节点颜色必不同 相同颜色的节点之间没有关系(没有边) 然后Add(S,黑色点,A[i][j]) (黑色点,T,B[i][j])(S,白色点,B[i][j])(白色点,T,A[i][j])因为黑色点和白色点同属一个S/T才有额外贡献 所以这里A[i][j],B[i][j]要交换连 sum初始为矩阵里每个点的A,B之和 对于每个点 向它四周相邻的点连(u,v,C[i][j]+C[i'][j']) 注意这里黑色到白色 白色到黑色都要连 因为有属于S/T两种情况 然后一个点有X个相邻点则sum+=X*C[i][j] 因为上面连的C[i][j]+C[i'][j']容量的边其实有两条但是却不存在同时切两条的情况 最多只会切一条 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef int JQK; int n, m; namespace dinic { const int MAXN = 10050; const int MAXM = 100050; const int INF = 1000000050; int Head[MAXN], cur[MAXN], lev[MAXN], to[MAXM << 1], nxt[MAXM << 1], ed = 1; int S, T,

[BZOJ 2179] FFT快速傅立叶

杀马特。学长 韩版系。学妹 提交于 2019-12-02 17:06:15
2179: FFT快速傅立叶 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 4621 Solved: 2498 [ Submit ][ Status ][ Discuss ] Description 给出两个n位10进制整数x和y,你需要计算x*y。 Input 第一行一个正整数n。 第二行描述一个位数为n的正整数x。 第三行描述一个位数为n的正整数y。 Output 输出一行,即x*y的结果。 Sample Input 1 3 4 Sample Output 12 数据范围: n<=60000 法法塔模板 本来在纠结背不住板子 突然想起来ACM是可以带板子进场的 嗨森 #include <bits/stdc++.h> using namespace std; const int maxn = 262144; struct comp{ double x, y; comp(double _x = 0, double _y = 0){ x = _x; y = _y; } friend comp operator * (const comp &a, const comp &b){ return comp(a.x * b.x - a.y * b.y, a.x * b.y + a.y * b.x); } friend comp

BZOJ

你。 提交于 2019-12-02 16:00:08
决定从头到尾干一波BZOJ! 可能会写没几题就停下吧,但还是想学学新姿势啦。 [BeiJing2006]狼抓兔子 即求 $(1, 1)$ 到 $(n, m)$ 的最小割。跑 dinic 即可。 #include <bits/stdc++.h> using namespace std; 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 - 48; ch = getchar(); } return x * f; } const int N = 1e6 + 10; const int INF = 0x3f3f3f3f; struct E { int v, ne, f; } e[N * 7]; int head[N], cnt, n, m, iter[N], level[N]; inline void add(int u, int v, int f) { e[cnt].v = v; e[cnt].f = f; e[cnt].ne = head[u]; head[u] = cnt++;

左偏树 (bzoj 2809)

微笑、不失礼 提交于 2019-12-02 00:37:02
Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿。在这个帮派里,有一名忍者被称之为 Master。除了 Master以外,每名忍者都有且仅有一个上级。为保密,同时增强忍者们的领导力,所有与他们工作相关的指令总是由上级发送给他的直接下属,而不允许通过其他的方式发送。现在你要招募一批忍者,并把它们派遣给顾客。你需要为每个被派遣的忍者 支付一定的薪水,同时使得支付的薪水总额不超过你的预算。另外,为了发送指令,你需要选择一名忍者作为管理者,要求这个管理者可以向所有被派遣的忍者 发送指令,在发送指令时,任何忍者(不管是否被派遣)都可以作为消息的传递 人。管理者自己可以被派遣,也可以不被派遣。当然,如果管理者没有被排遣,就不需要支付管理者的薪水。你的目标是在预算内使顾客的满意度最大。这里定义顾客的满意度为派遣的忍者总数乘以管理者的领导力水平,其中每个忍者的领导力水平也是一定的。写一个程序,给定每一个忍者 i 的上级 B i ,薪水 Ci ,领导力 L i ,以及支付给 忍者们的薪水总预算 M ,输出在预算内满足上述要求时顾客满意度的最大值。 1 ≤ N ≤ 100,000 忍者的个数; 1 ≤ M ≤ 1,000,000,000 薪水总预算; 0 ≤ B i < i 忍者的上级的编号; 1 ≤ C i ≤ M 忍者的薪水; 1 ≤ L i ≤

bzoj 1088 [SCOI2005]扫雷Mine

北城余情 提交于 2019-12-02 00:17:50
Description   相信大家都玩过扫雷的游戏。那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来。万圣节到了 ,“余”人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字 表示和它8连通的格子里面雷的数目。现在棋盘是n×2的,第一列里面某些格子是雷,而第二列没有雷,如下图: 由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放 方案。 Input   第一行为N,第二行有N个数,依次为第二列的格子中的数。(1<= N <= 10000) Output   一个数,即第一列中雷的摆放方案数。 Sample Input 2 1 1 Sample Output 2 只要知道第一个格子有无雷,根据a[1],可得到第二个格子有无雷,根据a[3],知道第三个格子有无雷。。。。依次类推,看是否有矛盾。 答案只能是0、1、2。 #pragma GCC optimize(2) #include <bits/stdc++.h> #define ll long long using namespace std; const int N = 1e4+10; int a[N],b[N],c[N],n; int judge() { for(int i=2;i<=n-1;i++) { b[i+1]=a[i]

[BZOJ 3527] [ZJOI2014]力(FFT)

允我心安 提交于 2019-12-01 20:14:07
[BZOJ 3527] [ZJOI2014]力(FFT)  题面 求$ F_j=\sum_{i<j} \frac{q_i q_j}{(i-j)^2}-\sum_{i>j} \frac{q_i q_j}{(i-j)^2} $ 题外话:这题叫”力“,大概是因为这个式子长得很像电荷间作用力的公式。 分析 设 \(E_i=\frac{F_i}{q_i}\) (题外话:其实就是电场强度). \[\begin{aligned}E_i &=\sum_{j<i} \frac{q_j}{(j-i)^2}-\sum_{j>i} \frac{q_j}{(j-i)^2} \\ E_i&=\sum_{j=1}^{i-1} \frac{q_j}{(j-i)^2} - \sum_{j=i+1}^{n} \frac{q_j}{(j-i)^2} \end{aligned}\] 令 \(f(i)=q_i, g(i)=\frac{1}{i^2}\) \[ E_i=\sum_{j=1}^{i-1} f(j)g(i-j) - \sum_{j=i+1}^{n} f(j)g(j-i) \] 注意到第一个式子就是卷积的形式,但是第二个式子 \(j+(j−i)\) 不是一个常数,考虑变换形式。 令 \(g'(i)=g(n-i)\) ,那么 \(g(j-i)=g'(n-j+i)\) 于是式子化成: \[ E_i=\sum_{j=1}