codeforces1456 D. XOR-gun
D. XOR-gun大佬题解当n比较大的时候,一定有连续相同的3个数最高位都是1,只需要将这三个数其中两个异或一次即可满足题意只需要操作1次。当n比较小时可以直接暴力,不难发现异或操作要么是一段区间异或然后与区间端点相邻的比较O(n2)O(n^2)O(n2),要么是连续的两段连续区间异或与他们两个区间的分界点比较O(n3)O(n^3)O(n3)。#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)#pragma GCC optim
2018 ACM ICPC Asia Regional - Seoul B.Cosmetic Survey
参考大佬代码题目大意nnn个顾客,mmm种画妆品,每一个顾客会给mmm种化妆品一个值,这个值代表这个化妆品在他心中的排名,排名越小越喜欢,如果这个值为0说明最不喜欢这一种化妆品(值为0理解为无穷大)现在定义d(x,y)d(x,y)d(x,y)表示第xxx种化妆品和第yyy种化妆品之间,喜欢第xxx种化妆品的人数定义一个序列C1,C2,C3,…,CkC_1,C_2,C_3,\dots,C_kC1,C2,C3,…,Ck,其中保证d(Ci,Ci+1)>d(Ci+1,Ci)d(C_i,C_{i
codeforces1455 D. Sequence and Swaps
昨天晚上巨困,就没有打,今天课间的时候就看了一下D题,发现好像可以瞎搞,于是吃完饭就写了一下,调过样例一次就A了qaq。D. Sequence and Swaps枚举+贪心由于数据范围n≤500n\leq500n≤500,由此我们可以在n3n^3n3完成此题。最后完成所有操作后,我们手中肯定还有一个数,我们考虑去枚举这个数。最后手里的数一定不在最终的排列中,于是用一个数组b[]把除了手中的数记录下来,不难发现只要排序一下这个所有数的位置就确定了。而且不难发现如果当前手中的数是xxx,我们必须一次
codeforces1453 D. Checkpoints
以为又要掉分了(结果没掉说明太菜了),写完ABC还有45分钟,推式子一直没啥结果,最后10分钟想到D题的一个性质,可惜没时间了~D. CheckpointsHeltion大佬题解性质:把形如1 0 0…01 \ 0 \ 0 \dots01 0 0…0的序列看成一个关卡,不难知道总的期望步数是每一个这样关卡期望的叠加。(最后10分钟才看出来~然后就参考上述题解,如果上述关卡中有nnn个stage,那么通过此关卡的期望步数是2(n+1)−22^{(n+1)}-22
codeforces1453 E. Dog Snacks
E. Dog SnacksHeltion大佬题解fuf_ufu表示节点uuu到最近叶子节点的距离。首先不难发现,考虑一棵子树根节点为uuu,一定每次都把一整棵子树上的食物吃完,然后再去别的子树。由于每次狗总是先去离他最近的节点,如果我们把一棵子树的食物吃完时,一定停留在一个叶子节点上,即从叶子节点直接到另一棵子树。然后就是结论:考虑每个非根非叶子结点,可以发现对其每个儿子vvv都要满足k≥fv+2k≥f_v+2k≥fv+2.对于根节点,除至多一个儿子之外的每个儿子vvv都要满足k≥fv+2
AtCoder Regular Contest 110 E.Shorten ABC——坑
计数渣渣不会啊下学期学概率论与数理统计不知道会不会提升数数能力E.Shorten ABC当B数组确定后,不难发现就是所问问题即从B序列选出A序列的方案数。等效于那么从m+n中选出s+n个小球,我们假设多选的n个小球是一个隔板,隔出数组A,多选的那个隔板即是确定B中小球的个数(因为most m个)答案就是Cm+ns+n,sC_{m+n}^{s+n},sCm+ns+n,s是数组A小球的总个数。#define IO ios::sync_with_stdio(false);cin.tie();cout
F. Paper Grading(Trie树+dfs序+二维数点)
F. Paper Grading大佬题解一般关于前缀的问题基本都是Trie树。首先将所给字符串建立一棵Trie树,Trie能够解决一个字符串在一个字符串集合中出现的次数,而查询前缀次数只需要找到Trie树中所给字符末尾的位置,那么其子树中打标记的次数即前缀次数。由于子树dfs序[L,R]连续,于是把字典树按照dfs序标记,即变成区间查询问题[l,r]中[L,R]之间数的个数,二位偏序问题。树套树(树状数组套下标线段树)即可解决,要动态开点!#include<iostream>usi
I. Space Station(hash记忆化+dp)
I. Space Station#include<iostream>#include<algorithm>using namespace std;typedef long long ll;const int N=100010,mod=1e9+7;int a[N],n;ll fact[N];bool st[N];ll res;void dfs(int u,ll now){ if(u==n) { res=(res+1)%mod;
codeforces1471 D. Strange Definition
D. Strange Definition#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)#pragma GCC optimize(1)#pragma GCC optimize(2)#pragma GCC optimize(3,"Ofast","inline")#include<cstdio>#include<iostream>#include<algorithm>#include&l
codeforces1472 G. Moving to the Capital
G. Moving to the Capital#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)#pragma GCC optimize(2)#include<set>#include<map>#include<cmath>#include<stack>#include<queue>#include<random>#include<bitse
J. Spy(多重匹配KM算法)
J. Spy #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)#pragma GCC optimize(2)#include<iostream>#include<cstring>#include<queue>#include<algorithm>using namespace std;const int N=810,M=330010,INF=0x3f3f3f3f;int
codeforces1467 E. Distinctive Roots in a Tree(树上差分)
E. Distinctive Roots in a Tree树上差分如果当前节点u的某一棵子树中的某个节点的值和当前节点相同,那么除了当前节点这一棵子树节点,其他节点(其他子树以及u上面的节点)一定不满足要求。如果当前节点子树之外的节点(u上面的节点)与当前节点值相同,那么当前子树节点不满足要求。如何知道当前子树中的节点是否与当前节点相同?dfs过程中记录进入该子树之前某值的个数与出子树后该值的个数进行比较,如果比之前多,说明子树中存在该值。如何知道当前节点所有子树之外的节点是否存在
codeforces1473 E.Minimum Path(分层图最短路)
E - Minimum Path分层图最短路第一个分层图第0层就是按照题中给的点连边,从第0层到第1层我们连一条边权是0的边,从第1层到第2层连一条边权是原先边权2倍的边,当然第1层以及第2层之间按照原图连边。第二个分层图第0层就是按照题中给的点连边,从第0层到第1层我们连一条边权是原先边权2倍的边,从第1层到第2层连一条边权0的边,当然第1层以及第2层之间按照原图连边。然后最终答案在两个分层图的第二层比较。如果从1到某个点只存在一条边,那么最短路应该与第0层的答案相同,再顺便比较一下即可。为
E - Escape from the Island(最短路+dp)
E - Escape from the Island大佬题解,码风真的爱了#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)#pragma GCC optimize(2)#include<set>#include<map>#include<cmath>#include<stack>#include<queue>#include<bitset>#in
C. Code a Trie(Trie+dfs+贪心)
C. Code a Trie大佬题解,代码基本就是抄的对于每一个值计算所有串的LCA,也就是最长公共前缀,将该节点(Trie树的节点)标记,对于这些字符串在LCA下面的点一定不存在(如果存在他们不会返回相同的值)每个Trie树中的节点只能被标记一次,并且从跟到LCA路径上的变必须存在dfs贪心计算每个子树中最少的节点插入时统计cnt[]表示它的子树中被标记为LCA的点的数量如果cnt[u]>1,这个点必选,如果说该节点没被标记为LCA,那么它可以替代它一个儿子称为那个值的LCA,如果被标
M. Monster Hunter(树形dp)
M. Monster Hunter才知道原来树形dp是三维的,一直没有学会过,感谢大佬的文章!算法进阶—理解树形背包问题状态表示:fi,k,j,{0/1}f_{i,k,j,\{0/1\}}fi,k,j,{0/1}以iii为根的子树,考虑到第kkk个儿子时,使用了jjj次魔法,自己是否被魔法干掉的最小花费。状态转移:fi,k,a+b,0=fi,k−1,a,0+min(fv,cnt,b,0+av,fv,cnt,b,1)f_{i,k,a+b,0}=f_{i,k-1,a,0}+\min(f_{v,cnt
【模板】EK求最大流、dinic求最大流
ACM模板目录概念EK算法Dinic算法概念yxc老师的部分总结1.1 流网络,不考虑反向边1.2 可行流,不考虑反向边1.2.1 两个条件:容量限制、流量守恒1.2.2 可行流的流量指从源点流出的流量 - 流入源点的流量1.2.3 最大流是指最大可行流1.3 残留网络,考虑反向边,残留网络的可行流f’ + 原图的可行流f = 原题的另一个可行流(1) |f’ + f| = |f’| + |f|(2) |f’| 可能是负数1.4 增广路径1.5 割1.5.1 割的定义1.5
【模板】最大流之上下界可行流
ACM模板目录无源汇上下界可行流有源汇上下界最大流有源汇上下界最小流无源汇上下界可行流问题: 给定一个网络,求一个流满足:每条边的流量处在给定的下界和上届[lower,upper]之间,满足流量守恒首先我们在原网络中确定一个全部是下界的流网络,当然此流不一定是可行流因为其不一定满足流量守恒,不妨叫此流流①此时问题转化成找到一个流②,每条边的流量处在[0,upper-lower]之间,此流与之前的流①相加(流①+流②)满足流量守恒,是一个可行流。显然流②不一定是可行流,但是我们可以经过以下调整
今日推荐
周排行