这么sb的题考场居然写挂了2233. 假设n=∏iaiki" role="presentation" style="position: relative;">n=∏iakiin=∏iaiki 那么集合中合法的数一定满足: t=∏i(1/aiki)" role="presentation" style="position: relative;">t=∏i(1/akii)t=∏i(1/aiki) 发…
题目大意: 给出n和k,求从小于等于n的数中取出不超过k个,其乘积是无平方因子数的方案数.无平方因子数:不能被质数的平方整除. 题目分析: 10(枚举\(n\le8\)),40(简单状压\(n\le16\)),70(高级状压\(n\le30\)),100(正解状压n\le500,k\le500). 对于前百分之70,由于\(n\le30\),质数只有10个,直接状压水. 正解(状压dp+分组背包): 注意到1~n中每个数含有的大于\(\sqrt{n}\)的质因数最多有1种,而\(\sqrt{n}…
差不多是原题啊. 求最长链变成了最长链计数,其余没有变化. 这一次考试为了保险起见本蒟蒻还是写了上次没写的辅助数组. 代码: #include<bits/stdc++.h> #define N 50005 #define M 200005 #define mod 1000000007 #define ll long long using namespace std; inline int read(){ int ans=0; char ch=getchar(); while(!isdigit(…
签到水题啊... 这题完全跟图论没有关系. 显然如果确定了哪些点会被选之后顺序已经不重要了.于是我们给点按权值排序贪心从大向小选. 我们要求的显然就是∑i(a[i]−(n−i))" role="presentation" style="position: relative;">∑i(a[i]−(n−i))∑i(a[i]−(n−i)) 当这个贡献非正时停止枚举. 然后就没了. 代码: #include<bits/stdc++.h> #def…
传送门 状压dp好题. 考虑对于两个给出的集合. 如果没有两个元素和相等的子集,那么只能全部拼起来之后再拆开,一共需要n1+n2−2n1+n2-2n1+n2−2. 如果有呢? 那么对于没有的就是子问题了. 因此我们要最大化这样的子集数. 这就需要状压dp了. 我们把两个集合拼成一个,然后第二个集合合并进去的时候权值取负的,这样如果某个子集元素和为0表示该子集和满足要求. 然后枚举一下之前的状态来转移就行了. 代码: #include<bits/stdc++.h> using namespace…
传送门 今天的送分题. 首先考虑每次给要围上栅栏的矩阵里的整体加上1,如果栅栏被撤销就整体减1,最后比较两个点的值是否相同来进行判断. 然而这样的效果并不理想,很容易卡掉. 进一步思考,我们第iii次操作整体加上iii? 不行. 整体加上i2i^2i2? 还是不行. 等等. 貌似可以整体加上randrandrand. 于是欣喜地过了. 然而考完之后神仙出题人告诉我说整体加法可以被卡,而如果整体异或则被卡掉的几率很小. 于是重新写了一遍异或的版本. 代码…
传送门 对于每个点离线处理出向上走2i2^i2i班车到的最上面的点. 然后每个询问(u,v)(u,v)(u,v)先把(u,v)(u,v)(u,v)倍增到刚好走不到lcalcalca的情况(有一个点如果就是lcalcalca直接特判) 然后考虑最后把(u′,v′)(u',v')(u′,v′)连起来需要走一次还是两次. 这个就是一个二维数点问题了. 用dfsdfsdfs序求出每个点管辖的子树表示的区间. 然后对于询问(a,b)(a,b)(a,b)在dfs到aaa时统计bbb子树的答案. 把aaa子树…
传送门 仔细读题会发现只要所有点点权之和等于0一定有解. 如何构造? 直接当做树来构造就行了,非树边都赋值成0就行. 代码…
传送门 首先按照题意构造出转移矩阵. 然后可以矩阵快速幂求出答案. 但是直接做是O(n3qlogm)O(n^3qlogm)O(n3qlogm)的会TTT掉. 观察要求的东西发现我们只关系一行的答案. 于是倍增预处理出logloglog个矩阵每次变成O(n2)O(n^2)O(n2)转移. 代码…
传送门 T2防ak题? 其实也不是很难(考试时sb了). 直接变形一下求出区间长度在[l2,r2][l2,r2][l2,r2]之间,中位数≤l1−1\le l1-1≤l1−1的区间数,和区间长度在[l2,r2][l2,r2][l2,r2]之间,中位数≤r1\le r1≤r1的区间数就行了. 继续变变形,一个区间的中位数如果≤k\le k≤k. 那么显然有:区间中≤k\le k≤k的数的个数≤\leq≤区间中>k>k>k的数的个数. 我们记smallismall_ismalli​表示111…
传送门 签到题. 显然是可以贪心分组的,也就是尽量跟当前的分成一组. 这时我们需要判断a[l]+a[r],a[l+1]+a[r]...a[r−1]+a[r]a[l]+a[r],a[l+1]+a[r]...a[r-1]+a[r]a[l]+a[r],a[l+1]+a[r]...a[r−1]+a[r]是否在fibfibfib数列中出现过 . 由于2e92e92e9范围内兔子数列只有40+个数,因此我们反向思考,枚举fibfibfib数列,判断当前组内是否存在fib[i]−a[r]fib[i]-a[r]…
好数 题目背景 SOURCE:NOIP2016-AHSDFZ T3 题目描述 我们定义一个非负整数是"好数",当且仅当它符合以下条件之一: 1. 这个数是 0 或 1 . 2. 所有小于这个数且与它互质的正整数可以排成一个等差数列,例如,8 就是一个好数,因为 1,3,5,7 排成了等差数列. 给出 N 个非负整数,然后进行如下三个操作: 1. 询问区间 [L,R] 有多少个好数. 2. 将区间 [L,R] 内所有数对 S 取余(S≤1000000). 3. 将第 C 个数更改为 X…
ABCD 题目背景 SOURCE:NOIP2016-AHSDFZ T2 题目描述 有 4 个长度为 N 的数组 a,b,c,d .现在需要你选择 N 个数构成数组e ,数组e 满足 a[i]≤e[i]≤b[i] 以及…
第K小数 题目背景 SOURCE:NOIP2016-AHSDFZ T1 题目描述 有两个正整数数列,元素个数分别为 N 和 M .从两个数列中分别任取一个数相乘,这样一共可以得到 N*M 个数,询问这 N*M 个数中第 K 小数是多少. 输入格式 第一行为三个正整数 N,M 和 K . 第二行为 N 个正整数,表示第一个数列. 第三行为 M 个正整数,表述第二个数列. 输出格式 输出包含一行,一个正整数表示第 K 小数. 样例数据 1 输入 2 3 4 1 2 2 1 3 输出 3 样例数据 2…
传送门 题意简述:nnn个点的带边权无向图,定义一个图的权值是所有边的积,问所有nnn个点都连通的子图的权值之和. 思路: fif_ifi​表示保证集合iii中所有点都连通其余点随意的方案数. gig_igi​表示只考虑集合iii中所有点的状态的子图的权值和. 我们先预处理出ggg数组,然后考虑递推fff数组. 显然fif_ifi​是等于gig_igi​扣掉一些东西的,扣掉的应该就是不连通的情况. 于是我们枚举编号最小的点所在的连通块来扣掉非法情况. 时间复杂度O(n2n+3n)O(n2^n+3…
题目背景 SOURCE:NOIP2015-GDZSJNZX(难) 题目描述 Mike 正在在忙碌地发着各种各样的的短信.旁边的同学 Tom 注意到,Mike 发出短信的接收方手机号码似乎都满足着特别的性质,难道Mike 的好朋友是满足正态分布的?Tom 很好奇. 由于 Mike 有着自己最喜欢的数字 a ,并且 a 的范围是:2≤a≤9 .Tom 从这里入手,发现了一些端倪,假设 Mike 发的电话号码是一个十进制数字 S ,Tom 发现 S 会满足以下三个性质中的一个: 1.S 是 a 的倍数…
传送门 考试空间开大了爆零不然只有30分爆栈? 话说这题真的坑1e7没法写dfsdfsdfs 其实很好推式子. 考虑每个点安一个发动机的概率,推一波式子做个等比数列求和什么的可以证明出来是严格的1size\frac {1} {size}size1​其中sizesizesize表示子树的大小. 因此答案为: ∑i=1n1size[i]\sum _{i=1} ^n \frac {1} {size[i]}∑i=1n​size[i]1​ 然后线性递推逆元就能做了. 代码…
[描述] 小石头喜欢看电影,选择有 N 部电影可供选择,每一部电影会在一天的不同时段播 放.他希望连续看 L 分钟的电影.因为电影院是他家开的,所以他可以在一部电影播放过程中任何时间进入或退出,当然他不希望重复看一部电影,所以每部电影他最多看一次,也不能在看一部电影的时候,换到另一个正在播放一样电影的放映厅. 请你帮助小石头让他重 0 到 L 连续不断的看电影,如果可以的话,计算出最少看几 部电影. [输入格式] 第一行是 2 个整数 N,L,表示电影的数量,和小石头希望看的连续时间 接下来是…
传送门 状压dp好题. 怎么今天道道题都有点东西啊 对于今天题目神仙出题人先膜为上策:%%%%DzYoAk_UoI%%%% 设f[i][j]f[i][j]f[i][j]表示选取点的状态集合为iii,当前在jjj号点的状态总数. 然后枚举一个不在集合中的点转移. 但是直接这样做会算错. 为什么呢? 因为我们没有考虑状压时其它子树的影响. 因此再记一个数组g[i][j]g[i][j]g[i][j]表示选取集合为iii当前在jjj号点来进行状态转移. f[sta][p]=∑[E(u,v)]f[sta∣…
传送门 状压dp好题. 首先需要回忆O(nlogn)O(nlog n)O(nlogn)求lislislis的方法,我们会维护一个单调递增的ddd数组. 可以设计状态f(s1,s2)f(s1,s2)f(s1,s2)表示选取的数的集合是s1s1s1,然后d数组中元素的出现情况是s2s2s2. 这样转移是很简单的. 但时空都无法承受. 于是我们考虑优化,不难发现s1s1s1是s2s2s2的子集. 因此我们三进制状压dp就行了. 代码…
传送门 状压dp经典题. 令f[i][j]f[i][j]f[i][j]表示到第i个,第i−k+1i-k+1i−k+1~iii个物品的状态是j时的最大总和. 然后简单维护一下转移就行了. 由于想皮一下果断上了滚动数组优化发现速度rank1了. 代码…
传送门 状压dp好题啊. 可以发现这道题的状压只用压缩5位. f[i][j]表示当前在第i个位置状态为j的最优值. 显然可以由f[i-1]更新过来. 因此只用预处理在第i个位置状态为j时有多少个小朋友高兴就行了. 代码: #include<bits/stdc++.h> #define N 50005 using namespace std; int n,c,f[N][35],cal[N][35],las,ans=0; inline int read(){ int ans=0; char ch=…
传送门 状压dp经典题. 我们把每一行的状态压成01串. 预处理出每一行可能出现的状态,然后转移每个被压缩的状态的1的个数就行了. 注意当前行转移要考虑前两行的状态. 还要注意只有一行的情况. 代码: #include<iostream> #include<cctype> #include<cstdio> using namespace std; inline int read(){ int ans=0; char ch=getchar(); while(!isdigi…
传送门 看到n的范围的时候吓了一跳,然后发现可以矩阵快速幂优化. 我们用类似于状压dp的方法构造(1(1(1<<m)∗(1m)*(1m)∗(1<<m)m)m)大小的矩阵. 然后用快速幂转移. 代码: #include<bits/stdc++.h> #define mod 1000000007 #define N 128 #define ll long long using namespace std; int T,up,n,m; struct Matrix{ ll va…
传送门 一道神奇的期望状压dp. 用f[i][j]f[i][j]f[i][j]表示目前在第i轮已选取物品状态为j,从现在到第k轮能得到的最大贡献. 如果我们从前向后推有可能会遇到不合法的情况. 所以我们从后向前推. 这时怎么处理不合法的情况呢? 如果当前这个状态不具备选择k的条件. 那么说明第i+1轮可能具备. 于是f[i][j]+=f[i+1][j]f[i][j]+=f[i+1][j]f[i][j]+=f[i+1][j] 否则当前具备选k的条件. 所以要么当前轮不选,要么选了从f[i+1][j…
描述 农民 John 购买了一处肥沃的矩形牧场,分成M*N(1 <= M <= 12; 1 <= N <= 12)个 格子.他想在那里的一些格子中种植美味的玉米.遗憾的是,有些格子区域的土地是贫瘠的, 不能耕种. 精明的 FJ 知道奶牛们进食时不喜欢和别的牛相邻,所以一旦在一个格子中种植玉米,那么 他就不会在相邻的格子中种植,即没有两个被选中的格子拥有公共边.他还没有最终确定哪些 格子要选择种植玉米. 作为一个思想开明的人,农民 John 希望考虑所有可行的选择格子种植方案.由于太…
2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)-E. Explosion Exploit-概率+状压dp [Problem Description] 我方有\(n\)个人,对方有\(m\)个人,每个人都有一个健康值\(h_i\),有\(d\)次攻击,每次随机从所有人中选\(1\)个人,减少其\(1\)健康值.问将对方所有人都消灭的概率是多少? [Solution] 方法\(1\): ​ 将所有人的健康值作为…
算是一道比较新颖的题目 尽管好像是两年前的省选模拟赛题目.. 对于20%的分数 可以进行爆搜,对于另外20%的数据 因为k很小所以考虑上状压dp. 观察最后答案是一个连通块 从而可以发现这个连通块必然存在一个深度最浅的点且唯一 所以随便找一个点做根然后对自己子树内寻找答案就可以是正确的. 考虑另外的30%的数据k<=3 可是颜色数最多可以有n个 不知道哪个是最终答案. 一次状压dp的复杂度:\(2^{2k}\cdot n\) 容易得到可以暴力枚举一下 然后要做 \(C(n,3)\) 这样会TLE…
题面 菲菲和牛牛在一块\(n\)行\(m\)列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束. 落子的规则是:一个格子可以落子当且仅当这个格子内没有棋子且这个格子的左侧及上方的所有格子内都有棋子. 棋盘的每个格子上,都写有两个非负整数,从上到下第i 行中从左到右第j 列的格 子上的两个整数记作\(A_{i, j}\).\(B_{i, j}\).在游戏结束后,菲菲和牛牛会分别计算自己的得分:菲菲的得分是所有有黑棋的格子上的\…
传送门 状压dp入门题. 按照题意建一个图. 要求的就是合法的链的总数. 直接f[i][j]f[i][j]f[i][j]表示当前状态为jjj,下一位要跟iii连起来的方案数. 然后从没被选并且跟iii连通的点转移就行了. 代码: #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=20; bool tran[N][N]; int n,K,up,s[N]; ll f[N][1<<…