cstring

【浮*光】#树形DP# 树形DP的习题集

烈酒焚心 提交于 2020-05-05 15:03:06
T1:【p2996】拜访奶牛 树的相邻节点不能选择,求最多选择的节点数。 【0/1型树形dp】← 也只有我这样叫... 这题是真的很模板... f[x] 即 拜访x时最大数量,g[x] 即 不拜访x时最大数量。 转移方程:f[x]=1+∑g[son[i]],g[x]=∑max(f[son[i]],g[son[i]])。 不妨假设从1号点出发,那么答案即为max(f[1],g[1])。 #include<iostream> #include <cstdio> #include <cstring> #include <algorithm> #include < string > #include <queue> #include <map> #include <vector> #include <cmath> using namespace std; typedef long long ll; /* 【p2996】拜访奶牛 N(1<=N<=50000)个朋友构成一棵树。求:可以拜访的朋友的最大数目。 限制:对于由一条路直接相连的两个奶牛,只能拜访其中的一个。 */ /* 【0/1型树形dp】← 也只有我这样叫... f[x] 即 拜访x时最大数量,g[x] 即 不拜访x时最大数量。 转移方程:f[x]=1+∑g[son[i]],g[x]=∑max(f[son[i]],g[son[i]]

JZOJ| 5910. DuLiu

爷,独闯天下 提交于 2020-05-05 13:36:26
Description LF是毒瘤出题人中AK IOI2019,不屑于参加NOI的唯一的人。他对人说话,总是满口垃圾题目者也,教人半懂不懂的。因为他姓李,别人便从QQ群上的“毒瘤李Fee”这半懂不懂的话里,替他取下一个绰号,叫做李Fee。 李Fee一到机房,所有做题的人便都看着他笑,有的叫道,“李Fee,你又来出毒瘤题了!”他不回答,对验题人说,“我又出了两道题,给我验验。”便排出一排毒瘤题。大家又故意的高声嚷道,“你又暴露奸商本性拿毒瘤题骗钱剥削验题人了!”李Fee睁大眼睛说,“你怎么这样凭空污人清白……”“什么清白?我前天亲眼见你出了道毒瘤骗钱题,被PTY把std吊着打。” 李Fee便涨红了脸,额上的青筋条条绽出,争辩道,“出题人的题不能算骗……毒瘤!……出题人的题,能算毒瘤骗钱题么?”接连便是难懂的话,什么“多叉splay随机点分治”,什么“树链剖分套分治FFT”之类,引得众人都哄笑起来:机房内外充满了快活的空气。 虽然他的题十分毒瘤,但他的题还总是有买家。李Fee现在有N道毒瘤题,想将这些题出成一组题来骗大钱。然而显而易见的是,一组题的毒瘤程度不仅和每道题的毒瘤程度有关,也跟它们的排列顺序有关,李Fee需要将它们排列成最毒瘤但又最能骗钱的那个顺序。 具体来说,这N道题每题都有一个毒瘤值,它们构成了一个序列。李Fee心目中有一个理想的毒瘤值序列

[USACO06JAN]树林The Grove

可紊 提交于 2020-05-05 12:08:43
树木(grove) Time Limit: 1Sec Memory Limit: 64 MB 【Description】 牧场里有一片树林,林子里没有坑. 贝茜很想知道,最少需要多少步能围绕树林走一圈,最后回到起点.她能上 下左右走,也能走对角线格子.牧场被分成R 行C 列(1≤R≤50,1≤C≤50).下 面是一张样例的地图,其中“.”表示贝茜可以走的空地, “X”表示树林, “*” 表示起点.而贝茜走的最近的路已经特别地用“+”表示出来. ...+... ..+X+.. .+XXX+. ..+XXX+ ..+X..+ ...+++* 题目保证,最短的路径一定可以找到. 【Input】 第1 行输入R 和C,接下来R 行C 列表示一张地图.地图中的符号如题 干所述. 【Output】、 输出最少的步数. 【Sample Input】 6 7 ....... ...X... ..XXX.. ...XXX. ...X... ......* 【Sample Output】 13 题解: 有一种很有意思的做法就是随便找一棵树向下沿出一条线,不能从右向左跨越这条线,如果从左向右跨越这条线的话就记为dis[1][x][y],那么只要是跨过了这条线就形成了一个环啦,最后的答案当然是dis[1][bx][by] 代码: #include<cstdio> #include <cstring>

poj1065 Wooden Sticks[LIS or 贪心]

空扰寡人 提交于 2020-05-04 23:52:55
地址戳这。N根木棍待处理,每根有个长x宽y,处理第一根花费1代价,之后当处理到的后一根比前一根长或者宽要大时都要重新花费1代价,否则不花费。求最小花费代价。多组数据,N<=5000 本来是奔着贪心来做的。首先按照套路想到排序,长优先宽再次从小到大。由于要不浪费,尽量按照顺序去找,第一次把花费仅为1的最长子序列抽出来,标记之后,再循环找下一个未被标记的最长子序列保证只花费1,这样应该是最优的。但是鉴于$N$的范围和多组数据没敢这样做,虽然后来发现数据水这样也可以过。然后瞎想到把数对$(x,y)$抽象成点,就在坐标系中用尽量少的y值单调不减的折线去覆盖上所有点。而x值天然有一个从小到大的顺序,那不就二维偏序么,再说直白一点,就是x看成下标,y看成值,找不下降子序列的最少个数的说。这个求min不下降子序列根据 Dilworth定理可知 ,它求的就是个最长下降子序列长度,这个只能 当结论记 因为我也不会证233。所以就可以上$O(nlogn)$算法啦,就不怕他多组数据了。x值相同的注意一点就行,按y从小到大dp(想一想为什么)。 维护这个这次用了树状数组因为之前没在这上面用过,发现真 好写又好用 啊。以y值为树状数组下标,每次找比i的a[i]小的就在0~a[i]-1这个树状数组区间内找最大值即可,最大值维护也很简单,和sum差不多(不过BIT只可以维护从1到i的,若维护区间的可能要麻烦一点

数列分块入门1-9 By hzwer

会有一股神秘感。 提交于 2020-05-04 06:43:34
声明 持续更新,因为博主也是正在学习分块的知识,我很菜的,菜的抠$jio$ 写在前面 分块是个很暴力的算法,但却比暴力优秀的多,分块算法的时间复杂度一般是根号的,他的主要思想是将一个长度是$n$的数列分为$m$个块,在每个块上维护一些东西,询问的时候才会用到这些维护的东西,就像线段树中的懒标记一样。 Loj #6297. 数列分块入门1 这道题目是分块最基础的题目,仅需要支持区间加法和单点查询两个操作。 将这个数列分为$\sqrt{n}$块。同时可以确定每个块的左右端点。然后在于处理一个数组$in$,表示第$i$个元素在第$in[i]$块内。 再用一个$addtag$数组表示每个块的加法标记,到最后查询的时候会用到。 下面开始进行区间修改操作的讲解 假设给定的要修改序列的左右端点为$l$和$r$,那么可能会有三种情况出现, $l$和$r$在同一个块内,那么只需要暴力的修改l到r便可。 $l$和$r$不在同一个块,那么要分别对$l$和$r$所在的块进行修改。 这一种是第$2$种的一个分支情况,就是$l$和$r$之间还有很多个块,因为这些块都是被整体修改,所以直接打到标记上就行。 下面给出这道题的代码 神呐,原谅我的码风放荡不羁 #include <iostream> #include <cstdio> #include <cmath> typedef long long LL;

洛谷 P1924 poj 1038

狂风中的少年 提交于 2020-05-04 06:43:13
Description: 给你一个n * m的方格纸,有一些格子无法被覆盖,然后用2*3的格子覆盖这个方格纸,问你最多能放多少个格子 神级状压 为了弄清楚这道题翻了无数篇解题报告,最后终于搞明白了 用三进制表示每行的状态。 比如对于第i行第j列的格子,如果i-1行,i行的j列都是空的则用0表示,i行的j列不能放用2表示,剩下的(仅i - 1行的j列不能放)用1表示 然后深搜进行转移 干讲没意思,具体看注释,写的很清楚了(AC代码是poj的,稍微改一下输入输出就是洛谷的、 #include<iostream> #include <cstring> #include <cstdio> using namespace std; const int N = 59050 ; /* pre表示你枚举的上一个状态,now表示你现在枚举的状态 */ int dp[ 2 ][N], mp[ 160 ][ 15 ], pre[ 12 ], now[ 12 ], n, m, d, cur; int base [] = { 0 , 1 , 3 , 9 , 27 , 81 , 243 , 729 , 2187 , 6561 , 19683 , 59049 }; void init(){ memset(mp, 0 , sizeof (mp)); memset(dp, - 1 , sizeof (dp)); }

BZOJ4482[Jsoi2015]套娃——贪心+set

ε祈祈猫儿з 提交于 2020-05-04 06:41:02
题目描述 【故事背景】 刚从俄罗斯旅游回来的JYY买了很多很多好看的套娃作为纪念品!比如右 图就是一套他最喜欢的套娃J。JYY由于太过激动,把所有的套娃全 部都打开了。而由于很多套娃长得过于相像,JYY现在不知道该如何把它们装 回去了(他实在搞不清,应该把哪个套娃装到哪个里面去了)。 JYY一共有N个拆开的套娃,每个套娃从1到N编号。编号为i的套娃有一个外径Outi和一个内径Ini(Ini<Outi)。 对于套娃i和套娃j,如果满足Outi<INj,那么套娃i就可以装到套娃j里面去。 注意,一个套娃内部,不允许并排的放入多个套娃。 也就是说,如果我们将i装到j的内部之后,还存在另一个套娃k,也满足Outk<Inj,我们此时是不允许再将k放 到j内部的(因为j的内部已经放入了i)。但是,如果k还满足Outk<Ini,那么我们允许先将k放到i的内部, 然后再把k和i作为一个整体放入j的内部。 JYY认为一套好的套娃,内部的空隙一定是尽量少的。如果套娃j内部装入了套娃i,那么我们认为,套娃j内部 产生的空隙为Inj-Outi;如果套娃j的内部什么也没有装,那么套娃j的空隙则就是Inj。 JYY也希望,那些长得更加好看的套娃,里面可以填的尽量满一些;而相对 那些不那么好看的套娃,JYY也就相对不那么介意一些。为此JYY对于编号为 i的套娃设置了一个好看度Bi,如果这个套娃内部还存在K的空隙

Codeforces Round #552 (Div. 3)

£可爱£侵袭症+ 提交于 2020-05-04 06:35:29
本场题目不难,暴力模拟大法好。A~E:模拟+暴力(有些是贪心);F:留坑待填;G:埃氏筛+贪心。 A、Restoring Three Numbers 思路:简单数学。 AC代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cmath> 5 #include <iostream> 6 #include <algorithm> 7 #include <iomanip> 8 #include <complex> 9 #include < string > 10 #include <vector> 11 #include < set > 12 #include <map> 13 #include <list> 14 #include <deque> 15 #include <queue> 16 #include <stack> 17 #include <bitset> 18 using namespace std; 19 typedef long long LL; 20 typedef unsigned long long ULL; 21 const int dir[ 4 ][ 2 ] = {{- 1 , 0 }, { 0 , 1 }, { 1 , 0 }, { 0 , - 1 }};

Codeforces Round #555 (Div. 3)

自古美人都是妖i 提交于 2020-05-04 06:30:06
贪心+模拟大法好! A、Reachable Numbers 思路:简单模拟。不难发现,通过f函数运算下去的步骤数量不会很多,所以暴力模拟,只要有一个数字第二次出现break即可。 AC代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cmath> 5 #include <iostream> 6 #include <algorithm> 7 #include <iomanip> 8 #include <complex> 9 #include < string > 10 #include <vector> 11 #include < set > 12 #include <map> 13 #include <list> 14 #include <deque> 15 #include <queue> 16 #include <stack> 17 #include <bitset> 18 using namespace std; 19 typedef long long LL; 20 typedef unsigned long long ULL; 21 const int dir[ 4 ][ 2 ] = {{- 1 , 0 }, { 0 , 1 }, { 1 , 0 }, { 0 , -

Plants vs. Zombies(2018ICPC青岛站E题) 二分

怎甘沉沦 提交于 2020-05-04 06:13:32
Plants vs. Zombies                                                ZOJ - 4062 BaoBao and DreamGrid are playing the game Plants vs. Zombies . In the game, DreamGrid grows plants to defend his garden against BaoBao's zombies There are plants in DreamGrid's garden arranged in a line. From west to east, the plants are numbered from 1 to and the -th plant lies meters to the east of DreamGrid's house. The -th plant has a defense value of and a growth speed of . Initially, for all . DreamGrid uses a robot to water the plants. The robot is in his house initially. In one step of watering, DreamGrid will