首页 > TAG信息列表 > Jsoi2015
luogu P5502 [JSOI2015]最大公约数|st表+二分
题目描述 给定一个长度为 \(N\) 的正整数序列 \(A_i\) 。 对于其任意一个连续的子序列 \(A_l,A_{l+1},...,A_r\) ,我们定义其权值 \(W(L,R)\) 为其长度与序列中所有元素的最大公约数的乘积,即 \(W(L,R) = (R-L+1) × \gcd (A_l,...,A_r)\)。 JYY 希望找出权值最大的子序列。 输题解 [JSOI2015]最小表示
link Solution md,智障了。 首先看出一个结论,就是说一条边 \((u,v)\) 可以删当且仅当在原图中删掉改变该边 \(u\) 仍能到达 \(v\)。 因为这是一个 DAG,所以我们可以拓排之后从后往前扫,然后用 bitset 维护连通性。 Code #include <bits/stdc++.h> using namespace std; #define Int题解 P6087 【[JSOI2015]送礼物】
分析 先考虑如果没有 \(L\) 和 \(R\) 的长度限制,我们发现最优解中对于区间 \(l\sim r\),\(A_l\) 和 \(A_r\) 应该分别为 \(A_l,A_{l+1},\cdots,A_r\) 中的最大值和最小值。 考虑加上 \(L\) 和 \(R\) 的长度限制,若原来的区间为 \(l\sim r\),则会分如下 3 种情况进行讨论: 如果 \(r-l[jsoi2015]染色问题
题意:P6076 思路: 容斥+dp 有三种下限要求方案数?我们来层层降维。 首先\(ans=(-1)^{c-i}*C_c^i*f[i]\) f[i]表示至多i种颜色且满足另外两限制的方案数。 很多时候我们发现,"随便","至多","至少"要好求很多,而我们要"恰好"时就会用到容斥 \(f[i]=(-1)^{m-i}*n^{C_m^i-1}\) 这里同理降要做的题
省选: [HNOI2015]开店 [HNOI2015]接水果 [HNOI2015]亚瑟王 [HNOI2015]实验比较 其实这题也是个套路。 先把所有被等号连接的变量缩成一个点。 题目中说明了\(M<=n\),所以如果把一个点向强制比它大的点连边则形成了基环内向森林。 其中,有环的连通块一定无解,可以使用拓扑排序判定。 判「JSOI2015」串分割
「JSOI2015」串分割 传送门 首先我们会有一个贪心的想法:分得越均匀越好,因为长的绝对比短的大。 那么对于最均匀的情况,也就是 \(k | n\) 的情况,我们肯定是通过枚举第一次分割的位置,然后每一段长度 \(\frac{n}{k}\) 最后取最小的。 把这个思想运用到一般情况:如果分出来两段长短不一,[题解] [JSOI2015] 最小表示
题面 题解 可以发现, 若 \(u\) 到 \(v\) 可由从 \(u\) 到 \(v\) 的另外一条路径而不走 \((u, v)\) 边到达, 则 \((u, v)\) 可删 正反用 bitset 维护一下传递闭包即可 Code #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <bitset> #[JSOI2015] salesman
题面 题解 考虑树形 DP , 设 \(f[i]\) 为 \(i\) 节点为根的子树最大收益是多少, \(h[i]\) 代表 \(i\) 节点的最优方案是否唯一 转移的话拿个堆记一下子节点中 \(>0\) 的那些, 然后 \(h\) 跟他们的与一下 若是剩下来的有 \(f = 0\) 或是跟你选的是一样的, 这个点 \(i\) 的 \(h\) 就[JSOI2015]最小表示
之前连bitset都不会写......为了写这道题去学习了一下bitset的用法 首先要得到一个很显然的结论,就是如果\(x\)和\(y\)之间的边可以被删去,那么\(x\)一定可以通过别的路径走到\(y\),然后在这里我们就需要用bitset来维护点与点之间的连通性 因为这是一个有向无环图,所以我们直接拓扑排BZOJ4487 [JSOI2015]染色问题
Link 普及题。 容斥二项式反演得到答案的计算公式:\(\sum\limits_{i=0}^n\sum\limits_{j=0}^m\sum\limits_{k=0}^c(-1)^{n-i+m-j+c-k}{n\choose i}{m\choose j}{c\choose k}(k+1)^{ij}\) 这样我们就可以\(O(nmc)\)地完成了。 然后随便优化一下就是\(\sum\limits_{i=1}^n\sum\limiBZOJ 4477: [Jsoi2015]字符串树 可持久化trie树
这个是真——可持久化字典树..... code: #include <bits/stdc++.h> #define N 100006 #define setIO(s) freopen(s".in","r",stdin) using namespace std; int n,edges,Q,tot; char val[N<<1][12]; int hd[N],to[N<<1],nex[N[JSOI2015]最大公约数
题目 一个非常众所周知的结论,一个序列的前缀\(\gcd\)只会有\(\log\)种取值 于是考虑一下一些暴力的东西,我们枚举每个点作为左端点,二分出前缀\(\gcd\)变化的位置,复杂度大概是\(\operatorname{O(nlog^3n)}\),好像非常垃圾的样子 我们考虑直接从后往前枚举左端点,每次往前加入一个数,和之BZOJ 4488: [Jsoi2015]最大公约数 暴力 + gcd
Code: #include <bits/stdc++.h>#define setIO(s) freopen(s".in","r",stdin) #define maxn 100004 #define ll long long using namespace std; ll gcd(ll a,ll b) { return b?gcd(b,a%b):a; }ll arr[maxn],gc[maxn]; int pos[maxn],b[BZOJ 4488: [Jsoi2015]最大公约数
4488: [Jsoi2015]最大公约数 思路:容易发现以某个位置\(i\)为结尾所有后缀的\(gcd\)个数不超过\(log(a[i])\)。 (怎么发现?将数写成质因子幂次乘积的形式,然后\(gcd\)每次减小一个质因子,最多减少\(log\)次)然后就可以用\(map\)维护每个\(gcd\)的最左端端点。 代码: #pragma GCC optimize(bzoj4488:[Jsoi2015]最大公约数
Pre 细节!!! 又双叒叕错在了一些简单的地方。 测试的时候发现有两个点会\(WA\)掉,最后发现不能再循环的开头更新答案,因为最后一次的答案无法计入统计。 Solution 考虑到\(GCD\)可以整个区间的\(GCD\)当成一个数来进行处理,考虑\(GCD\)的转折点,就是我的数组里面的数,这样的话可以维护出【BZOJ4487】[JSOI2015]染色问题(容斥)
【BZOJ4487】[JSOI2015]染色问题(容斥) 题面 BZOJ 题解 看起来是一个比较显然的题目? 首先枚举一下至少有多少种颜色没有被用到过,然后考虑用至多\(k\)种颜色染色的方案数。 那么显然没有颜色的限制,只有行列的限制。 那么我们钦定行必须被染色,这样子每一行的染色方案之和列数和颜色数相bzoj4485: [Jsoi2015]圈地
思维僵化选手在线被虐 其实应该是不难的,题目明显分成两个集合,要求是不同集合的点不能联通 先假设全选了,然后二分图最小割,相邻两个点直接连墙的费用就可以了 #include<cstdio>#include<iostream>#include<cstring>#include<cstdlib>#include<algorithm>#include<cmath>#define pt(xbzoj4472:[Jsoi2015]salesman
传送门 树形dp 对于每个点维护其子节点的走法是否唯一,每次取最大的并且不为负的(停留次数-1)个子儿子权值,然后判断走法是否唯一 假如有子节点的权值为0,走法也不唯一 代码: #include<cstdio> #include<iostream> #include<algorithm> #include<vector> #include<cstring> using namesBZOJ4487 [Jsoi2015]染色问题
BZOJ4487 [Jsoi2015]染色问题 题目描述 传送门 题目分析 发现三个限制,大力容斥推出式子是\(\sum_{i=0}^{N}\sum_{j=0}^{M}\sum_{k=0}^{C}(-1)^{N+M+C-i-j-k}*(k+1)^{i*j}*\binom{N}{i}*\binom{M}{j}*\binom{C}{k}\) 由于数据范围较小,支持\(O(nmC)\)的做法。直接暴力预处理幂和组合