bzoj

[BZOJ 4332] [JSOI2012]分零食(DP+FFT)

♀尐吖头ヾ 提交于 2019-11-28 22:59:02
[BZOJ 4332] [JSOI2012]分零食(DP+FFT) 题面 同学们依次排成了一列,其中有A位小朋友,有三个共同的欢乐系数O,S和U。如果有一位小朋友得到了x个糖果,那么她的欢乐程度就是 \(f(x)=Ox^2+Sx+U\) 现在校长开始分糖果了,一共有M个糖果。有些小朋友可能得不到糖果, 对于那些得不到糖果的小朋友来说,欢乐程度就是1 。如果一位小朋友得不到糖果,那么在她身后的小朋友们也都得不到糖果。(即这一列得不到糖果的小朋友一定是最后的连续若干位) 所有分糖果的方案都是等概率的。现在问题是:期望情况下,所有小朋友的欢乐程度的乘积是多少?呆呆同学很快就有了一个思路,只要知道总的方案个数T和所有方案下欢乐程度乘积的总和S,就可以得到答案Ans=S/T。现在他已经求出来了T的答案,但是S怎么求呢?他就不知道了。你能告诉他么? 因为答案很大,你只需要告诉他S对P取模后的结果。 分析 题面osu好评 设 \(dp[i][j]\) 表示i个人里分j个零食得到的答案 那么 \[dp[i][j]=\sum_{k=0}^{j} dp[i-1][j-k] f(j)\] 暴力递推是 \(O(nm^2)\) 的,我们发现后面的式子是一个卷积的形式,即 \(dp_i=dp_{i-1}*f\) 由于卷积满足结合律, \(dp_i=dp_0 * f^i=1*f^i=f^i\)

BZOJ 3998: [TJOI2015]弦论 SAM

假装没事ソ 提交于 2019-11-28 21:48:25
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=getchar(); while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48), ch=getchar(); x*=f; } int T,K,n;

BZOJ 3571

耗尽温柔 提交于 2019-11-28 19:46:59
传送门 首先,$N$个配$N$个还带权值,那就显然是用KM了 这道题的思路和最小乘积生成树的思路差不多, 可惜BZOJ上一道裸最小乘积生成树被权限了… 考虑把每一种方案抽象成一个点$(sum A,sum B)$,然后把所有点扔到一个坐标系里面,然后答案就是使得一个反比例函数$xcdot y=k$的$k$最小的点 拿KM找出$sum A$最小的点和$sum B$最小的点(带权最小匹配就把边权取反算带权最大匹配),最优解一定优于这两个点(或位于两个点之一),也就是在这两个点连成的线段下方 设最优解为$c$,$sum A$最小的点为$a$,$sum B$最小的点为$b$ 易证明$c$一定在下凸壳上 那么题目就成了求解$a$到$b$的下凸壳。那么问题来了,总点数太多,不可能得到所有的点,怎么求下凸壳? 有一个显然的结论,$vec{ab}$下方距离$vec{ab}$最远的点一定在下凸壳上,即使得$SDelta abc$最大的$c$一定在下凸壳上。 $$SDelta abc=frac{vec{ab}timesvec{ac}}{2}$$ 展开再合起来能得到 (向量箭头不一样高差评) $$SDelta abc=frac{vec{ab}timesvec{c}+vec{a}timesvec{b}}{2}$$ 后面那坨已知,扔掉,即求$vec{ab}timesvec{c}$的最大值 找到$c$之后

bzoj 4939: [Ynoi2016]掉进兔子洞

霸气de小男生 提交于 2019-11-28 18:43:33
有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间剩下的数的个数和,询问独立。 注意这里删掉指的是一个一个删,不是把等于这个值的数直接删完, 比如三个区间是 [1,2,2,3,3,3,3] , [1,2,2,3,3,3,3] 与 [1,1,2,3,3],就一起扔掉了 1 个 1,1 个 2,2 个 3。 Input 第一行两个数表示 n , m。 第二行 n个数表示 a[i]。 之后 m 行,每行 6 个数 l1 , r1 , l2, r2 , l3 , r3 表示这三个区间。 Output 对于每个询问,输出一个数表示答案。 Sample Input 5 2 1 2 2 3 3 1 2 2 3 3 4 1 5 1 5 1 5 Sample Output 3 0 HINT n , m <= 100000 , 1 <= a[i] <= 1000000000 首先,很显然这题是要用莫队来处理的。我们先把输入的数字另外排一下序,然后记录一下pi表示每一个数字对应在排好序的数列里面是排第几个。询问的时候要把一个询问拆成3个询问,然后再并起来。然后在莫队的时候记录cnti表示当前数字i出现的次数,再开一个bitset,假设当前需要加入bitset的数字是x,我们就令bitset中的第px+cntx位为1,然后++cntx

@bzoj - 1061@ [Noi2008]志愿者招募

非 Y 不嫁゛ 提交于 2019-11-28 17:38:12
目录 @description@ @solution@ @accepted code@ @details@ @description@   申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管。布布刚上任就遇到了一个难题:为即将启动的奥运新项目招募一批短期志愿者。经过估算,这个项目需要N 天才能完成,其中第i 天至少需要Ai 个人。 布布通过了解得知,一共有M 类志愿者可以招募。其中第i 类可以从第Si 天工作到第Ti 天,招募费用是每人Ci 元。新官上任三把火,为了出色地完成自己的工作,布布希望用尽量少的费用招募足够的志愿者,但这并不是他的特长!于是布布找到了你,希望你帮他设计一种最优的招募方案。 Input   第一行包含两个整数N, M,表示完成项目的天数和可以招募的志愿者的种类。 接下来的一行中包含N 个非负整数,表示每天至少需要的志愿者人数。 接下来的M 行中每行包含三个整数Si, Ti, Ci,含义如上文所述。为了方便起见,我们可以认为每类志愿者的数量都是无限多的。 Output   仅包含一个整数,表示你所设计的最优方案的总费用。 Sample Input 3 3 2 3 4 1 2 2 2 3 5 3 3 2 Sample Output 14 HINT 1 ≤ N ≤ 1000,1 ≤ M ≤ 10000,题目中其他所涉及的数据均不超过2^31-1

@bzoj - 2668@ [cqoi2012]交换棋子

给你一囗甜甜゛ 提交于 2019-11-28 17:24:41
目录 @description@ @solution@ @accepted code@ @details@ @description@ 有一个n行m列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态。要求第i行第j列的格子只能参与mi,j次交换。 Input 第一行包含两个整数n,m(1<=n, m<=20)。以下n行为初始状态,每行为一个包含m个字符的01串,其中0表示黑色棋子,1表示白色棋子。以下n行为目标状态,格式同初始状态。以下n行每行为一个包含m个0~9数字的字符串,表示每个格子参与交换的次数上限。 Output 输出仅一行,为最小交换总次数。如果无解,输出-1。 Sample Input 3 3 110 000 001 000 110 100 222 222 222 Sample Output 4 @solution@ 首先假如黑色棋子通过交换移动到了目标状态,那么白色棋子也就相应地变为了目标状态。 这意味着我们可以将黑色棋子视为 “有棋子”,白色棋子视为 “空格子”,将交换视为 “移动某个棋子到一个相邻的空格子”(因为不可能同色棋子之间交换)。 假如一个格子 p 起始情况是有棋子,终止情况也是有棋子,那么我们可以视作这个地方没有棋子。 为什么呢?假如 p 的棋子移动到了 x,而另一个 y 的棋子移动到了 p。它等价于没有

bzoj 4810

对着背影说爱祢 提交于 2019-11-28 15:36:40
4810: [Ynoi2017]由乃的玉米田 Time Limit: 30 Sec Memory Limit: 256 MB Submit: 1363 Solved: 649 [ Submit ][ Status ][ Discuss ] Description 由乃在自己的农田边散步,她突然发现田里的一排玉米非常的不美。这排玉米一共有N株,它们的高度参差不齐。 由乃认为玉米田不美,所以她决定出个数据结构题 这个题是这样的: 给你一个序列a,长度为n,有m次操作,每次询问一个区间是否可以选出两个数它们的差为x,或者询问一个区间是 否可以选出两个数它们的和为x,或者询问一个区间是否可以选出两个数它们的乘积为x ,这三个操作分别为操作1 ,2,3选出的这两个数可以是同一个位置的数 Input 第一行两个数n,m 后面一行n个数表示ai 后面m行每行四个数opt l r x opt表示这个是第几种操作,l,r表示操作的区间,x表示这次操作的x 定义c为每次的x和ai中的最大值,ai >= 0,每次的x>=2n,m,c <= 100000 Output 对于每个询问,如果可以,输出yuno,否则输出yumi Sample Input 5 5 1 1 2 3 4 2 1 1 2 1 1 2 2 3 1 1 1 3 5 5 16 1 2 3 4 Sample Output yuno yumi

BZOJ 2588: Spoj 10628. Count on a tree 主席树

早过忘川 提交于 2019-11-28 13:31:25
title BZOJ 2588 LUOGU 2633 LUOGU SP10628 简化题意: 给你一棵有n个结点的树,节点编号为 \(1\sim n\) 。每个节点都有一个权值。要求执行以下操作: U V K:求从节点 \(u\oplus lastans\) 到节点 \(v\) 的第 \(k\) 小权值。 analysis 离散化,把节点的点权换成它在所有点权中的排名; 建立主席树,每个节点维护它到根的路径上的权值线段树,所以每个节点可以利用它的父节点更新,所以将整棵树 \(dfs\) 一遍,在此过程中建树。 求解:用 \(x\) 点的主席树 \(+y\) 点的主席树 \(-lca(x,y)\) 的主席树 \(-lca(x,y)\) 父节点的主席树,在这样产生的主席树上查找第 \(k\) 小的排名,最后输出它原来的点权。 code #include<bits/stdc++.h> const int maxn=1e5+10; namespace IO { 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

bzoj 4916 神犇和蒟蒻 杜教筛

可紊 提交于 2019-11-28 12:56:04
第一题结合莫比乌斯函数定义,值恒为1。 第二题,phi(i^2) = phi(i) * i,根据欧拉函数的定义式能推出来,每个质因子的指数都增加一倍,都提出来一份,就是原先的phi(i)*i。然后还是跟g(x)卷一下,杜教筛即可。 1 #include <cstdio> 2 #include <map> 3 #include <cmath> 4 using namespace std; 5 typedef long long ll; 6 const int MAXN = 1000100,mo = 1e9 + 7,inv2 = (mo + 1) / 2,inv6 = (mo + 1) / 6; 7 8 int n,maxn,phi[MAXN],sum[MAXN],pri[MAXN]; 9 bool vis[MAXN]; 10 map<int,int> f; 11 int solve(int n) 12 { 13 if (n <= maxn) 14 return sum[n]; 15 if (f.count(n)) 16 return f[n]; 17 int ans = (ll)n * (n + 1) % mo * (n * 2 + 1) % mo * inv6 % mo; 18 for (int l = 2,r;l <= n;l = r + 1) 19 { 20 r = n /

BZOJ 4916 神犇和蒟蒻

元气小坏坏 提交于 2019-11-28 10:18:47
思路:杜教筛 提交: \(2\) 次 错因: \(sum\) 函数处取模出错 题解: 首先第一问是智商检测题: \(\sum_{i=1}^n \mu(i^2)\) 显然为 \(1\) 第二问其实是跟杜教筛板子那篇里面说的似的: \(f=\varphi(i^2)=\varphi(i)\cdot i\) \(S(n)=\sum_{i=1}^{n}f(i)\) 配式子: \(id^2=f\cdot id\) 所以式子就成了 \(1\cdot S(n)=\sum_{i=1}^{n}i^2-\sum_{i=2}^{n}i\cdot S(\frac{n}{i})\) #include<cstdio> #include<iostream> #include<map> #define ll long long #define R register int using namespace std; namespace Luitaryi { template<class I> inline I g(I& x) { x=0; register I f=1; register char ch; while(!isdigit(ch=getchar())) f=ch=='-'?-1:f; do x=x*10+(ch^48); while(isdigit(ch=getchar())); return x*=f;