清北学堂模拟赛d3t3 c】的更多相关文章

分析:一开始拿到这道题真的是无从下手,暴力都很难打出来.但是基本的方向还是要有的,题目问的是方案数,dp不行就考虑数学方法.接下来比较难想.其实对于每一行或者每一列,我们任意打乱顺序其实对答案是没有影响的.那么我们按照高度从大到小对行和列进行排序,单独考虑所有高度相等的行和列,组成了一个L形,如果我们把所有的L形的方案数求出来最后乘起来就是答案了,关键就是怎么求它的方案数. 要求L形中满足每行每列最大高度不超过H的方案数很难求,因为不好保证最大高度,正难则反,先求出不满足的,但是不满足的也比较难…
/* clj:水题别人都满分你不是你就完了,所以说水题一定要细心一点,有这么几个细节:①前导零的处理,全是零的时候要特判②换行要注意,不要多大一行,剩下就是水水的模拟了 */ #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<cmath> #include<vector> #…
分析:大模拟,没什么好说的.我在考场上犯了一个超级低级的错误:while (scanf("%s",s + 1)),导致了死循环,血的教训啊,以后要记住了. /* 1.没有发生改变,check一下 2.将一位1变成0 3.添一位 4.减一位 */ #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std;…
/* 考虑一下已经放回m本书的情况,已经有书的格子不要管他,考虑没有书的格子,不考虑错排有(n-m)!种,在逐步考虑有放回原来位置的情况,已经放出去和已经被占好的格子,不用考虑,剩下全都考虑,设t=x∩y,把除t以外的搞一下容斥就行了 */ #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<c…
/* 注意到合并三堆需要枚举两个端点,其实可以开一个数组记录合并两堆的结果,标程好像用了一个神奇的优化 */ #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<cmath> #include<vector> #define ll long long #define fo(i,…
3.棋盘迷宫(boardgame.pas/c/cpp)(boardgame.in/out)时间限制:5s/空间限制:256M[题目描述]小 A 和小 Z 是非常要好的朋友, 而且他们都对迷宫游戏非常有兴趣. 他们经常在自习课上用迷宫来打发时间(两位都是学习效率 400%的 dalao, 大家切记不要模仿) .他们的迷宫非常简单, 又被他们叫做是棋盘迷宫, 迷宫本身是一个 N*M 大小的棋盘, 从左往右列数不断加大, 从上往下行数不断增大, 故左上角的坐标为(1,1),右下角的坐标为(N,M) .…
题目描述众所周知的是,火柴棒可以拼成各种各样的数字.具体可以看下图: 通过2根火柴棒可以拼出数字“1”,通过5根火柴棒可以拼出数字“2”,以此类推. 现在LYK拥有k根火柴棒,它想将这k根火柴棒恰好用完,并且想知道能拼出的最小和最大的数分别是多少. 输入格式(stick.in) 一个数k. 输出格式(stick.out) 两个数,表示最小的数和最大的数.注意这两个数字不能有前导0. 输入样例15 输出样例108 7111111 数据范围对于30%的数据k<=10.对于60%的数据k<=20.对…
题目描述LYK拥有一个十进制的数N.它赋予了N一个新的意义:将N每一位都拆开来后再加起来就是N所拥有的价值.例如数字123拥有6的价值,数字999拥有27的价值.假设数字N的价值是K,LYK想找到一个价值是K-1的数字,当然这个答案实在太多了,LYK想使得这个价值为K-1的数字尽可能大. 输入格式(bit.in) 一个数N. 输出格式(bit.out)一个数表示答案.你需要输出一个非负整数,且这个数不包含前导0. 输入样例1199 输出样例1198 输入样例21000 输出样例20 对于20%的…
题目描述总共有n颗糖果,有3个小朋友分别叫做L,Y,K.每个小朋友想拿到至少k颗糖果,但这三个小朋友有一个共同的特点:对3反感.也就是说,如果某个小朋友拿到3颗,13颗,31颗,333颗这样数量的糖果,他就会不开心.(也即它拿到的糖果数量不包含有一位是3)LYK掌管着这n颗糖果,它想问你有多少种合理的分配方案使得将这n颗糖果全部分给小朋友且没有小朋友不开心.例如当n=3,k=1时只有1种分配方案,当n=4,k=1时有3种分配方案分别是112,121,211.当n=7,k=2时则不存在任何一种合法…
题目描述一个神秘的村庄里有4家美食店.这四家店分别有A,B,C,D种不同的美食.LYK想在每一家店都吃其中一种美食.每种美食需要吃的时间可能是不一样的.现在给定第1家店A种不同的美食所需要吃的时间a1,a2,…,aA. 给定第2家店B种不同的美食所需要吃的时间b1,b2,…,bB.以及c和d.LYK拥有n个时间,问它有几种吃的方案. 输入格式(eat.in) 第一行5个数分别表示n,A,B,C,D. 第二行A个数分别表示ai. 第三行B个数分别表示bi. 第四行C个数分别表示ci. 第五行D个数…
题目描述LYK有一本书,上面有很多有趣的OI问题.今天LYK看到了这么一道题目:这里有一个长度为n的正整数数列ai(下标为1~n).并且有一个参数k.你需要找两个正整数x,y,使得x+k<=y,并且y+k-1<=n.并且要求a[x]+a[x+1]+…+a[x+k-1]+a[y]+a[y+1]+…+a[y+k-1]最大.LYK并不会做,于是它把题扔给了你. 输入格式(max.in) 第一行两个数n,k. 第二行n个数,表示ai. 输出格式(max.out)两个数表示x,y.若有很多种满足要求的答…
题目描述LYK拥有一个十进制的数N.它赋予了N一个新的意义:不考虑N的符号,将N每一位都拆开来后再加起来就是N所拥有的价值.例如数字123拥有6的价值,数字999拥有27的价值,数字-233拥有8的价值.假设数字N的价值是K,LYK想找到一个价值是K+1的数字,当然这个答案实在太多了,LYK想使得这个价值为K+1的数字尽可能大,并且需要保证这个数字小于N. 输入格式(bit.in) 一个整数N. 输出格式(bit.out)一个数表示答案.你需要输出一个整数,且这个数不包含前导0. 输入样例119…
题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只有点权. LYK想把这个图删干净,它的方法是这样的.每次选择一个点,将它删掉,但删这个点是需要代价的.假设与这个点相连的还没被删掉的点是u1,u2,…,uk.LYK将会增加a[u1],a[u2],…,a[uk]的疲劳值. 它想将所有点都删掉,并且删完后自己的疲劳值之和最小.你能帮帮它吗? 输入格式(god.in) 第一行两个数n,m表示一张n个点m条边的图. 第二行n个数ai表示点权. 接下来m行每行…
题目描述 LYK最近在研究位运算,它研究的主要有两个:or和xor.(C语言中对于|和^) 为了更好的了解这两个运算符,LYK找来了一个2^n长度的数组.它第一次先对所有相邻两个数执行or操作,得到一个2^(n-1)长度的数组.也就是说,如果一开始时a[1],a[2],…,a[2^n],执行完第一次操作后,会得到a[1] or a[2],a[3] or a[4] ,…, a[(2^n)-1] or a[2^n]. 第二次操作,LYK会将所有相邻两个数执行xor操作,得到一个2^(n-2)长度的数…
题目描述 假设这是一个二次元.LYK召集了n个小伙伴一起来拍照.他们分别有自己的身高Hi和宽度Wi.为了放下这个照片并且每个小伙伴都完整的露出来,必须需要一个宽度为ΣWi,长度为max{Hi}的相框.(因为不能叠罗汉).LYK为了节省相框的空间,它有了绝妙的idea,让部分人躺着!一个人躺着相当于是身高变成了Wi,宽度变成了Hi.但是很多人躺着不好看,于是LYK规定最多只有n/2个人躺着.(也就是说当n=3时最多只有1个人躺着,当n=4时最多只有2个人躺着)LYK现在想问你,当其中部分人躺着后,…
题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,不仅有边权还有点权. LYK给出了一个子图的定义,一张图G’={V’,E’}被称作G的子图,当且仅当 ·G’的点集V’包含于G的点集V. ·对于E中的任意两个点a,b∈V’,当(a,b)∈E时,(a,b)一定也属于E’,并且连接这两个点的边的边权是一样的. LYK给一个子图定义了它的价值,它的价值为:点权之和与边权之和的比. LYK想找到一个价值最大的非空子图,所以它来找你帮忙啦. 输入格式(graph…
题目描述 LYK喜欢听音乐,总共有n首音乐,有m个时刻,每个时刻LYK会听其中一首音乐,第i个时刻会听第ai首音乐.它给自己定了一个规定,就是从听音乐开始,听的每连续n首音乐都是互不相同的.例如当n=3时,从听歌开始,123321就是一个合法的顺序(此时LYK听了两轮歌,分别是123和321,每一轮的歌都是互不相同的),而121323就是一个不合法的顺序(LYK也听了两轮歌,第一轮中121存在听了两次相同的歌).我们现在只截取其中一个片段,也就是说并不知道LYK之前已经听了什么歌.因此12132…
题面有误!10,11,12操作类别为A,13,14,15类别为B,16,17,18类别为C. 分析:一道大暴力,每次记录一下走了多少步,上一步操作类别是啥就可以了.最后只需要写6种操作,每一次操作进行4次就还原了,所以不用memcpy再来转. #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; ], cnt, c[…
分析:比较巧妙的一道题.经典的LCS算法复杂度是O(nm)的,理论上没有比这个复杂度更低的算法,除非题目有一些限制.这道题中两个字符串的长度不一样,f[i][j]如果表示第一个串前i个,第二个串前j个的最长公共子序列的话,复杂度会爆.但是LCS的长度很小,能不能换一种状态的表示方法呢? 回想0/1背包问题的变形,如果体积特别大,价值特别小,我们可以把价值定义在状态里面,设f[i][j]表示前i个物品中价值为j的最小体积,最后扫一遍j看看符不符合条件就可以了,对于这道题我们可以也可以沿用这样的思路…
分析:题目非常短,看起来非常难,其实把图一画就明白了.有向图,每个点的出度都是1,那么整个图肯定是环上套链,链上的边无论怎样反向都不会形成环,环上的边也可以随便反向,但是最终不能反为同向的,总方案数减去反成同向的就是答案了.总方案数可以用乘法原理求出来. #include <bits/stdc++.h> using namespace std; ,mod = 1e9+; int du[maxn],to[maxn],vis[maxn]; int n,cnt; long long ans,qpow…
分析:一道比较让人头疼的数学题. 先考虑怎么让分出来的三角形相似,先不考虑每个三角形的具体边长,设每个三角形的周长为li,则可知必然有一个数g = gcd{li},每一个三角形的周长都是g的倍数,这样就会有n/g个单位三角形,我们只需要把n/g分配给若干个三角形就可以了,利用隔板法,可以算出方案数为2^(n/g - 1). 再来考虑知道了周长怎么求这个周长的三角形有多少个.为了方便起见,设a ≤ b ≤ c,s = a + b + c,如果b = c,那么s = a + 2b,b的取值范围就是[…
分析:比较复杂的一题. 首先要求k个mod m互不相同且和为n的数ai,我们可以转化为求和为k个bi,并且(Σbi) % m = n % m 其中bi=ai % m,接下来可以用dp求出选了i个b,和为j的方案数.用f[i][j]表示状态.但是这样可能会让bi重复,一个解决办法是再加上一维,不过这是不必要的,我们只需要先枚举当前的数是哪一个,之后再倒序枚举i,j就可以了.我们知道b的方案数,ai = ki*m + bi,接下来知道ki的方案数就可以了.因为Σai = Σki*m + bi,所有式…
分析:一眼树形dp题,就是不会写QAQ.树形dp嘛,定义状态肯定有一维是以i为根的子树,其实这道题只需要这一维就可以了.设f[i]为以i为根的子树中的权值和.先处理子树内部的情况,用一个数组son[i]表示以i为根的子树中,i能走到的节点个数,可以利用son数组和当前点的权值来更新f数组. 处理了每个子树内部的情况,接下来就要合并它们,将每一个根节点作为中间点,算一下中间点权值的贡献,利用乘法原理算出有多少对点对经过中间点,乘一下就ok了. 树形dp的基本状态定义要熟记,有些题目子树内部是互相独…
分析:这道题比较有难度. 观察题目,发现只有当一行翻了奇数次后才会产生黑色格子,设有x行被翻了奇数次,y列被翻了偶数次,那么x*m + y*n - 2*x*y = s,接下来就要解方程了.对于二元一次方程,先枚举其中一个未知数x,就能推得y = (s - x*m)/(n - 2*x).假设翻了奇数次的x行y列各只用x,y次操作,那么接下来的任务就是把剩下的没用完的次数给分配出去,而且不能改变奇偶性.如果每一次操作是把一行或一列翻两次,那么就是要把(r - x)/2次操作分给n行,(c - y)/…
分析:感觉和dp的状态转移方式有点类似,对于一个数,你不能看有多少个状态能转移到它,你要看它能转移到多少个状态,相当于刷表法和填表法的区别,对于这道题也是一样,我们不能看有多少个数是x的倍数,而是每次将x的因数ans++,然后询问直接输出就可以了. #include <bits/stdc++.h> using namespace std; ],ans,t; void solve(int x) { ; i * i <= x; i++) { ) { if (i * i != x) { a[i…
分析:如果题目中没有环的话就是一道裸的最长路的题目,一旦有环每个城市就会被救多次火了.把有向有环图变成有向无环图只需要tarjan一边就可以了. #include <bits/stdc++.h> using namespace std; ; ,a[maxn],S,P,p[maxn],v[maxn],vis[maxn]; ; bool flag[maxn]; long long ans,d[maxn]; stack <int> s; void add(int x,int y) { t…
题目描述有一天,你实验室的老板给你布置的这样一个实验.首先他拿出了两个长度为 n 的数列 a 和 b,其中每个 ai 以二进制表示一个集合.例如数字 5 = (101)2 表示集合 f1; 3g.第 i 次实验会准备一个小盒子,里面装着集合 ai 所有非空子集的纸条.老板要求你从中摸出一张纸条,如果满足你摸出的纸条是 ai 的子集而不是 ai-bi,ai-bi+1,...,ai-1 任意一个的子集,那么你就要 ***:反之,你就逃过一劫.令你和老板都没有想到的是,你竟然每次都逃过一劫.在庆幸之余…
题目描述小 G 进入了一个神奇的世界,在这个世界,天上会掉下一些馅饼.今天,天上会随机掉下 k 个馅饼.每次天上掉下馅饼,小 G 可以选择吃或者不吃(必须在下一个馅饼掉下来之前作出选择,并且现在决定不吃的话以后也不能吃).馅饼有 n 种不同的馅,根据物理定律,天上掉下这 n 种馅饼的概率相同且相互独立.然而,每一种馅饼 i 都有一个前提馅饼集合 Si.只有当 Si 中的馅饼都吃过之后,才能吃第 i 种馅饼.比如说,韭菜馅馅饼的 S 中有白菜猪肉馅饼和鲜虾馅饼,那么小 G 只有在吃过白菜猪肉馅饼和…
题目描述 现在,我的手上有 n 个数字,分别是 a1; a2; a3; :::; an.我现在需要删除其中的 k 个数字.当然我不希望随随便便删除,我希望删除 k个数字之后,剩下的 n - k 个数中有最多的不同的数.输入格式第一行两个正整数 n 和 k,含义如题目描述.接下来一行,有 n 个非负整数,分别是 a1 到 an.输出格式一共一行,一个整数 ans,表示删除了 k 个数字后最多的不同的数的个数.样例输入4 11 3 1 2样例输出3样例解释如果删去第一个 1:在[3,1,2]中有 3…
分析:简化一下题意就是给任意两对点连一条权值为0的边,求出每次连边后最小生成树的权值和*2/(n - 1) * n. 每次求最小生成树肯定会爆炸,其实每次加边只是会对最小生成树上的一条边有影响,也就是加入这条边权为0的边后形成的环上权值最大的边,我们可以每次在树上倍增找到这条边,可以通过60%的点. 最小生成树的变形题都有一个思路,就是当我们无法继续优化的时候我们就思考一下克鲁斯卡尔算法的原理,因为每条边是按照边权从小到大加入的,所以在加入这条边的时候,这条边两端连的点对之间连一条权值为0的边,…