E. Maximum Matching 题目链接:https://codeforces.com/contest/1038/problem/E 题意: 给出n个项链,每条项链左边和右边都有一种颜色(范围1~4),然后每条项链都有对应的价值. 现在你可以任意改变项链的位置,也可以交换左右两边的颜色,问怎么做才能得到最大的价值.一条项链得到价值,就要求其左边的颜色和左边的项链右边颜色相等,并且右边的颜色和右边项链左边的颜色相等. 题解: 分析就可以发现这个题就是找一条权值最大的欧拉路径(每条边刚好经…
Codeforces Round #508 (Div. 2) http://codeforces.com/contest/1038 A #include<bits/stdc++.h> using namespace std; #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 #define IT set<node>::iterator #define sqr(x) ((x)*(x)) #define…
前几天给舍友讲这题的时候感觉挺有意思的,就贴上来吧... 题目链接:1038E - Maximum Matching 题目大意:有\(n\)个棒子,每个条两端有颜色\(c1,c2\)以及他的价值\(v\),要求选取若干个棒子拼接起来(要求连接处的颜色相同,棒子可以反转),求最大价值总和. 题解:设\(c1==c2\)的为同色棒子,反之为异色 可以发现偶数个异色棒子可以拼为一个长长的同色棒子,奇数个则可以拼为一个长长的异色棒子,因此可以预处理\(F[i][j]\)表示若将所有\((i,j)\)当做…
B. Maximum Submatrix 2 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/problem/375/B Description You are given a matrix consisting of digits zero and one, its size is n × m. You are allowed to rearrange its rows. What is…
B. Maximum Value Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/484/problem/B Description You are given a sequence a consisting of n integers. Find the maximum possible value of (integer remainder of ai divided by aj), whe…
D. Slime 题目链接:https://codeforces.com/contest/1038/problem/D 题意: 给出两个数,然后每次可以对相邻的两个数合并,比如x,y,那么合并过后就是x-y或者y-x,这里怎么去减是自己决定的.问怎么合并,最后得到的那个数最大. 题解: 这题主要关键就是发现,最后的式子呈现出来的状态,+.-这两个符号一定是两者都有的,至少存在一个(只有一个数时除外),并且状态覆盖了+.-所有的排列. 发现这个性质过后,贪心解一下就行了.我的做法就是模拟的方法,首…
http://codeforces.com/contest/281/problem/D 要求找出一个区间,使得区间内第一大的数和第二大的数异或值最大. 首先维护一个单调递减的栈,对于每个新元素a[i].要么直接插入后面,如果它插入栈内的某个元素的话.就是说有数字弹出来了,这个时候这个数字和a[i]组成的就是区间第一.第二大,9 8 5 4 3 2 1 7这样,最后那个7,弹出1,证明[7,8]这个区间第一.第二大的数字分别是1.和7,其他类似. 还有一个地方要注意的是: 要特别处理那些不能弹出的…
D. Maximum Value     You are given a sequence a consisting of n integers. Find the maximum possible value of  (integer remainder of ai divided byaj), where 1 ≤ i, j ≤ n and ai ≥ aj. Input The first line contains integer n — the length of the sequence…
题目链接: http://codeforces.com/contest/889/problem/C 题意: 给你 \(n\)和 \(k\). 让你找一种全排列长度为\(n\)的 \(p\),满足存在下标 \(i\),\(p_i\)大于所有 \(p_j\),\(j\epsilon[1,i-1]\)同时大于所有\(p_i\),\(j\epsilon[i+1,i+k]\).问你满足这样条件的排列有多少种? 题解: 设\(dp[i]\)表示以 \(i\) 结尾的,满足题目要求的\(1\) ~ \(i\)…
A. Maximum Square Ujan decided to make a new wooden roof for the house. He has…
F. Maximum Balanced Circle 题目链接 题意 给出\(n\)个数,现在要从中选出最多的数\(b_i,b_{i+1},\cdots,b_k\),将这些数连成一个环,要求两两相邻的数相差不超过1. 最后要求输出具体的方案. 题解 一开始想了一个dp,似乎也可以做 这个题也不用这么复杂,因为相差绝对值不超过1,直接统计一下每个数的个数就行了. 因为如果将最后的环给展开,以每个数的值为高,呈现出来的图形一定是先上升后下降的.那么中间部分的数的个数一定大于等于2,最左边和最右边的两…
Ujan decided to make a new wooden roof for the house. He has nn rectangular planks numbered from 11 to nn. The ii-th plank has size ai×1ai×1 (that is, the width is 11 and the height is aiai). Now, Ujan wants to make a square roof. He will first choos…
题目链接:https://codeforces.com/contest/1370/problem/A 题意 有 $n$ 个数大小分别为 $1$ 到 $n$,找出两个数间最大的 $gcd$ . 题解 若一个 $gcd$ 存在,则至少要有 $gcd$ 本身和 $2 \times gcd$,那么 $gcd$ 最大即为 $\lfloor \frac{n}{2} \rfloor$ . 代码 #include <bits/stdc++.h> using namespace std; void solve(…
题目链接:https://codeforces.com/problemset/problem/1365/E 题意 有 $n$ 个元素,定义大小为 $k$ 的集合值为 $\sum2^i$,其中,若集合内至少有 $max(1, k - 2)$ 个数二进制下第 $i$ 位为 $1$,则第 $i$ 位有效,求一个集合可以得到的最大值. 题解 每个 $k > 3$ 的集合的值一定小于等于 $k = 3$ 的子集合的值,所以枚举大小 $1 \sim 3$ 的集合即可. 证明 如果原集合中某一位有效,则至少在…
题目链接:https://codeforces.com/contest/1365/problem/C 题意 有两个大小为 $n$ 的排列,可以循环左移或右移任意次,问最多有多少对同一值在同一位置. 题解 计算两个排列中同一值相差的距离,取个数最多的那个即可. 代码 #include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; vector<int> id[n]; for (int…
题意:E.Maximum Subsequence Value 题意: 给你n 个元素,你挑选k个元素,那么这个 k 集合的值为 ∑2i,其中,若集合内至少有 max(1,k−2)个数二进制下第 i 位为 1,则第 i 位有效,求一个集合可以得到的最大值. 题解: 应该是一种贪心 当k==3的时候,那么也就相当于从n个元素中挑选出来三个数进行或操作即可.如果你选择k==4,那么就相当于在k==3的基础上进行与操作,那么这个结果只会小于等于k==3时候的答案. k==5之后的也是这样 代码: 1 #…
A. Maximum GCD 题意: t组输入,然后输入一个n,让你在区间[1,n]之间找出来两个不相等的数a,b.求出来gcd(a,b)(也就是a,b最大公约数).让你求出来最大的gcd(a,b)是多少. 题解: 最大gcd(a,b),那就是n/2向下取整的结果.因为如果gcd(a,b)越大,那么a/gcd(a,b)或者b/gcd(a,b)的值肯定越小,最小也就是2了,所以输出n/2就行 代码: 1 #include<stdio.h> 2 #include<algorithm>…
C: C - Gambling 给你两个数列  每一回合A可以选择从第一个序列里面选一个数或者清除第二个序列里面选一个数 同理B能从第二序列里面选数或者清除第一个序列里面一个数 然后 求A所选的数之和-B所选数之和最大 贪心就行 两个优先队列每次比较另外一个序列最大的数是比自己序列最大的数大还是小 大就删除另一个序列的数 小就加上自己序列最大的数 可能会爆int  QAQ #include<bits/stdc++.h> using namespace std; #define LL long…
贪心的选取最优解 然后相减好 记得要开long long #include <cstdio> #include <algorithm> #include <cstring> #include <set> #include <queue> #define int long long using namespace std; ,ansb=,posa=,posb=,n,a[],b[]; bool cmp(int a,int b){ if(a>b)…
按照题意构造集合即可 注意无解情况的判断 #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #include <vector> #include <map> using namespace std; int n,sum; int main(){ scanf("%d",&n); ){ printf("…
依照题意暴力模拟即可A掉 #include <cstdio> #include <algorithm> #include <cstring> #include <set> using namespace std; ]; ]; int main(){ scanf("%d %d",&n,&k); scanf(); ;i<=n;i++) barrel[s[i]-]++; int ans=0x3f3f3f3f; ;i<…
就是一种筛法思想的应用. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<cmath> #include<map> #include<set> #include<vector> #include<algorithm> #include<…
写在前面 此题数据量居然才出到\(n=40\)???(黑人问号)以下给出一个串长\(|S|=100,n=10^9\)的题解. 题目描述 给一个长度不超过\(m\)的01串S,问有多少个长度不超过\(n\)的01串,使得首尾接起来形成的字符串环中至少出现一次\(S\)? 数据规模:\(m \le 100, n \le 10^9\). 简要题解 若\(n<m\)显然答案为0. 对\(|S|\)建自动机.枚举长度为\(n\)的串最后匹配到哪个状态,那么我们就从这个状态出发,求长度为\(n\)的不经过结…
#include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f3f3f #define int long long ]; signed main(){ int n,k; cin>>n>>k; string str; cin>>str; map<int,int> mp; ; ;i<str.size();i++){ if(!mp[str[i]-'A']){ mp[str[i…
题目链接 题目大意 给你一课树,要你给每一条边分权值,每条边的权值大于0,他们的乘积等于k,而且要使得n-1条边1的数量尽可能少,定义 f(u,v)为u到v的边权和求 \(\max \sum_{i=1}^{i=n}\sum_{j=1}^{j=n} f(i,j)\) k为m个质因子的乘积 题目思路 这显然是一个求贡献的裸题,但是里面有易错点 1:sort前不要先取模 2:还有要区分m可能比n-1大(太坑了 代码 #include<set> #include<map> #include…
题意: n 个点 n - 1 条边的树,问每个点所在所有子树中白黑点数目的最大差. 思路: 白点先由下至上汇集,后由上至下分并. #include <bits/stdc++.h> using namespace std; const int M=220000; vector<vector<int>> e(M); int n,a[M]; void dfs1(int u,int pre){ for(int v:e[u]){ if(v!=pre){ dfs1(v,u); a[…
题意: t组输入,每组数据中n个节点构成一棵树,然后给你n-1条边.给你一个m,然后给你m个k的素数因子,你需要给这n-1条边都赋一个权值,这n-1条边的权值之积应该等于k.如果k的素数因子数量小于n-1,那可以使用1来填充 然后我们定义F(x,y)为节点x到节点y的路径上所有边的和 我们要求出来所有任意两点之间的F(x,y),然后把所有F(x,y)加起来输出,求最大结果是多少,结果取余1e9+7 题解: 因为我们要使 这个尽可能大,所以肯定要按那一条边使用次数最多,我们就把最大那个素数因子给这…
题意:给你含有\(n\)个节点,\(n-1\)条边的树,以及\(m\)个质数和\(1\),你需要在这\(m\)个质数和一个\(1\)选择数(质数只能选一次,\(1\)可以多选)给\(n-1\)条边赋值,求所有简单路径的边权和. 题解:很简单,对于每条边,我们看它左右有多少个点,右边有多少点,左边点数x右边点数就是包含这条边的简单路径数,也就是说这条边权要计算的次数,我们一定会把最大的边权赋给简单路径数最多的边,所以我们可以直接dfs求每个点的子节点个数\(son[u]\)(右边的点数),那么\(…
题意:给你一个长度为奇数\(n\)的序列.你可以对任意元素加上\(k\)次\(1\),求操作后的中位数最大. 题解:先对序列进行排序,然后对中位数相加,如果中位数和后面的元素相等,就对后面所有和当前中位数相等的元素++,然后再对中位数++,不断往复这个过程就好了,具体看代码. 代码: int n; ll k; ll a[N]; ll cnt[N]; int main() { ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); cin>>n&g…
题意:有一长度为\(n\)的序列,求其中任意五个元素乘积的最大值. 题解:先排序,然后乘积能是正数就搞正数,模拟一下就好了. 代码: int t; ll n; ll a[N]; int main() { ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); cin>>t; while(t--){ cin>>n; for(int i=1;i<=n;++i){ cin>>a[i]; } sort(a+1,a+1+n);…