
牛客
文章平均质量分 63
nof_uck
人一我十,人百我万
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
最大值最小值算法(象棋博弈)
参考自:人工智能之博弈二、最大最小值方法象棋AI博弈算法(最大值最小值算法)主要思想其实就还是暴搜,不过可以在搜索阶段进行剪枝+优化。这个算法可以在竞赛中用于一些博弈题的打表,然后找规律。有这么一个博弈题:Take Apples然后就如何用这个算法进行打表。定义必赢态为先手必赢,必输态为先手必输。以下所说的必赢、必输都是对于先手而言。首先,如何找到一个必赢态,假设目前是先手要进行操作,可以有k种操作,只有k种操作中有一个必赢态,那么他肯定选这个必赢态就行选择,那么对于先手这个必赢态是如何原创 2020-11-30 19:18:13 · 5217 阅读 · 0 评论 -
牛客练习赛72 D、brz的函数
思路O(nnlogn)O(n\sqrt{n}logn)O(nnlogn)设函数 g(n) = ∑i=1n∑j=1nu(i∗j)\sum_{i=1}^n\sum_{j=1}^nu(i*j)∑i=1n∑j=1nu(i∗j)那么对于 g(n)=g(n−1)+2∗∑i=1nu(i∗n)g(n) = g(n-1) + 2*\sum_{i=1}^nu(i*n)g(n)=g(n−1)+2∗∑i=1nu(i∗n)单独看式子 ∑i=1nu(i∗n)\sum_{i=1}^nu(i*n)∑i=1nu(i∗n)原创 2020-11-07 19:54:05 · 286 阅读 · 0 评论 -
牛客练习赛72 C、brz的序列
C、brz的序列思路对于一个最终的状态,即这些数都没法在变小,它满足一个性质就是呈现一次函数的趋势(等差数列)。对于一个给定的序列,只有当区间的所有数都比最终的数大(除去首尾俩个数),才形成一次函数。那么求这些区间端点的过程其实 就是求凸包的过程。参考代码#pragma GCC optimize(2)#include<bits/stdc++.h>using namespace std;const int man = 1e6+10;#define IOS ios::sync_w原创 2020-11-07 12:53:09 · 296 阅读 · 0 评论 -
牛客练习赛67 (A、B、C、D、E)
思路首先暴力建图肯定不行的,直接被卡死。那么想如何优化。首先我们可以按位操作,把32位看成点,然后对每个点拆点。即:对于第 iii 位(二进制) 有两个点,i1i_1i1(入点)和 i2i_2i2(出点) ,i1i_1i1 向 i2i_2i2 连一个边,边权为 2i2^i2i 。然后对于输入的 a[i]a[i]a[i],如果当前 a[i]a[i]a[i] 在第 xxx 位(二进制)是 111,那么这个点向 x1x_1x1 连一条边权为 000 的边,x2x_2x2 向该点连一条边权为原创 2020-08-15 14:39:09 · 279 阅读 · 0 评论 -
牛客算法周周练15 E、算式子
考虑如何快速得到每个 xxx 的答案。① [a[i]/x][a[i]/x][a[i]/x] ,对于某个 xxx ,如果 [va/x][va/x][va/x] 等于 k ,那么 va∈[k∗x,(k+1)∗x)va∈[k*x,(k+1)*x)va∈[k∗x,(k+1)∗x) ,所以我们可以处理出一段区间有多少个 a[i]a[i]a[i] (前缀和),然后用埃氏筛的思想进行统计答案,就能得到。② [x/a[i]][x/a[i]][x/a[i]],我们可以枚举 xxx 的因子,咋处理呢,对于 a[i]a[i原创 2020-07-15 10:46:04 · 221 阅读 · 0 评论 -
牛客小白月赛16 J 小雨坐地铁(虚点+建图+最短路)
因为有中转站,所以不清楚从哪里来,状态不好记录(貌似可以开dis[i][j],表示在i号线到j点的最短路)所以对于每一个点建立一个虚点,然后对于每一条地铁上的点都连上这个虚点,达到中转的目的。code#pragma GCC optimize(2)#include<bits/stdc++.h>using namespace std;const int man = 5e5+1005;#define IOS ios::sync_with_stdio(0)#define ull unsi原创 2020-07-11 19:13:03 · 218 阅读 · 0 评论 -
牛客小白月赛16 D、小阳买水果 (线段树或前缀和+后缀max)
题意:水果店里有 nnn 个水果排成一列。店长要求顾客只能买一段连续的水果。小阳对每个水果都有一个喜爱程度 aia_iai ,最终的满意度为他买到的水果的喜欢程度之和。如果和为正(不管是正多少,只要大于 0即可),他就满意了。小阳想知道在他满意的条件下最多能买多少个水果。你能帮帮他吗?思路:维护一个前缀和,对于每个位置,找到在它后面且离他最远的大于它的值(前缀和)O(n)做法对于找到后面大于它且离他最远的位置,我们可以对求得的前缀和维护一个后缀max,然后每次尽可能往后移动。#prag原创 2020-07-11 14:20:32 · 304 阅读 · 0 评论 -
牛客小白月赛16 H、小阳的贝壳
对原序列进行差分,得到新的序列。维护这个序列的最大值,gcd\gcdgcd。对于区间 [l,r][l,r][l,r]求 gcd\gcdgcd,只需要求 gcd(a[l],gcd(a[l+1],...a[r]))\gcd(a[l],\gcd(a[l+1],...a[r]))gcd(a[l],gcd(a[l+1],...a[r]))因为 gcd(a,b,c)=gcd(a,b−a,c−a)\gcd(a,b,c) = \gcd(a,b-a,c-a)gcd(a,b,c)=gcd(a,b−a,c−a)原创 2020-07-11 08:37:54 · 202 阅读 · 0 评论 -
牛客练习赛66 E、骚区间
思路:明显枚举每个端点作为骚区间的左端点,假设我们枚举ai作为左端点,然后在他右边找到第一个小于ai的数的位置x,然后再在x的右边找第一个小于ai的数的位置y,明显以ai为左端点的骚区间只能在[x,y)这个区间中选择右端点,同理也可以枚举每个数作为右端点,然后找他左边第一个第二个大于ai的数x,y,那么以这个数为右端点的骚区间的左端点只能在(x,y]中选择,这样的话问题就化成了枚举每个点作为左端点,然后得到一个区间,在log的时间复杂度的下,求这个区间中的每个数对应的区间中包含左端点的区间个数最后令点原创 2020-07-07 21:09:57 · 273 阅读 · 0 评论 -
统计d(1~9)在数字0~n里面出现的个数(数位dp)
规律:首先枚举个位,十位,百位…,然后对于每一位,作为数字d的时候,包含的数字有多少个,分为这个数的左右2端。比如12345,要求d=4有多少个,对于十位,这一位取4,分成12300和45来看,对于12300,十位取4,其左边是有123种情况,右边有10种,所以总数就是1230,然后对于45,取4的情况有6种。然后对于百位也同样道理。code(以7为例)#pragma GCC optimize(2)#include<bits/stdc++.h>using namespace std;原创 2020-06-14 22:39:04 · 641 阅读 · 0 评论 -
“科大讯飞杯”第18届上海大学程序设计联赛春季赛暨高校网络友谊赛 G:血压游戏(虚树+单调栈建树)
因为是同步进行的,所以第i层的不会影响到i+1层,所以我们可以把他们分层处理,对于当前层数,一直往上走,但是分层后他们可能会在某个点汇聚,就是它们的lca,所以我们得把他们所有的lca给求出来,然后建另外一棵树(虚树),对这个树dfs一遍求一下答案,求他们的lca,只要依次从左到右,两两的lca就是了,顺序可通过dfs序从小到大排序,然后对于n个点他们的lca最多 只有n-1个,因为假设求a b c3个点两两的lca, A = lca(a,b),那么a、b与c的lca其实就可以通过A和c的lca来得到。所以原创 2020-06-13 16:22:21 · 219 阅读 · 0 评论 -
第十五届中北大学算法与程序设计竞赛 F:集合操作(set+思维)
如果,我们有个答案数组存了所有的数,当1操作其实是在这个数组中删去x,而2操作是加上x,而3操作的话就是二分找到第一个大于等于x的数。但x<1000000000,直接存所有数是不可能的。而想一下,每个x,如果它不在题目的S集合中,那么答案肯定就是x,否则就得看前面有没有往S中添加过x+1。而添加过x+1的话,就还得看x+2,一直到一个没有操作中出现过的数,而这个数肯定是操作出现过的某个数+1。所有对于每次操作,我们把x跟x+1添加进我们前面所说的答案数组中,这个数组的也就2*n而已了。为了方便原创 2020-05-25 17:52:07 · 244 阅读 · 0 评论 -
西安邮电大学第五届ACM-ICPC校赛 H中位因数(线性筛+dfs或者埃氏筛)
way1这题数据10610^6106,暴力枚举iii,然后求iii的中位因子,复杂度肯定不行,我们考虑到 这样一个性质,10610^6106以内的数的做多因子个数240左右(打表可知),但大多数都是几十个或者更少,所以对于每个数我们可以把它因子直接给求出来,然后找中位数,对于找他的因子,不能盲目根号n去找,可以先把每个数的最小素因子和最小素因子个数找出来,然后用dfs去找,这样找出来的都是有效的,且时间也不会太多。可以均摊为每个数几十左右,然后对于查找到的直接找到num/2+1那个数,可以用nth_ele原创 2020-05-24 10:55:36 · 466 阅读 · 0 评论 -
牛客挑战赛39 C牛牛的等差数列
牛牛的等差数列由于是每个区间都要加上一个等差数列,而又因为等差数列的第iii项可以直接得到 ,等差数列+等差数列依旧是等差数列。具有可加性,所以可以用线段树来维护,那么我们每个节点维护的的信息有区间和sumsumsum,区间首项ffffff,区间公差dddddd,最后查询就直接查询sumsumsum,那么我们区间的首项和区间的公差又怎么维护,每个节点都只能维护一段区间,比如下面这种去情况:[L,R][L,R][L,R]是要更新的区间,首项为aaa,公差为ddd,但是在线段树中被分成了3部分,很明显原创 2020-05-16 14:14:06 · 450 阅读 · 1 评论 -
牛客5248H 纸牌游戏
首先一个都知道的性质:一个数能被3整除,那么其数位和也能被3整除。首先能想到的就是统计每个数 iii 出现的次数 num[i]num[i]num[i],然后从高位(9−−>0)(9-->0)(9−−>0)枚举,那么对于数iii,可以选的最大数量就是tpnum=min(cnt,num[i])tpnum = min(cnt,num[i])tpnum=min(cnt,num[i])...原创 2020-04-20 21:56:37 · 375 阅读 · 0 评论 -
bitset优化dp Music Problem
题意:就是给定n<=1e5n<=1e5n<=1e5个数,从中选取k个数,要求和是3600的倍数,T<=60组数据T<=60组数据T<=60组数据。①思路:dp[i]表示i这一位能被得到,然后更新就是从上一个能到达的状态更新过来,但复杂度无疑炸了。可以用bitset来优化,每次更新不用3600,而是直接移位(<<),然后在取个模(>>)...原创 2020-04-15 11:16:54 · 298 阅读 · 0 评论 -
2017美团资格赛 A
题目描述给定两个整数 lll 和 rrr。对于任意xxx ,满足 l<=x<=rl <= x <= rl<=x<=r,把 xxx 的所有约数全部写下来。对于每个写下来的数,只保留最高位的那个数码。求[1,9][1,9][1,9] 中每个数码出现的次数。解题思路对于暴力肯定不可取,优化暴力,考虑枚举数码iii,属于数码iii的数可以有1,10,11,.....原创 2020-04-14 15:39:51 · 219 阅读 · 1 评论