拍照和删减
算法拍照
bi=ai+ai+1可以推出bi+1 - bi = ai+2 - ai,但是这个公式推导只能计算出奇数个数的序列,仔细观察就可以发现枚举第一个数,从1~n枚举就可以枚举所有情况,并不需要考虑字典序排列,因为从小到大枚举并且每个数都是唯一的,所以一定是字典序最小序列。
判断条件的时候考虑:①他已经枚举过了②他是个负数。
拍照II
最优解:①已经处于正确位置的奶牛不要动;②如果奶牛要移动,先移动和后移动的结果是一样的;③从前往后将位置对齐,所以一旦移到正确的位置就不要管了,置0即可。
1234567891011121314151617for(int i = 1; i <= n; i ++) { cin >> a[i]; p[a[i]] = i; } for(int i = 1; i <= n; i ++) cin >> b[i]; int res = 0; //j是代表正确位置序列的下标,向j看齐 for(int i = 1, j = 1; j <= ...
树状数组和逆序对
算法
树状数组求逆序对1234567891011121314151617181920212223242526272829303132#include<bits/stdc++.h>#define lowbit(x) x&(-x)using namespace std;typedef long long ll;const int maxn=2e5+10;int sum[maxn],cnt=maxn-1;void add( int x ) { for(int i = x; i <= n; i += lowbit(i)) sum[i] += 1;}int query( int x ) { int ans = 0; for(int i = x; i; i -= lowbit(i)) ans += sum[i]; return ans;} int main(){ int n; cin>>n; ll ans=0; for( int i= ...
字母和棋盘问题
乘积最大字母
使用dfs时可以把答案放在dfs的参数中,也可以将dfs的返回值作为结果。
当dfs有返回值时,应该首先明白这个返回值代表的是什么意思。
1234567891011121314151617181920212223242526272829303132333435363738#include<iostream>#include<set>using namespace std;const int N = 25;int n, m;char g[N][N];set<char> s;int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};int dfs(int x, int y) { int res = 0; for(int i = 0; i < 4; i ++) { int a = x + dx[i], b = y + dy[i]; if(a < 0 || a >= n || b < ...
atcoder-c和虫食算
atcoder-C
(i + cnt) % m = x - 1,i表示一开始的下标,x表示要求的第几个元素,m表示字符串大小,所以我们只需要求出i值即可。然后因为i < m,cnt < m,所以i+cnt < 2m,所以i = (x + m - 1 - cnt) % m。
优雅 ~
12345678910111213141516171819202122232425262728#include<iostream>#include<cstring>#include<algorithm>using namespace std;int n, q;string s;int main() { cin >> n >> q; cin >> s; int cnt = 0; int m = s.size(); while(q --) { int k, x; scanf("%d%d", &k, & ...



