“玲珑杯”ACM比赛 Round #4 运气不错有个抱枕。 1046 - chess play题意:一个n*m的数组,初始全部是’.’,然后3种操作,把一个位置变成’w’,或者把一个位置变成’r’,或者交换两行。思路:vector的swap是O(1)的,直接模拟就行。//// main.cpp// chess play//// Created by 翅膀 on 16/11/5.// Copyright © 2016年
Technocup 2017 - Elimination Round 1 (Unofficially Open for Everyone, Rated for Div. 2) 解题报告 A. Transformation: from A to B题意:一个数a,两种操作,一是把a*2,二是把a*10+1,问把a变到b是否有解和最小次数。思路:两种操作都是指数级别的,爆搜即可。//// main.cpp// 727A//// Created by 翅膀 on 16/10/21.// Copyright © 2016年 kg20006. All rights rese
codeforeces722 Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) 终于补完这场了。C. Destroying Array 题意: 给一个数组a,长度为n,然后给一个1~n的排列p,依次毁灭apia_{p_i},问每次去掉后数组的最大连续子段和(当然是不能包括毁灭的位置)。 思路: 倒过来看就是每次加一个元素问最大子段和,并查集可解。//// main.cpp// 722C//// Created by 翅膀 on 16/10/1.// C
[树链剖分] HDU 5893 List wants to travel List wants to travel题意:给一棵树,每条边有个颜色,两种操作:Change a b c,把a到b的简单路径的边颜色变成cQuery a b,查询a到b的简单路径有多少段颜色,连续相邻的同色边算一段。思路:先建立树剖然后用线段树维护,记录一个区间内的颜色段数,最左颜色和最右颜色,然后就可以区间合并了,需要注意合并的顺序,没想清楚很容易就wa了,我想的是总是按查询的时间顺序把区
[AC自动机+期望DP] 玲珑ACM 1025 - Magic boy Bi Luo with his excited string problem Magic boy Bi Luo with his excited string problem题意:给出<=15个字母串,每个串不超过10个字符,然后一个人开始写字母,每次随机写一个字母,直到出现给出的任意一个串,然后就停止,问写的长度的期望,答案mod 1e9+7。思路:总共150个字母比较少,用ac自动机建立转移矩阵,dp[i]dp[i]表示从状态i出发写的期望,然后套高斯消元解方程。 每个
[burnside引理] HDU5868 Different Circle Permutation Different Circle Permutation题意:n个球围成一个圈,每个球是白色或黑色,要求不能有连续的黑球相邻,并且旋转同构,求有多少种合法方案。思路:设不考虑旋转同构时,nn个球的方案为f(n)f(n),手算下f(2)=3,f(3)=4,f(4)=7f(5)=11f(2)=3,f(3)=4,f(4)=7f(5)=11,好像有点f(n)=f(n−1)+f(n−2)f(n)=f(n-1)
[后缀自动机] HDU5558 Alice's Classified Message Alice’s Classified Message题意:给一个串s,给一个加密过程,输出密文,过程如下: 初始i = 0,重复下面直到串结束。 找一个子串,第一个字符位于[0,i),而且该子串要和以i开头的相同长度的串相等,多个合法的取最长的,如果还有多个取最左边的,设该字串长度为k。 如果不存在,输出 -1和s[i]的ascii值,i增加1。 否则输出长度k和第一个字符的位置T,i增加k
[树上背包] POJ2486 Apple Tree Apple Tree题意:一棵树n(<=100)个节点,每个节点有a[i]个苹果,从1出发走k(<=200)步,问最多能得到多少个苹果。思路:首先想到每个节点只有3种情况,要么不经过,要么经过了最后回来,要么经过了最后不回来,只用关心后两种就行。 于是可以想到一个dp[i][j][k],表示从i出发走j步,k=0表示回来,k=1表示不回来,现在想怎么转移。 转移的关键是每个子节点走多少步,暴力枚
[dsu] CSU1811: Tree Intersection 1811: Tree Intersection题意:给一棵树,每个节点有种颜色,考虑第ii条边(ai,bi)(a_i, b_i),把这条边去掉后,分成两颗树,问两颗树节点的颜色集合的交集。题解:如果对每棵子树暴力,显然是O(n2)O(n^2)的,但可以发现子树的信息有一部分父亲节点可以复用,保留这一部分信息就成了O(nlogn)O(nlogn),也就是保存重儿子的信息。//// main.cpp
[上下界最小流] SGU 176. Flow construction 176. Flow construction题意:从1到n的一个网络,每个边有上下界,求最小流。思路:属于有源汇上下界的最小流问题,总结下。原网络每条边的容量为CMax−CMinC_{Max}-C_{Min},同时记录每个点的下界流量,流入为正,流出为负,记为flow[i]flow[i]。建立每个点和ssss及tttt之间的边,若flow[i]>0flow[i]>0,连接ssss和ii,容量为f
[上下界网络流] SGU 194. Reactor Cooling 194. Reactor Cooling题意:给一个无源汇上下界网络求一个可行流。思路:基本是模板题了,这个论文说的很清楚。 主要学习这种建图方法和思路。#include<bits/stdc++.h>using namespace std;const int N = 5005;const int M = 130005;const int inf = ~0u>>2;struct eg{
[虚树dp] bzoj2286: Sdoi2011消耗战 Sdoi2011消耗战题意:给一棵带权树,1为根,q次询问,每次询问给出k个特殊点,要求去掉一些边,代价是权值,让点1不能到达k里的任意一个,输出最小代价。题解:首先考虑单次询问,容易想到dp[x]表示让1不能到x子树里的特殊点的代价。 当x是特殊点的时候,显然有dp[x]= min(path[x]),表示x到根节点的最小的那条边,因为一定要去掉x。 当x不是的时候,dp[x]=min(path
[基环] codeforces 711D. Directed Roads Directed Roads题意:给n个点,和P[i],表示从第i个点到P[i]有一条有向边,每条边可以至多翻转方向一次,问有多少种方法翻转后没有环。思路:n个点n条边,无自环,每点出度为1,这个模型应该也出过很多次了。 这个图要么就是一整个环,要么就是一个环加一棵树,要么就是前面的复制几次。 考虑一个连通块,将它分为环上的边x和环外的边y,可以看出环外的边随便翻转都不形成环,所以任意翻转,答案
[二进制分组+AC自动机] HDU4787 GRE Words Revenge GRE Words Revenge题意:一个01字符串机器,两种操作:+String 表示增加String串进机器里?String 表示查询String串有多少个子串在机器里面要求强制在线,给出的串要循环左移lastans次。lastans是上次查询的答案。思路:若没有增加操作,可以看出这是个AC自动机的裸题,于是就采用《浅谈数据结构的几个非经典解法》论文中说的二进制分组,巧妙的用一个log的
[二维树状数组] codeforces 707E. Garlands E. Garlands题意:一个n∗m(<=2000∗2000)n*m(<=2000*2000)的矩阵上,给出k(<=2000)k(<=2000)条链,每条链长度len(<=2000)len(<=2000),保证相邻两个的四边有一边相临,链上有个开关,初始所有链为开,开的时候链上每个点有权值,关的时候权值为00。 然后有q(<=106)q(<=10^6)个操作,分两种:SWITCH i,按第i条
[可持久化线段树] codeforces 707D. Persistent Bookcase D. Persistent Bookcase题意:一个n∗mn*m矩阵AA,维护4种操作:1 i j:把第A[i][j]A[i][j]赋值为12 i j:把第A[i][j]A[i][j]赋值为03 i:把A[i]A[i]的0变1,1变04 i:回到第i个操作之后的状态数据保证合法。思路:一维的话就主席树就好啦,二维的话就主席树套主席树就好啦。 不过空间有点多,于是动态开点。 注意到这题
[高斯消元] HDU 5755 Gambler Bo Gambler Bo题意:给一个n*m的矩阵,元素值为{0,1,2},每次操作选择一个元素(i,j),把该元素值加2,并把上下左右的值加1,所有值mod3。 要求输出一种操作序列,让所有值变为0。分析:每个值操作3次就相当于没操作,每个元素的操作次数设一个未知数,列一个n*m 行n*m+1 列的模3线性方程组,套上高斯消元,然后就过了。 一看复杂度O(T*n^3*m^3),比赛的时候告诉队友肯定
[HDU5790] Prefix 字典树+主席树 Prefix题意:给出总长105的N个串10^5的N个串,给出q个询问q个询问,查询编号[l,r][l,r]范围内的串有多少个不同的前缀,编号从11开始。思路:对于第ii个串,用主席树记录0−i0-i个串有多少不同的前缀,这个用字典树可以方便的算出,字典树的任一个节点都代表一个前缀,所以第ii个串新增的前缀就是length(i)−这个串的被标记过的节点length(i)-这个串的被标记过的节点。
[DP] HDU5819 Knights Knights题意:t数轴上有n个骑士位于1,2,3,...n1,2,3,...n,移动速度相同,初始移动方向已知,当两个骑士相遇时,各有50%的概率赢,输了就死了,并且移动到0和n+1的位置时移动方向会翻转,问最右的骑士存活的概率。思路:DP[i][j]DP[i][j]表示前ii个骑士有jj个向右走,因为速度相同,所以不存在追及的情况。 如果第i个骑士开始往右走,显然有转移:DP[i][j]=D
[数据结构] HDU5812 Distance Distance题意:维护一个集合,有三种操作.插入 x删除 x设y属于集合,给定x,找出f(y,x) = z,最小的z其中f(y,x)定义为每次乘上或除上一个素数,把y变成x的最小操作次数。思路:可以看出f函数的值就是x和y的对应质因子的个数差的总和,一个暴力一点的思路就是遍历x的所有约数,在集合中查询有这个约数的数的答案,再考虑下其实用一组multiset,multiset[k]表示有k