bzoj

BZOJ 3679 数字之积 数位DP

旧巷老猫 提交于 2019-11-27 13:37:29
思路:数位DP 提交: \(2\) 次 错因:进行下一层 \(dfs\) 时的状态转移出错 题解: 还是记忆化搜索就行,但是要用 \(map\) 记忆化。 见代码 #include<cstdio> #include<iostream> #include<map> #define R register int #define ll long long 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; } ll n,l,r,num[19],len,stk[19],top; map<ll,ll> f[20]; inline void print() { for(R i=1;i<=top;++i) cout<<stk[i]; } inline ll dfs(int l,bool ul,bool ck,ll ml) { if(l==0) {return ml<=n&&ml>0?1:0;} if(

BZOJ 4943: [Noi2017]蚯蚓 字符串哈希

自作多情 提交于 2019-11-27 10:56:21
title BZOJ 4943 LUOGU 3823 简化题意: 给出 \(n\) 个字符,初始每个字符单独成字符串。支持 \(m\) 次操作,每次为一下三种之一: 1 i j :将以 \(i\) 结尾的串和以 \(j\) 开头的串连到一起。 2 i :将 \(i\) 所在串从 \(i\) 位置和 \(i\) 下一个位置之间断开。 3 S k :对于字符串 \(S\) 每个长度为 \(k\) 的子串,统计它在这 \(n\) 个字符组成所有字符串中出现的次数,求所有统计结果的乘积模 \(998244353\) 的结果。 \(n\leqslant 2×10^5\) , \(m\leqslant 5×10^5\) , \(\sum|S|\leqslant 10^7\) , \(k\leqslant 50\) , 2 i 操作次数 \(c\leqslant 1000\) 。 analysis 读过题目,大佬直觉要用链表模拟蚯蚓队列,蒟蒻看过题解方可知道(逃。 解释一下三个操作的具体做法: 对于每一个1号操作,计算所有新增的,长度在50以内的子串的哈希值,并加入哈希表中。 对于每一个2号操作,计算所有被切断的,长度在50以内的子串的哈希值,并在哈希表中除去。 对于每一个3号操作,计算每个子串的哈希值,并在哈希表中找到它们的出现次数,并相乘得到答案。 哈希表就默认都会了,那么就来分析一下复杂度

[lct][最小生成树][主席树] Bzoj P4046 Pork barre

限于喜欢 提交于 2019-11-27 10:43:05
Description Winning the election was simpler than you expected: it was enough to promise to finally build a good quality, country-wide road infrastructure, of course without crippling the budget_ Your happiness did not last long, however: it seems, that the citizens have found a way to actually hold you accountable for your promise! There are n major cities in your country. The Ministry of Transport has prepared a detailed map, outlining m possible highway connections, together with their costs. The Quality Assurance Committee will not let you build a highway cheaper than l, and the National

图论神仙题大赏

妖精的绣舞 提交于 2019-11-27 04:04:25
BZOJ 3445 Roadblock 先跑一边最短路,然后枚举最短路上的每条边,将路径翻倍然后跑Dijstra. 因为不在最短路径上的边没用贡献,然后最短路径最长为 n−1 复杂度 O(nmlogm) BZOJ 1579 道路升级 两维:k使用了多少次更新,u最短路ww咱可以跑dp? 分层图,第一层:原图,第二层内部:原图,然后从第一层点u向第二层点v连一条长度为0的边,从第二层点v再向第一层点u连一条长度为0的边。 因为有可能用不完k个,所以需要从u到u连一条长度为0的边(单向的) BZOJ 4152 The Captain 假设 \(x_1<x_2<x_3\) 那么选择 \(x_3\) 不如选择 \(x_1->x_2\) ,再选择 \(x_2\) 到 \(x_3\) 按x轴排序,相邻的点建边,然后就是O(n); 按照某维坐标排序,相邻两个点在这一维度上的差值最小,所以两两连边,长度为这一维度上的差值(不用考虑另外一维度的,就算另外一维度的更小,在连另外一维度的时候也能够抵达)。然后跑最短路即可。 BZOJ 1050 旅行 COMF 枚举最小边,然后大概就是跑最小生成树的思路,然后找最大边 枚举最小边,用更大的边做 Kruskal,当 S 和 T 连通立即 Break。 LCT,从大到小加边维护最小生成树。 1.边按权值排序,标号1~m 2.初始化一个枚举起点sta=1 3

BZOJ 2101: [Usaco2010 Dec]Treasure Chest 藏宝箱(这是我写过最骚气的dp!)

[亡魂溺海] 提交于 2019-11-27 03:16:06
题目描述 贝西和邦妮找到了一个藏宝箱,里面都是金币! 但是身为两头牛,她们不能到商店里把金币换成好吃的东西,于是她们只能用这些金币来玩游戏了。 藏宝箱里一共有N枚金币,第i枚金币的价值是Ci。贝西和邦妮把金币排成一条直线,她们轮流取金币,看谁取到的钱最多。贝西先取,每次只能取一枚金币,而且只能选择取直线两头的金币,不能取走中间的金币。 当所有金币取完之后,游戏就结束了。 贝西和邦妮都是非常聪明的,她们会采用最好的办法让自己取到的金币最多。 请帮助贝西计算一下,她能拿到多少钱? 输入 第1行:单个整数N,表示硬币的数量,1<=N≤5000 第2~N+1行:第i+1行有一个整数Ci,代表第i块硬币的价值,1≤Ci≤5000 输出 输出一行:单个整数,表示如果双方都按最优策略玩游戏,先手可以拿到的最大价值。 样例输入 Copy 4 30 25 10 35 样例输出 Copy 60空间限制:64MB,n<=5000,开5000*5000的二维数组需要94MB的内存!!题解:首先,应该是一个n方(时间复杂度)的dp,看到空间果断是要压掉一维的。n方的方程式: f[i,j]=sum[i,j]-min(f[i+1,j],f[i,j-1]). //强行解释: f[i][j]表示从i到j取得最大值。 sum为前缀和,sum[i][j]就是i到j的累加和 注意了!!!!(划重点,敲黑板

8月清北学堂培训 Day6

旧时模样 提交于 2019-11-27 00:02:21
今天是杨思祺老师的讲授~ 图论 双连通分量 在无向图中,如果无论删去哪条边都不能使得 u 和 v 不联通, 则称 u 和 v 边双连通; 在无向图中,如果无论删去哪个点(非 u 和 v)都不能使得 u 和 v 不联通,则称 u 和 v 点双连通。 u 到 v 的路径没有必经边和必经点 。 割点:删去该点,图分裂为多个连通块。 割边:也叫 “ 桥 ”,删去该边,图分裂为多个连通块。 点双连通分量 类似地,定义 dfn u 和 low u 。 如果 v 是 u 的子结点,并且 low v ≥ dfn u 则点 u 是割点,删去 点 u 后 v 子树和其它点不连通。 每个割点属于多个点双连通分量,非割点只属于一个点双连通分量。 边双连通分量 类似地,定义 dfn u 和 low u 。 如果 v 是 u 的子结点,并且 low v > dfn u 则边 < u, v > 是割边。 每个点属于一个边双连通分量, 边双连通分量之间以割边连接。 洛谷P3469 [POI2008]BLO-Blockade 在Byteotia有 n 个城镇。 一些城镇之间由无向边连接。 在城镇外没有十字路口,尽管可能有桥,隧道或者高架公路(反正不考虑这些)。每两个城镇之间至多只有一条直接连接的道路。人们可以从任意一个城镇直接或间接到达另一个城镇。 每个城镇都有一个公民,他们被孤独所困扰。事实证明

DP&图论 DAY 5 上午

空扰寡人 提交于 2019-11-26 19:47:11
DP&图论 DAY 5 上午 POJ 1125 Stockbroker Grapevine 有 N 个股票经济人可以互相传递消息,他们之间存在一些单向 的通信路径。现在有一个消息要由某个人开始传递给其他所有 人,问应该由哪一个人来传递,才能在最短时间内让所有人都接 收到消息。 Solution 全局最短路 Floyd POJ 1502 MPI Maelstrom 给出 N 个处理器之间传递信息所需时间矩阵的下三角,求信息 从第一个处理器传到其它所有处理器所需时间最大值。 Solution 单源最长路 dij(n m logn) n^2 logn POJ 1511 Invitation Cards N 个点 M 条边的有向图,询问对于所有 i ,从点 1 出发到点 i 并 返回点 1 所需时间最小值。 Solution # 正向建图 + 单源最短路 # 反向建图 + 单源最短路 ,所以就是把有向边反过来,从点1出发 dij 其实是反向最短路 POJ 1724 ROADS 有 N 个城市和 M 条单向道路,每条道路有长度和收费两个属性。 求在总费用不超过 K 的前提下从城市 1 到城市 N 的最短路。 Solution Dijkstra ,同时维护当前路径总费用,超过费用上限的状态不再转移 对于每个点拆成k个点,(u,0),(u,1),.......(u,k) 分层图 POJ 1797

BZOJ 4103: [Thu Summer Camp 2015]异或运算 可持久化trie

喜夏-厌秋 提交于 2019-11-26 19:18:19
开始想了一个二分+可持久化trie验证,比正解多一个 log 仔细思考,你发现你可以直接按位枚举,然后在可持久化 trie 上二分就好了. code: #include <bits/stdc++.h> #define N 700005 #define setIO(s) freopen(s".in","r",stdin) using namespace std; int n,m,tot,tl,tr; int ch[N*30][2],cnt[N*30],xx[N],yy[N],rt[N],t1[N],t2[N]; void insert(int pre,int &x,int v) { int now=x=++tot; for(int i=30;i>=0;--i) { int o=((v>>i)&1); ch[now][o^1]=ch[pre][o^1]; ch[now][o]=++tot; pre=ch[pre][o]; now=ch[now][o]; cnt[now]=cnt[pre]+1; } } int query(int L,int R,int kth,int len) { if(len<0) return 0; int re=0,cur=1,i; for(cur=1,i=L;i<=R;++i,++cur) { int o=((xx[i]>>len)&1); re+=cnt

BZOJ 1061: [Noi2008]志愿者招募 最小费用最大流

你。 提交于 2019-11-26 17:59:50
title BZOJ 1061 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。 analysis 这道题是要好好写写题解的。 刚开始我所想到的模型便是

BZOJ 2879: [Noi2012]美食节 最小费用最大流+动态连边

不打扰是莪最后的温柔 提交于 2019-11-26 17:58:06
title BZOJ 2879 LUOGU 2050 Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节。作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴。他很快就尝遍了美食节所有的美食。然而,尝鲜的欲望是难以满足的。尽管所有的菜品都很可口,厨师做菜的速度也很快,小M仍然觉得自己桌上没有已经摆在别人餐桌上的美食是一件无法忍受的事情。于是小M开始研究起了做菜顺序的问题,即安排一个做菜的顺序使得同学们的等待时间最短。小M发现,美食节共有n种不同的菜品。每次点餐,每个同学可以选择其中的一个菜品。总共有m个厨师来制作这些菜品。当所有的同学点餐结束后,菜品的制作任务就会分配给每个厨师。然后每个厨师就会同时开始做菜。厨师们会按照要求的顺序进行制作,并且每次只能制作一人份。此外,小M还发现了另一件有意思的事情: 虽然这m个厨师都会制作全部的n种菜品,但对于同一菜品,不同厨师的制作时间未必相同。他将菜品用1, 2, ..., n依次编号,厨师用1, 2, ..., m依次编号,将第j个厨师制作第i种菜品的时间记为 ti,j 。小M认为:每个同学的等待时间为所有厨师开始做菜起,到自己那份菜品完成为止的时间总长度。换句话说,如果一个同学点的菜是某个厨师做的第k道菜,则他的等待时间就是这个厨师制作前k道菜的时间之和。而总等待时间为所有同学的等待时间之和。现在