题意: 给出一个移动序列,可以无效化一些指令,问可以移动到多少不同位置. 思路: 第一印象是统计左右指令数目,后来发现左右指令数目和即字符串长度. #include <bits/stdc++.h> using namespace std; int main() { int n;cin>>n; cout<<n+1<<endl; return 0; }…
contest链接:https://codeforces.com/contest/1285 A. Mezo Playing Zoma 签到 #include<iostream> #include<vector> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<queue> #include<map>…
题目链接:http://codeforces.com/contest/613/problem/D 题意概述: 给出一棵树,每次询问一些点,计算最少删除几个点可以让询问的点两两不连通,无解输出-1.保证询问的点总数不大于300000. 分析: 先考虑遍历的做法,统计每个点代表的子树中联通询问点的数量. 这个点不是询问点:如果有至少两个不同的子树中有询问点那么当前点一定被删除,因为这个时候不删除之后这两个点就是联通的:同时除了在更深的地方遇见第一种情况之外没有必要删除那些点:没有点不用管,只有一个点…
A略 直接求和最大的子序列即可(注意不能全部选中整个子序列) or #include<bits/stdc++.h> using namespace std; void solve(){ int n; cin>>n; vector<int> a(n); vector<long long> sum(n+1,0); for(int i=0;i<n;i++) scanf("%d",&a[i]); for(int i=1;i<=…
构造两颗深度为30的字典树(根节点分别是0和1),结点只有0和1,从根节点向下DFS,贪心取答案. #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; vector<int>a; int dfs(vector<int>b,int x){ ||b.size()==)//30位都枚举完毕或当前向量中没有数字就中止 ; vector<int>c,d; ;i<b.s…
题意: LCM(a, b) = X,求 max(a, b) 的最小值. 思路: a, b 只可能存在于 X 的因子中,枚举即可. #include <bits/stdc++.h> using namespace std; typedef long long ll; ll lcm(ll a,ll b){ return a*b/__gcd(a,b); } void solve(){ ll n;cin>>n; ll ans=1; for(ll i=1;i*i<=n;i++) if(…
题意: 一个长为n的序列,是否存在与原序列不同的连续子序列,其元素之和大于等于原序列. 思路: 从前.后分别累加,若出现非正和,除此累加序列外的子序列元素之和一定大于等于原序列. #include <bits/stdc++.h> using namespace std; typedef long long ll; bool solve(){ int n;cin>>n; int a[n];for(int &i:a) cin>>i; ll sum=0; for(in…
题意:给你一个正整数\(x\),找两个正整数\(a\),\(b\),使得\(lcm(a,b)=x\),并且\(max(a,b)\)最小. 题解:我们知道,\(lcm(a,b)=a*b/gcd(a,b)\),所以如果\(a\)和\(b\)不互质,那么\(a*b\)必然可以约去一个\(gcd(a,b)\),也就表示\(max(a,b)\)的值可以变得更小,所以我们要找的\(a\)和\(b\)必然要互质,即得到\(gcd(a,b)=1\),从而推出\(a*b=x\),所以我们可以直接枚举到\(\sqr…
题意:有一个长度为\(n\)的序列,找出最大的长度不为\(n\)的子段和,问最大子段和是否小于所有元素和. 题解:最大子段和我们可以直接用dp来找,每次状态转移为:\(dp[i]=max(dp[i-1]+a[i],a[i])\),而我们不能求长度为\(n\)的子段和,所以可以跑两次,从\([1,n-1]\)和\([2,n]\)维护一个最大值即可. 代码: int t; int n; ll a[N]; ll dp[N]; ll sum; int main() { //ios::sync_with_…
题意: 有一个每个单元标明移动方向的长为n的序列,每次移动不能超过距离k,问能够从0移动到n+1的k的最小值. 思路: k=最长连续L序列长度+1. #include <bits/stdc++.h> using namespace std; void solve(){ string s;cin>>s; int mx=1,n=s.size(); for(int i=0;i<n;i++){ int len=1; while(i<n&&s[i]=='L') +…