codeforces 632D. Longest Subsequence 筛法】的更多相关文章

题目链接 记录小于等于m的数出现的次数, 然后从后往前筛, 具体看代码. #include <iostream> #include <vector> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <map> #include <set> #include <string> #in…
D. Longest Subsequence time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output You are given array a with n elements and the number m. Consider some subsequence of a and the value of least common…
暴力. 虽然$a[i]$最大有${10^9}$,但是$m$最大只有${10^6}$,因此可以考虑暴力. 记$cnt[i]$表示数字$i$有$cnt[i]$个,记$p[i]$表示以$i$为倍数的情况下,最多能选出多少个数字. $p[i]$可以暴力计算出来,最后就是找到$p[i]$最大的$i$,然后输出答案. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<…
D. Longest Subsequence 题目连接: http://www.codeforces.com/contest/632/problem/D Description You are given array a with n elements and the number m. Consider some subsequence of a and the value of least common multiple (LCM) of its elements. Denote LCM a…
D - Longest Subsequence 思路:枚举lcm, 每个lcm的答案只能由他的因子获得,类似素数筛搞一下. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define pii pair<int,int> #define piii pair<int, pair<int,int> > usi…
D. Longest Subsequence time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output You are given array a with n elements and the number m. Consider some subsequence of a and the value of least common…
D. Longest Subsequence time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output You are given array a with n elements and the number m. Consider some subsequence of a and the value of least common…
[Codeforces 280D]k-Maximum Subsequence Sum(线段树) 题面 给出一个序列,序列里面的数有正有负,有两种操作 1.单点修改 2.区间查询,在区间中选出至多k个不相交的子区间,使得这至多k个子区间中数的和最大 分析 极其毒瘤的线段树,要维护18个变量 首先考虑查询k=1的情况,是常见的线段树模型.维护区间最大连续和,区间最大前缀和,区间最大后缀和.合并的时候分类讨论一下即可,这里不再赘述. 如果k>1怎么办呢.实际上可以贪心,每次取1个最大子区间,然后把子区…
[徐州网络赛]Longest subsequence 可以分成两个部分,前面相同,然后下一个字符比对应位置上的大. 枚举这个位置 用序列自动机进行s字符串的下标转移 注意最后一个字符 #include <bits/stdc++.h> const int maxn = 1e6 + 7; using namespace std; #define ll long long int n, m; char s[maxn], t[maxn]; int nex[maxn][27]; void init()…
You are given array a with n elements and the number m. Consider some subsequence of a and the value of least common multiple (LCM) of its elements. Denote LCM as l. Find any longest subsequence of a with the value l ≤ m. A subsequence of a is an arr…
[题目链接] 点击打开链接 [算法] 设取的所有数都是k的约数,则这些数的lcm必然不大于k. 对于[1, m]中的每个数,统计a中有多少个数是它的约数即可. [代码] #include<bits/stdc++.h> using namespace std; typedef long long ll; const ll MAXN = 1e6; ll i,j,tmp,num,maxx,n,m,res; ll a[MAXN+],sum[MAXN+],h[MAXN+]; vector<ll&g…
大意: 给定序列$a$, 求选出最长的一个子序列, 使得lcm不超过m. 刚开始想复杂了, 想着枚举gcd然后背包, 这样复杂度就是$O(\sum\limits_{i=1}^m \frac{m\sigma_0(i)}{i})$...... 估计了一下1e6大概只有1e8, 感觉剪个枝应该就可以过了, 打到最后才发现似乎不能输出方案... 看题解后发现就是个沙茶题, 直接枚举lcm即可. #include <iostream> #include <random> #include &…
原题传送门 E. Maximum Subsequence time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output You are given an array a consisting of n integers, and additionally an integer m. You have to choose some sequen…
题链: http://codeforces.com/problemset/problem/280/D 题解: 神题,巨恶心.(把原来的那个dp题升级为:序列带修 + 多次询问区间[l,r]内取不超过k段的不重叠子串,使得其和最大).按费用流的思路来看,建图方法如下: 每个点拆成两个点 i , i' ,建立超源 S和超汇 Ti -> i' : (1,a[i])S -> i  : (1,0)i'-> T  : (1,0)i'-> i+1: (1,0)那么对于某段区间,按照spfa最长路…
洛谷 Codeforces bzoj1,bzoj2 这可真是一道n倍经验题呢-- 思路 我首先想到了DP,然后矩阵,然后线段树,然后T飞-- 搜了题解之后发现是模拟费用流. 直接维护选k个子段时的最优解似乎也可以做,然而复杂度是O(nk2logn),显然跑不过. 考虑一种费用流做法.序列里每个点拆成入点和出点,源连入汇连出,入点和出点间连流量1费用ai的边,相邻点出点向入点连流量1费用0的边,整体限流k. 直接跑当然还不如暴力.观察一下这个做法是在干啥:每次选择费用最大的一段,然后利用反向边将这…
题目链接:http://codeforces.com/problemset/problem/5/C 题目大意:给出一串字符串只有'('和')',求出符合括号匹配规则的最大字串长度及该长度的字串出现的次数.解题思路:设dp[i]为到i的最大括号匹配,我们每次遇到一个'('就将其下标存入栈中,每次遇到')'就取出当前栈中里它最近的'('下标即栈顶t.不能直接dp[i]=i-t+1,比如(()()())这样的例子就会出错,应为dp[i]=dp[i-1]+i-t+1. 代码 #include<bits/…
题目链接:http://codeforces.com/problemset/problem/977/F 题意: 给定一个长度为 $n$ 的整数序列 $a[1 \sim n]$,要求你找到一个它最长的一个子序列,该子序列满足单调连续递增. 子序列可以不连续,单调连续递增即例如 $[4,5,6,7]$ 或者 $[6,7,8,9,10]$ 这样的. 题解: $f[i]$ 表示以 $a[i]$ 为结尾的最长连续递增子序列,那么要转移就需要找到 $[1,i-1]$ 这个区间内,某个满足 $a[j] = a…
888E - Maximum Subsequence 思路:折半枚举. 代码: #include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define mem(a,b) memset(a,b,sizeof(a)) ; int a[N]; set<int>s; int main() { ios::sync_with_stdio(false); cin.tie(); i…
题目描述 Petya loves lucky numbers very much. Everybody knows that lucky numbers are positive integers whose decimal record contains only the lucky digits 4 and 7. For example, numbers 47, 744, 4 are lucky and 5, 17, 467 are not. Petya has sequence aa co…
E. Maximum Subsequence time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output You are given an array a consisting of n integers, and additionally an integer m. You have to choose some sequence of…
This is yet another problem dealing with regular bracket sequences. We should remind you that a bracket sequence is called regular, if by inserting «+» and «1» into it we can get a correct mathematical expression. For example, sequences «(())()», «()…
题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=3836 (Codeforces) http://codeforces.com/contest/280/problem/D 题解 似乎是最广为人知的模拟费用流题目. 线段树维护DP可以做,但是合并的复杂度是\(O(k^2)\), 会TLE. 考虑做\(k\)次费用流,很容易建出一个图,中间的边容量都是1,求的是最大费用. 做费用流的过程,我们每次找一条最长路,然后将其增广,增…
题意: 一个数只含有4,7就是lucky数...现在有一串长度为n的数...问这列数有多少个长度为k子串..这些子串不含两个相同的lucky数... 子串的定义..是从这列数中选出的数..只要序号不同..就不不同的串..如 1 1 的长度为1的子串有两个 题解: 解题前可以先求一下1000000000内有多少个数是lucky的...可以递推的求..也可以暴力求~~可以看出最多1022个lucky数..很少... 现将这堆数的所有lucky数找出来...把相同的放在一个lucky数里计数... d…
用队列维护一下即可 #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; +; int n,k; int a[maxn]; +]; struct Node { int id; int val; } node[maxn]; queue<Node>Q; int main() { scanf("%d%d"…
题目链接 https://hihocoder.com/contest/hiho227/problem/1 题目详解 https://hihocoder.com/discuss/question/5587 #include <bits/stdc++.h> using namespace std; #define Max(a,b) ((a>b)?a:b) ; int n,ans; string s[N], S; int slen,Slen; ][], id[]; void init() {…
题目链接:戳我 一类典型模型.线段树模拟网络流+区间最大K段和. 因为不会写,所以参考了黄学长的博客.但是我觉得他说得不够详细,所以想好好地解释一下: 前置技能1:区间最大子段和 如果K=1的时候怎么办?大家可以去参考一下蒟蒻的这篇博客:戳我 前置技能2:最长K可重区间集问题 求最长K可重区间集的最大长度.这个是网络流能解决的问题,具体建模请看蒟蒻的这篇博客:戳我 但是我们发现如果用网络流来做的话,显然这道题的数据范围太大了,对于复杂度上届为\(O(n^2m)\)的网络流,不光说仅仅点数就有1e…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 记录每个数字出现的次数cnt[x]; (大于1e6的直接忽略) 另外用一个数组z[1e6] 然后for枚举x 第二层for枚举x的倍数(倍数不超过m) 即for (int i = x;i <=m;i+=x) z[i]+=cnt[x]; 这样z[i]就表示a[]中I的约数有多少个. 显然i也是这些约数的倍数. 我们无法确定i是这些数的最小公倍数. 但是我们可以找一个最大的z[i] 使得i最小. 这样i肯定就是这z[i]个约数的最小…
序列自动机跑s串 假设k为s和t相同的长度,初始时相同长度为0 取s串中大于t[i]的最左边的位置,用n-tmp+1+i-1更新答案,tmp是最左端的位置 然后去t[i]相等的位置,走到下一位,如果下一位的位置不存在或者在tmp的右边,跳出循环即可. 最后就是s串中找出了一个和t串相同的串,之后的长度只要不为0,也是可以用来更新答案的. #include <bits/stdc++.h> using namespace std; const int maxn=1e6+10; const int…
根据数据范围,暴力可以解决,对每一个串,找与其互为回文的串,或者判断自身是否为回文串,然后两两将互为回文的串排列在头尾,中间放且只能最多放一个自身为回文串的串,因为题目说每个串都是不同的 #include<bits/stdc++.h> using namespace std; #define lowbit(x) ((x)&(-x)) typedef long long LL; ]; ], self[], s[], chosen[]; void run_case() { int n, m…
对于答案来说,一定是 前 i-1 个字符和 t的前 i 个一样,然后第 i 个字符比 t的 大 \(i\in [1,m]\) 前缀为t,然后长度比t长 对于第一种情况,枚举这个 i ,然后找最小的 p 可以使得从\(s[1\sim p]\) 中产生\(t_1t_2\cdots t_{i-1}\) ,然后在\(s[p+1,n]\)中找最左边的比\(t[i]\) 大的字符,假如 找到了\(s[pos]\),那么后面的\(s[pos+1,n]\) 都可以加到答案后面(因为\(s[pos] > t[i]…