[校内训练20_01_22]ABC】的更多相关文章

1.给出序列A,求序列B,使得bi|ai,lcm(b1,b2,...,bn)=lcm(a1,a2,...,an)且字典序最小. 可以发现,对于某个质数p,它有一个最大的次数k,将pk放在尽可能靠后且能够整除原数组中的数字的位置上,便是答案. 虽然数字的值域达到1E18,但我们只需要知道每个数1~1E6之间的质因子是什么以及是哪些,剩下来的一定是大于1E6的质因子且最多只有两个. 由于答案中的质数及其次数彼此间相互独立,1E6以下的质因子可以直接统计,而剩下的可以通过两两间求gcd的方法进行比较.…
1.问有多少个大小为N的无标号无根树,直径恰好为L.$N,L \leq 200$ 2.问一个竞赛图中有多少个长度为3.4.5的环.$N \leq 2000$ 3.给出一些直线和单个点A,问这些直线的交点与A最近的M个距离之和为多少.$N \leq 50000,M \leq 10^7$.保证不存在两个交点与点A的距离相同. 二分圆的半径,算交点个数,最后统计答案用并查集. #include<bits/stdc++.h> using namespace std; typedef long doub…
1.SB题 2.有n个点,m条边,每次加入一条边,你要挑出一些边,使得形成的图每个点度数都为奇数,且最长的边最短. 3.给一个N次多项式,问有多少个质数在任意整数处的点值都是p的倍数,输出它们.$N \leq 1000,|a_i| \leq 10^9$ 问题等价于这个多项式在mod p意义下存在因数(x-i),i取遍所有整数. 那么p满足要求,等价于这个N次多项式存在因数$x(x-1)(x-2)...(x-p+1)=x^p-x(mod p)$ 因此,p要么是系数gcd的质因数,要么在N以内. #…
1.平面上每次加入直角边平行于坐标轴的等腰直角三角形,每次询问某个点被覆盖了多少次. 大常数算法:O(nlog^2) #include<bits/stdc++.h> using namespace std; ; int n,q; inline int read() { char ch=getchar(); while(!isdigit(ch))ch=getchar(); '; ch=getchar(); +ch-';ch=getchar();} return x; } ]; inline vo…
来自FallDream的博客,未经允许,请勿转载,谢谢. hzwer又出丧题虐人 4道noi....        很奇怪 每次黄学长出题总有一题我做过了. 嗯题目你们自己看看呗 好难解释 -------------------------------------- A.[bzoj1565][NOI2009]植物大战僵尸 这道题其实挺好想的.nm比较小,考虑最小割,假设割到S表示吃,割到T表示不吃 那么能源小于0的,从S向他连边,流量是负的能源, 能源大于0的,从它向T连边,流量是能源,同时答案…
来自FallDream的博客,未经允许,请勿转载,谢谢. 报警啦.......hzwer又出丧题虐人啦..... 4道ctsc...有一道前几天做过了,一道傻逼哈希还wa了十几次,勉强过了3题..我好菜啊都不会 A.[ctsc2014][bzoj3555]企鹅QQ 给定n个长度为l的字符串,两量不同,求有多少对字符串只有一个字符不同.  n<=300000  l<=200 这个很明显就是哈希啦......我写了几发都随便wa,然后怒而滚键盘才过了.map会T,用了个手写map #include…
来自FallDream的博客,未经允许,请勿转载,谢谢. ----------------------------------------------------------------------------- hzwer这次不都出省选题了,干脆直接扔出了APIO三道+一道NOI,然后按照惯例最后留了一个模板题.有两道apio是2014的,以前做过了,剩下的题调来调去,还剩20分钟终于做完了. --------------------------------------------------…
题意 给出n,等概率地生成一个1~n的数列.现在有n个人从左到右站成一排,每个人拿有当前数列位置上的数字,并且一开始都不知道数字是多少(但知道n是多少).从左到右让每个人进行如下选择: 1.选择保留自己的卡片,让所有人知道这个卡片上面的数字,并且走到等待区中.第一个人只能进行该选择. 2.选定等待区中的一个人,将自己的卡片与其交换,然后自己带着交换后的卡片退出游戏.等待区中的那个人会让所有人知道这个卡片上面的数字. 假如每个人都绝顶聪明,都想最大化自己的数字,求出等待区中人数的期望.n≤1E15…
题意 给出一个二分图,左边为A集合,右边为B集合,要求把A集合中每一个点染为黑白两色中的一种,B集合中的颜色已定.染色后对于原本相邻且颜色相同的点,建立新的二分图,即得到了两个新的二分图,它们是独立的.求出这两个新的二分图的最大匹配数的和的最小值.数均小于等于5000. 思考 这是简化题意.由于暴力很难写,考虑网络流.将B集合中的每一个点根据其颜色分为一类和二类点.对于A集合中的每一个点,拆成两个点,两点连1的单向边,将所有相邻的一类点连线左边,另一类连向右边,值为1.所有二类点连向汇点,源点连…
对于每个平面图,都有唯一一个对偶图与之对应.若G‘是平面图G的对偶图,则满足: G'中每一条边的两个节点对应着G中有公共边的面,包括最外部无限大的面. 直观地讲,红色标出来的图就是蓝色标出的图的对偶图. 求出一个平面图的对偶图(而且不是特殊的结构),可以贪心地找出所有最小的面.但如何描述最小?我们要固定一条边,按它顺时针或逆时针的方向找到第一条边,直到出现第一个访问过的边,就找到了一个面. 具体地将:从每个边出发,按有方向的角排序,找到角度最大或最小的边,再进行下去.反正自己写写代码就知道了.…
原题见CF632F https://blog.csdn.net/Steaunk/article/details/80217764 这个比较神仙了 点边转化, 把max硬生生转化成了路径最大值,再考虑所有路径最大值的最小值 再通过<=,>=变成= 简单证明一下充要性:如果都满足f(i,j)=a(i,j),那么对于路径aij->aik->akj->aij也都满足,所以一定成立 如果存在一个f(i,j)<a(i,j),那么一定会有某一步a(k1,k3)>max(a(k1…
题目还有一个条件是,x>y的y只会出现一次(每个数直接大于它的只有一个) n<=5000 是[HNOI2015]实验比较 的加强版 g(i,j,k)其实可以递推:g(i,j,k)=g(i-1,j,k-1)+g(i,j-1,k-1)+g(i-1,j-1,k-1) 代码: 判断无解的时候可能比较混乱 1.先保证不要连有向重边 2.如果不是树形图,就是有环,vis过了 #include<bits/stdc++.h> #define il inline #define reg regist…
对于每个点都要答案 还是异或 trie树合并石锤了 朴素枚举是O(n^2*17)的 怎么办呢? 我们发现合并的时候,一些部分的trie的子树还是不变的 改变的部分也就是合并的复杂度可以接受 鉴于大部分trie都不变,而且是一个从上往下的过程,支持pushup维护 所以考虑dp,再在merge的pushup时候维护好dp值的更新 f[i]表示trie中以i为根子树,最后的游戏结果 转移分类讨论: 如果x的sz==1,令dp[x]=-1 否则如果仅x的某一个子树有sz,dp[x]=dp[son] 否…
(题干中的废话已经划去) dp显而易见 收益为负数的可以直接扔掉不管.不要一定更优 子串问题,考虑SAM 建立广义SAM 尝试匹配,匹配到的位置的parent树祖先如果有完整的串,那么可以从这个串转移 考虑祖先不好考虑 不妨考虑i对j(i<j)的贡献,就是子树了 线段树维护dfn序,区间对val取max SAM学傻了 这个,由于是"完整出现”,所以AC自动机就可以(比广义SAM好写好调) 走一走属于第j个串的路径,对应的fail树的祖先包含i(i<j)的结束位置,那么可以转移 所以,…
二分图匈牙利也可以 判断必须点就看能不能通过偶数长度的增广路翻过去 代码: (最后一个点4s多才行,,,卡不过算了) 开始边数写少了RE,应该是4*N*N M-R随手开了一堆int?都要是long long // luogu-judger-enable-o2 #include<bits/stdc++.h> #define il inline #define reg register int #define numb (ch^'0') using namespace std; typedef l…
套路地, 考虑dfs树上搞事情 容易发现,对于(x,y)如果dfs树上距离为奇数,或者dfs树上路径中有一条边在某个简单奇环上,那么可以经过奇数条边到达 判断边在某个奇环上: 点双,点双中黑白染色,如果有一个奇环,那么点双中的所有边都在一个奇环中 询问 倍增预处理,LCA搞一下即可 #include<bits/stdc++.h> #define il inline #define reg register int #define numb (ch^'0') using namespace st…
[题目大意] 给一棵树,求有多少条路径满足总和-最大值 是P的倍数 n<=10^5, P<=10^7 [题解] 一看就是点分治嘛 不考虑子树合并,考虑poj1741的做法,每次考虑经过重心的路径,用优先队列,从小到达添加并求答案即可. 容斥下. # include <queue> # include <stdio.h> # include <string.h> # include <iostream> # include <algorith…
[题目大意] f(i)=((Af(i-1)+B)/(Cf(i-1)+D)) mod P. 给出f(0), A, B, C, D, P, n,求f(n). 多组数据T<=1e4 n<=1e18, P <= 1e9, |f(0)|,|A|,|B|,|C|,|D| <= 1e9 保证任何时候存在逆元. [题解] 首先我们有一种O(TP)的做法:找循环节. 考场上因为数据原因是可以AC的.. # include <map> # include <stdio.h> #…
题目传送门 http://192.168.21.187/problem/1236 http://47.100.137.146/problem/1236 题解 题目中要求的显然是那个状态下的直径嘛. 所以这道题有一个非常简单的做法--线段树分治. 直接把每一条边按照 \(l, r\) 的区间放到线段树上进行分治,遍历的时候用并查集维护直径就可以了. 时间复杂度为 \(O(n\log^2n)\). 很早以前就写了这个算法,代码附在了最后,不多讲了. 但是这道题还有一个方法--动态 DP. 线段树分治…
题意 给一个非负整数序列,每次问能否异或上一个正整数使得所有的数单调不减.如果能,输出最小的x,否则输出-1.单点修改.多测.要求最多一个log. 思考 只要考虑相邻的两个数.找到这两个数最高的不同的一位,那么只要考虑是一定要异或或者是一定不要异或. 代码 #include<bits/stdc++.h> using namespace std; ; ; int n,m; ][]; inline int read() { char ch=getchar(); while(!isdigit(ch)…
题意 对于任意1 ≤k≤N,求有多少个左右区分的恰有k个叶子节点的二叉树,满足对于每个节点要么没有叶子节点要么有两个节点,同时不存在一个叶子节点,使得根到它的路径上有不少于M条向左的边. 答案对998244353取模. 思考 将问题放到平面上考虑.起初在原点,我们考虑树的dfs序,每次向左走一次,得到的向量是(1,1),否则是(1,-1). 由于题目要求要么没有叶子节点,要么有两个节点,因此路径不会到第四象限.如果某次路径到达或超过了y=M,那么一定是不合法的. 这样一来,我们就可以进行简单的转…
题意 有一个定义在 k 维非负整点上的函数:$f(x_1,x_2,...,x_k):N_{0}^{k}->\{0,1\}$ ,定义方法如下: 若存在$j∈[1,k],x_j=0$,则$f(x_1,x_2,...,x_k)=0$ 若对$j∈[1,k]$都有$x_j=1$则$f(x_1,x_2,...,x_k)=1$ 否则$f(x_1,x_2,...,x_k)=(\sum_{j=1}^{k}{f(x_1,...,x_{j-1},x_j-1,x_{j+1},...,x_k)})mod 2$ 现在给出k…
题意 给出一棵N 个节点的树,树上的每个节点都有一个权值$a_i$. 有Q 次询问,每次在树上选中两个点u, v,考虑所有在简单路径u, v 上(包括u, v)的点构成的集合S. 求$\sum_{w∈S}{a_w or dist(u,w)}$ 其中dist(u,w) 为简单路径u,w 上的边数,or 是按位或. 思考 设f[i][j]表示从第i个节点开始,总共跳了$2^j$个节点得到的答案,g[i][j]表示从第i个节点开始,向下跳了$2^j$个节点得到的答案.这些状态的转移只要考虑后半部分最高…
题意 给出N 个形如$f_i(x) = a_i x^2 + b_i x $的二次函数. 有Q 次询问,每次给出一个x,询问$max{\{f_i(x)\}}$.$N,Q \leq 5*10^5$. 思考 首先将x大于0还是小于0分类,对于某一类全都除以x,那么就得到了一些直线.最优的答案一定在某条最上方或最下方的直线上,半平面交或凸包即可. 代码 // luogu-judger-enable-o2 #pragma GCC optimize 2 #include<bits/stdc++.h> us…
题意 求$max_{l \leq r}{\{min{\{a_l,a_{l+1},...,a_r\}}*(r-l+1)\}}$ 思考 分治,考虑一个区间跨过某个点的贡献即可. 代码 #include<bits/stdc++.h> using namespace std; typedef long long int ll; ; const int inf=1E9; int n; ll ans,a[maxn]; inline ll max(ll x,ll y) { return x>y?x:y…
题意 现有n*m的长方形网格,每个格子中写着一个数,并构成了[0,n*m)的排列.每次可以将一行循环平移x格,也可以将一列循环平移x格.给出初始状态,给出一个到达给定状态的方案.n*m<=10000,n,m>=2. 思考 发现存在一种方法,能够使任意三个方格进行顺时针或逆时针改变位置.其中有一个方格的行和列由剩余两个方格决定. 这样一来,我们可以将前n-1行排成有序的,只剩下最后一行是无序的. 通过第一张改变位置的方式,我们也可以将同一行的任意三个方格进行循环平移.这样可以将最后一行的前m-2…
题意 长度为n的数组,上面有k个位置是1,现在有l种长度的连续全1串,要求用最少的次数将这个数组异或成全0的数组.n<=1E5,k<=10,l<=100. 思考 先将数组进行异或的差分.可以发现,现在异或上全1串只是将两个端点进行异或. 接下来求出将每对1变成0的最小代价,之后就是简单状压. 复杂度O(nkl+2^(2k)). 代码 #include<bits/stdc++.h> using namespace std; ; ; int n,k,l; int a[maxn],…
题意 一个排列,每次选一个子序列按顺序放在开头,要求变成升序的操作次数不超过17次,给出方案.n<=1E5. 思考 对于ai=aj-1且i<j的数字,一定要保持其相对顺序.可以根据这个关系分成若干个块,并根据每个块最小的数从小到大将块编号为1~m. 接着把所有奇数编号的块选出来放在左侧.能发现这次操作后奇数编号和偶数编号的块至少有一半会变成更大的块. 复杂度O(nlogn). 代码 #include<bits/stdc++.h> using namespace std; ; ][m…
题意 把一个边长为1的正n边形放到一个正m边形中,要求m边形完全覆盖n边形,可以有交点,并且中心重合.求正m边形的最小边长,至少精确到6位.要求logn计算. 思考 先考虑m|n的情况. 我们知道,正m边形的边长与可行区域(即可以完全覆盖的那些角度)形成单射,当且仅当所有可行区域都成为可数的点时,答案最优.(可以理解为再缩小一点就无解了) 这样不难证明,把正n边形的几条边刚好卡在正m边形上是最优的.如n=8,m=4: 这时正m边形的边长是容易计算的.相信大家都会初中数学. 这样再考虑一般情况.由…
购物问题 难度级别:C: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 由于换季,ACM商场推出优惠活动,以超低价格出售若干种商品.但是,商场为避免过分亏本,规定某些商品不能同时购买,而且每种超低价商品只能买一件.身为顾客的你想获得最大的实惠,也就是争取节省最多的钱.经过仔细研究过,我们发现,商场出售的超低价商品中,不存在以下这种情况:N(3<=n)种商品C1,C2,…,Cn,其中Ci和Ci+1是不能同时购买的(i=1,2,…,n-1),…