
CS 泛做
文章平均质量分 66
orz11111111
这个作者很懒,什么都没留下…
展开
-
CS K Consequal 栈+模拟
题意:给出字符串s,若s中存在连续k个字符相等,则删除这连续k个相等的字符.k,|s|栈顶没有连续k个 则栈顶以下不可能被弹出,维护一个栈,对于栈中元素x 记录它以下有多少个连续和它相同的.压入一个字符进栈 若相同的达到k个 则将栈中元素弹出k个即可.#include using namespace std;typedef pair ii;const int N=2e原创 2017-10-18 11:28:17 · 175 阅读 · 0 评论 -
CS 300 Tree Antichain 构造,树,二分染色
CS 300题意:n个节点的树,构造出一个[1..n]的排列a: 满足a[i]和a[i+1]没有直接相连的边存在.无解输出-1. n若有节点度数为n-1,即树为star shape.则无解.否则一定有解,先把树进行二分图染色(根据深度奇偶,树一定为二分图).相同颜色的点之间无边存在可以相邻.唯一需要考虑的是最后一个白和第一个黑之间不能有边存在.因为此时树不是star原创 2017-10-25 20:16:51 · 222 阅读 · 0 评论 -
CS 300 Switch the Lights 观察+前缀差分
题意:n个灯泡,01表示是否点亮.n个开关,第i个开关反转[i,r[i]]个灯泡,花费c[i].n每个开关最多使用一次.注意第i个开关 变化的左端点为i.假设序列最左边第一个为1的位置为x此时开关j>x 无法熄灭x.开关j所以每次转动编号为:当前最左边第一个1位置的开关.转动后如何找到下一个为1的位置?记录每个点的反转次数,前缀差分记录一下即可.原创 2017-11-02 18:15:06 · 249 阅读 · 0 评论 -
CS 300 Prefix Matches 双指针
题意:给出一个函数f[i]: 以i开头找到最长前缀f[i]使得,[1,f[i]] = [i,i+f[i]-1].函数g[i]定义为:以i结尾能找到和它匹配的最长前缀(g[i]n已知[1,f[i]] = [i,i+f[i]-1].计算g[i]时 记录当前最左边的左端点le.如果le+f[le]-1>=i 则找到[le,i].令g[i]=i-le+1. 否则只能le向后移动.原创 2017-11-02 19:07:03 · 251 阅读 · 0 评论 -
CS 400 Coprime Pairs 构造!!!
题意:给出n和k 构造出n个不同的数,任意选两个有C(n,2)对,满足正好有k对是互质的. n考虑简单的情况 当k=0 取序列为前n个素数即可.转换一下问题 求不互质的有y=C(n,2)-k对时的序列.构造:另序列为5,7,11,13... 现在任取一对都为互质.找到最大的T 使得C(T,2)现在还需要x=k-C(T,2)对,将前x个乘上3,a[T+1]*3即可.原创 2017-11-12 16:33:47 · 201 阅读 · 0 评论 -
CS 300 Spanning Trees 构造,生成树
题意:给出n,k,要求构造出n个点的无向带权图,满足:最小和最大生成树是唯一的,并且最小和最大生成树正好有k条公共边.n,k若C(n,2)生成树唯一,最简单就是每条边权值都不同.先考虑0条公共边的情况:1-2-..n连接权值为[1.n-1]的边. 1-3-5-..n 2-4-6-..n-1 .(id为两组中其中一个点)id-n连接权值为[n,2*n-1]现在有原创 2017-11-03 16:22:36 · 205 阅读 · 0 评论 -
CS 400 Late Edges BFS+优先队列
题意:n点m条边的图,第i条边[a[i],b[i],c[i]]]表示a[i]-b[i]这条边在时刻c[i]以后才能使用.n,m不考虑边生成的时间 就是一个简单的BFS.因为可以重复走边,如果在x时刻的到达顶点u 则在x+2k时刻同样能达到顶点u.所以如果u-v边还没开通 则可以来回走 直到u-v边开通为止.此时BFS产生的距离不是递增的 用优先队列维护一下 每次弹出从最小的原创 2017-11-04 12:00:42 · 170 阅读 · 0 评论 -
CS 400 Min Races 排序+二分
题意:n个人,每个有两个属性(a[i],b[i]).定义:如果一个人(a[i],b[i]),和他同组中b[j]n先将b[i]从小到大排序 则现在从前到后选人,a[i]是递增的. 则排序后,每组都是a[i]递增的序列.(a[i]的范围为[1..k]).排序后(不用考虑b[i]):3,2,4,4,1. 则类似hdu导弹拦截.保存当前分组中最小的mn.若a[i]若a[i]>mn原创 2017-11-05 17:35:25 · 177 阅读 · 0 评论 -
CS 400 Sorting Steps 思维(冒泡轮数)
题意:int steps = 0;while (true) { ++steps; bool isSorted = true; for (int i = 1; i if (A[i] > A[i + 1]) { swap(A[i], A[i + 1]); isSorted = false;原创 2017-11-20 20:36:08 · 185 阅读 · 0 评论 -
CS 400 BFS-DFS 构造
题意:n个点的图 起点都为1,给出其dfs和bfs序列 若有解,求出其m条边 否则输出-1.n第2个点如果不同 则无解.构造:1和按顺序和b[i]连边 然后对每个(d[i-1],d[i])[i>1] 连一条边 此时满足bfs,dfs序列(66666).#include using namespace std;typedef pair ii;const int N=4e3+120原创 2017-11-29 20:26:41 · 161 阅读 · 0 评论 -
CS 400 Path Union 思维+贪心
题意:高度为n的满二叉树,若一个节点u被选择,则u到root的边变成黑色长度为n的序列a, a[i]表示树的第i层最多可以选a[i]个节点.1考虑一颗满二叉树 只选叶子节点的情况.假如只选1个 则任意 选两个 则显然出前一半和后一半中各自任选一个.假如只选4个,则每个1/4为一块各自任选一个.....对每一层都做上面的贪心操作.若选了节点u 则在选u得祖原创 2017-12-20 11:06:50 · 236 阅读 · 0 评论 -
CS 400 Tournament Swaps 循环赛,完全二叉树.
题意:2^n个人进行循环赛 第i个人的能力值为a[i],每轮:当前相邻的两人进行比赛 输的人淘汰第i个人可以在比赛前和某人交换位置(或者不交换) 分别求出第i个人最多能赢多少场(i=1,2....2^n)n循环赛程:可以表示为一个完全二叉树 叶子节点为a[i].假如一个人能比m轮 则它有2^m个叶子现在有交换操作 则要想交换后能赢m轮 a[i]肯定要在交换后大于该子树的原创 2017-11-23 20:21:33 · 230 阅读 · 0 评论 -
CS 400 Restricted Permutation 排列,DP计数
题意:给出序列a,a[i]为1:数字i出现在数字i+1之前 ,a[i]为0:数字i出现在数字i+1之后n假设y=x+1出现在x之后 已知前x=6的数的某个排列为 00X000 现在若y在第4个位置上 则 ...Y... 则X放入的位置可以为1~3 例如X放入位置3 就对应dp[x][3]的排列个数.(原本在j的位置向后偏移)设dp[i][j]:[1..i]排列满足限制 并原创 2017-12-04 16:38:34 · 271 阅读 · 0 评论 -
CS 400 Seven-egment Display 贪心+模拟,DP
CS 400题意:a[i]:数字i需要的火柴个数[i=0..9] 问正好用k个火柴时 最小能拼成的数是多少? ka[]={6,2,5,5,4,5,6,3,7,6}.首先位数尽量小,总共位数为k/7位.剩下r=k%7个火柴{0~6} 分别讨论一下 例如r=1时 拆掉一个7 现在用8个火柴 放一个1和0.即可.现在位数确定了 但是数还可以减小 例如k=10 得到78 但可以减小到2原创 2017-12-05 11:25:53 · 226 阅读 · 0 评论 -
CS 400 Digit Permutation 思维+拓扑序
题意:给出n行,第i行有m个数字 每个数字范围为0~k-1.求出一个[0..k-1]的排列p,使得将n行中,数字x与p[x]替换后满足以下条件.每行都没有前导0,从1行往下,每行的字典序递增.k,n*m第i行字典序要大于第i-1行 则从左往右比较第一个不相同得数字分别为d1,d2 (d1!=d2) ,显然p(d1)现在得到n-1个关于p得限制 若这n-1条限制都满足 则原创 2017-12-13 18:51:03 · 409 阅读 · 0 评论 -
CS 400 Simple Pahts 割边,路径唯一
题意:n点m条边的无向图,Q次询问,每次询问(x,y) 问x->y的简单路径是否唯一? n,m,Q现在找到一条x-y的路径p. 那么路径p上的边 如果存在有一条边不是割边的话 那么x-y有多条路径 (因为去掉这条边后 x->y仍然有路径).如果路径p上的边都为割边 那么x->y存在唯一一条路径 (假如还有路径 那么代表p上的某条边去掉后 x-y仍然联通,矛盾.)现在只保原创 2017-12-21 18:17:52 · 307 阅读 · 0 评论 -
CS 400 Subarray Medians 链表,中位数
题意:给出一个排列a,定义一个区间[L,R]价值为:该区间中位数*R*L.n枚举以L开头的区间:先计算[L,n]的中位数:用链表把[L,n]的元素有序的连接起来,记录此时的中位数位置.关键:每次删除两个数,中位数的位置最多只会向前或者后面偏移一个.用L,R记录当前比中位数小和大的个数 根据L,R决定中位数如何移动即可.O(n^2).#include using nam原创 2017-11-02 16:39:19 · 493 阅读 · 0 评论 -
CS 300 Bounded Difference 模拟
CS 300题意:给出一个序列a.操作:交换序列中任意两个数.n找到第一个|a[i]-a[i+1]|>k的位置 现在要么把i或者i+1交换出去.假如a[i+1]和某个位置p交换,则需要满足 |a[i+1]-a[p-1]|如果有多个p 如何选择? 随便选一个 水过了??正解:最多只能有4个错误pair,标记每个pair位置i,与i交换的位置j只能为(错误pai原创 2017-10-25 11:20:10 · 197 阅读 · 0 评论 -
CS Maxor 或运算,DP(SOS)
题意:长度为n的序列a,选出两个元素,其或运算结果的最大值为多少,并求出a[i]|a[j]==mx的方案数?n假如最大值为mx,若x|y=mx 则x和y肯定为mx的子集.否则或运算结果肯定不为mx.枚举最大值 在枚举mx的子集x. 则此时y要包含(mx-i)这个子集.(若y比mx多出某个为1的bit位 则后面最大值还会更新.)求个数,则需要知道序列中有多少个元素有子集m原创 2017-10-19 21:11:31 · 535 阅读 · 2 评论 -
CS Hard Interval Expected Max 莫队(期望,计数)
点击打开链接题意:给出长度为n的序列a,Q次询问:问从[l,r]中选两个数,期望得到的最大值为多少? n,Q,a[i]例如1,3,10 最大值期望为6.6666667.9种选法(1,1),(1,3),(1,10),(3,1),(3,3),(3,10),(10,1),(10,3),(10,10).exp=(1+3*3+10*5)/9=6.666667看单个询问[l,r] nu原创 2017-10-04 13:18:18 · 332 阅读 · 0 评论 -
CS Hard Xor Closure 异或,消元
题意:给出集合a,设集合a合法当a[i]^a[j]=x x也属于集合a .问最少需要添加多少个数 使得集合a变为合法?n首先一个简单的性质.取向量组中的两个向量a,b,把a,b中的某一个替换成a xor b,.替换前后向量组中的向量的线性组合得到的空间相同。通俗的说就是 替换前后 能异或出来的值一样。a中任意两个数异或的结果都属于a 等价于 a中任意子集异或的结果仍然原创 2017-10-12 17:30:30 · 218 阅读 · 0 评论 -
CS 400 Base K Xor 思维(数位)
题意:若a=20,b=14.当进制k=3时,a=202,b=112, a,b的digit sum a+b=011= 4 digit sum为每位相加 舍去进位Q次询问,每次给出[a,b,k]问a+(a+1)+..b的digit sum为多少? Qa,b,k={1,5,2} ans=1.算[0,n] ans=[0,b]-[0,a-1].每位都是独立计算的.当数字x在某一位原创 2017-10-22 10:03:23 · 232 阅读 · 0 评论 -
CS 300 Connect the Graph 并查集+模拟
CS 300题意:n点m条变的图,操作:删除任意一条边,然后增加任意一条边.n,m首先用并查集求出图中有多少个联通分量,假设个数为cnt,则操作数至少要cnt-1次.并处理出每个联通分量中那些多余的边.多余边之和应该大于cnt-1 否则无解.输出解:每次从取出一个多余边,标记一个节点作为根,连接另外一个连通分量的根即可.#include using namespa原创 2017-10-23 08:25:18 · 216 阅读 · 0 评论 -
CS 300 Num Cube Sets 质因数分解
CS 300题意:给出n个元素的集合A,m个元素的集合B.现在从A,B中分别选出其子集a,b 要求:任意一个x属于a,y属于b都有 x*y是完全立方数.问|a|^2+|b|^2尽量大时(|a|:子集a的元素个数),a,b两个子集分别是多少? n+m底相同两个数相乘(素数乘积形式下),底数的幂都为3k,才可能为立方数.方便处理把所有素数的幂余3.假如A中选的某个元原创 2017-10-23 15:22:36 · 320 阅读 · 0 评论 -
CS 300 Consecutive Digits Signs 构造
CS 300题意:给出长度为n-1的序列a,要求构造出一个n位数的数字x,满足以下条件(d[i]为x的第i位数字)a[i]==-1时,d[i]a[i]== 0时,d[i]==d[i+1]a[i]== 1时,d[i]>d[i+1]nz.>.>xy x和y,z没有关系,考虑第i位数最大为多少? 第i位前面有p个1 第i位(包扩i)有连续q个-1. 则第i位最大为9-m原创 2017-10-23 19:53:07 · 258 阅读 · 0 评论 -
CS 400 Expect Merge 期望+暴力
题意:归并排序:前一半和后一半分别排好序后,在合并成有序序列.如果区间长度为奇数 则分法有两种.给出序列长度n,定义s[i]为:第i个数在某个分治方案中所占区间长度的累加和.例子n=3 (1,2,3)->(1,2)(3)->(1)(2) 下标1占区间长度为3+2+1=6(1,2,3)->(1)(2,3)->(2)(3) 下标1占区间长度为3+1=4. 期望值为(6+4)/2=5原创 2017-11-09 09:22:47 · 193 阅读 · 0 评论 -
CS 300 BST Fixed Height DP(前缀和)
CS 300题意:问有多少种形态不同,n个节点,高度为H的二叉树. n,hdp[i][j]:i个节点 高度为j的二叉树的方法数.枚举其中一个子树的节点数为k,dp[i][j]+=dp[k][0~j-1]*dp[i-1-k][j-1];注意两课子树的高度有3种情况 (左=j-1,右用pre[i][j]记录 dp[i][0]+dp[i][1]+..dp[i][j]. O(N原创 2017-10-23 21:36:55 · 169 阅读 · 0 评论 -
CS 400 Palindromic Tree 思维+构造(回文子串)
题意:给出n 求出长度为n的字符串:其不同的回文子串个数最少.n首先长度越长,回文子串的个数是非递减的.暴力求出n=9 都可以构造出不同回文子串个数为8的字符串.只要把"001011" 不断连接起来即可. eg 001011 001011 ....#include using namespace std;typedef long long ll;typedef pair i原创 2017-11-09 20:57:04 · 229 阅读 · 0 评论 -
CS 300 X Distance 思维+并查集
CS 300题意:n点m条带权边的图,定义一条路径的代价为:该路径中边最大的权值.n,m权值大于x的边不管,反正不可能经过这些边.枚举权值为x的一条边.通过该边可以扩展出一个联通分量.若去掉权值为x的边后,新图还是联通,则新图上的任意两点都可以不通过x互相到达. 该边不可能作为最小代价的最大权值边.否则(u,v)该边贡献就为 u左右和v右边的点个数相乘. 若原创 2017-10-24 13:06:26 · 203 阅读 · 0 评论 -
CS 300 Second Minimum 交互题,思维(循环赛)
CS 300题意:交互题,电脑藏了一个[1..n]的排列.每次的询问:问两个下标(i,j),哪一个对应值较小.n容易用n-1次比较求出最小值val=1的下标.类似循环赛淘汰,线段树求最值 通过询问最底层n次 知道最小值和被最小值淘汰的logn个元素.第二小的肯定在这logn个元素内.#include using namespace std;typedef long lo原创 2017-10-24 18:03:16 · 190 阅读 · 0 评论 -
CS 300 Equidistant Points 构造(圆上等距离点)
CS 300题意:给出一个数n,要求构造出n个点(x,y),(-10n(0,0)放一点 单位圆上放n-1个点? 注意边界两个点的弦长不超过1,2rsina/2#include using namespace std;typedef long long ll;const int N=3e5+5,mod=1e9+7;const double pi=acos(-1.0);原创 2017-10-24 21:24:36 · 296 阅读 · 0 评论 -
CS 300 Diesel Train 连续型期望(积分)
CS 300题意:起点为0 终点为D.有一个长度为L的火车,初始火车头在起点0.有n+2个加油站,起点和终点也是加油站.第i个加油站在点x[i].火车的任意一个部位在加油站时 都可以加油,如果火车没有油了,则火车会被推到离它最近的加油站上.现在把火车头 随机仍到了[0,D]的某个位置上,问火车被推的距离期望是多少? n先将加油站坐标从小到大排序.当火车头落在原创 2017-11-01 22:23:05 · 409 阅读 · 0 评论 -
CS 300 Least Even Digits 二分+数位DP
CS 300题意:定义一个数x的价值为:x十进制表示a[1]a[2]..a[i]中有多少位为偶数.给出x,分别求出x中第一个价值比x小的数y.如果不存在则输出-1. x假如x价值为val数位DP:先算[1,n]中有多少个价值不超过val-1的数. dp[pos][val]..二分出一个y 满足[1,y]价值不超过val-1的数和[1,x]价值不超过val-1的数相差正好原创 2017-10-25 09:48:25 · 281 阅读 · 0 评论 -
CS 400 Root LCA Queries 思维+LCA
题意:n个节点的树,Q次询问,每次询问(a,b,c)问有有多少个D,使得以D为根时,LCA(a,b)=c1树上任意两点只有唯一路径,a->b = a->LCA(a,b)->b 若c没有出现在a-b的路径中 则lca(a,b)不可能为c.判断c是否在a-b路径中 只要知道dist(a,c)+dist(c,b)是否等于dist(a,b).若c在a-b路径中 那么满足条原创 2018-03-21 18:43:21 · 138 阅读 · 0 评论