热身训练4 Eighty seven】的更多相关文章

Eighty seven 简要题意: n个卡片,其中第i个卡片的数值为$a[i]$.一共q次询问,每次询问将删去其中3个卡片(可能删除若干相同的卡片)后,问能否选出10个卡片,数值之和等于87. n≤50,q≤100000 分析: 当我们知道删去哪些卡片后,这是一道很显然的背包dp. dp[i][j]表示:选择了i个卡片,数值之和为j,这个状态行不行,若dp[i][j]=1,则行.否则,不行. 由于数值都是正数,且要求的数值之和为87,所以这个dp耗时O(87*10*n),但由于询问数很多,最终…
数位dp 数位dp是一种计数用的dp,一般就是要统计一段区间$[L,R]$内,满足一定条件的数的个数,或者各个数位的个数. 数位dp使得暴力枚举变为满足一定状态的记忆化,更加优秀. 数位dp常常会考虑以下问题: 1.前导零的处理$lead$ 2.枚举的上界$limit$ 3.得到答案的条件 一般数位dp的模板 #include<bits/stdc++.h> using namespace std; #define re register int #define int long long in…
Article 在这个学期即将结束时,DRD开始写他的最后一篇文章. DRD使用著名的Macrohard的软件World来写他的文章. 不幸的是,这个软件相当不稳定,它总是崩溃. DRD需要在他的文章中写N个字符. 他可以在i+0.1的时候按一个键来输入一个字符,其中i是一个等于或大于0的整数. 但是在每一次i-0.1的时候,如果整数i严格大于0,世界可能会以概率p崩溃,DRD就会失去他的工作,所以他可能不得不从他最近保存的文章重新开始. 为了防止重复写,DRD可以在i时间按Ctrl-S来保存他…
The All-purpose Zero 简要题意:  长度为n的数组,每个数字为S[i],$0$是一种很神奇的数字,你想要的,它都可以变! 问这个序列的最长上升子序列长度为多少? 分析: 我们将除了'0'以外的S[i],减去i之前出现的'0'的个数,最后求得排除'0'后的最长上升子序列长度,加上'0'的个数,就是我们要求的答案. 在这里我不主要分析该做法的正确性,我们引入一个O(nlogn)的方法来求最长上升子序列. LIS (点此看题) 贪心+二分 我们令f[i]表示长度为i的上升子序列,末…
Palindrome 简要题意:  我们有一个字符串S,字符串的长度不超过500000. 求满足S[i]=S[2n−i]=S[2n+i−2](1≤i≤n)(n≥2)的子串个数.  分析: 我们能通过简单的数学知识,得到: 该子串是两个回文串拼在一起的,例如abcbabc中,前5项为一个回文串,后5项有一个回文串. 第n项以及第2*n-1项为回文串的中心. 我们可以用Manacher 求得以每个$i$为中心点的回文串半径len[i]. 求得len[i]后,写一个方程: 令i<j, 1. i+len…
题目描述 简要题意:  n个数字,a1,a2,...,an m次询问(l,r),每次询问需回答 1.gcd(al,al+1,al+2,...,ar);2.gcd(ax,ax+1,ax+2,...,ay)=gcd(al,al+1,al+2,...,ar)的个数(x<=y). 分析: 算第一个询问,由于a数组是静态的,我们可以用ST表来预处理. 对于第二个询问,我们先令左端点x固定,那么随着y的增加,gcd(ax,...,ay)会越来越小,这是可以二分的!!!  这样看来,我们完全可以预处理出每个g…
题目来源 简要题意: 众所周知,在许多情况下,一个词语有两种意思.比如"hehe",不仅意味着"hehe",还意味着"excuse me". 现在,某某在和妹纸在线聊天,妹纸发送了一个句子A给某某.某某很聪明,知道这个句子中的词语B有两种意思.他想知道妹纸有多少种可能想表达的意思. 分析: 我们令可替换意思的字符串为key,长度为length. 如果我们知道key在原字符串内的哪些地方出现过,即mk[起点]=1. 我们很容易想到一个dp式子 f[…
题目出处:Calculator 简要题意: 你有一个确定的函数,f(x)=+...*...^...,其中共有n个操作,从左到右依次计算. 共有m次询问,我们每次询问,1.会修改f(x)中的操作:2.输出f(x)%29393 分析: 分解29393可以得到7*13*17*19,这几个数都很小,很容易预处理! 于是我们可以将一个f(x)%29393分成四个小方程 我们令 a1=f(x)%7; a2=f(x)%13; a3=f(x)%17; a4=f(x)%19. 那么由中国剩余定理,可以得到模293…
点此进入 题意: 一棵树,n+1 个节点,以0号节点为根,给出端点(a,b),节点a到节点b的路径上,至少有一个点是"坏掉的",求"坏掉的点"最少 分析: Step1:贪心 每次给出的两个端点,我们可以得到他俩的lca,画一下图我们即可知道,lca深度越深,下面的点就越需要单独选一下,并且选了之后,对lca在上面的点影响不大 同时,我们每次选一段路径上的点时,肯定选深度较低的,这样最优 Step2:线段树标记选过的点 我们选过的节点,那么它的子树我们都可以不用选了…
http://acm.hdu.edu.cn/showproblem.php?pid=6333 题意: 求 C(0,n)+C(1,n)+...+C(m,n) 分析: 这道题,我们令s(m,n) = C(0,n)+C(1,n)+...+C(m,n) 那么这道题就变成求各种s(m, n) 于是,莫队这个算法便可浮现在脑海里! 我们现在需要用O(1)的时间转移式子 s(m,n)=s(m-1,n)+C(m,n) s(m,n)=s(m+1,n)-C(m+1,n) S(m,n)=2*s(m,n-1)-C(m,…