codeforces round 421 div2 補題 CF 820 A-E

Mister B and Book Reading ios

O(n)暴力便可c++

#include<bits/stdc++.h> 
using namespace std;
typedef long long int LL;
const LL N=1,M=1,MOD=1;





int main()
{//freopen("t.txt","r",stdin);
 int c,v0,v1,a,l;
 scanf("%d%d%d%d%d",&c,&v0,&v1,&a,&l);
 int nv=0,nr=v0;
 int ans=0;
 while(nv<c)
 	{
 	 nv+=v0;
 	 ans++;
	 if(nv>=c){printf("%d\n",ans);return 0;}
	 v0+=a;
	 v0=min(v0,v1);
	 nv-=l;
	 nv=max(0,nv);	
	}
 return 0;
}

Mister B and Angle in Polygon算法

把正n邊形放到圓內看,每一個邊的圓周角是相等的。剩下的,你們都懂。spa

作了這麼多年題第一次碰到考平面幾何的。。。。code

 

#include <iostream>

int main(){
  int N,A;
  std::cin>>N>>A;
  std::cout<<"2 1 "<<std::max(3,std::min(N,(N*A+90)/180+2))<<std::endl;
  return 0;
}

 

  

 

Mister B and Boring Gameblog

又是一道BUG題 老哥走點心吧。。 略過ci

#include <stdio.h>
#include <algorithm>
using namespace std;

int a, b, st, en;

int tag(int k) {
	int rlt = (k - 1) / (a + b);
	if ((k - 1) % (a + b) < a) return rlt * 2 + 1;
	return rlt * 2 + 2;
}

int solve(int st, int en) {
	int u = tag(st), v = tag(en);
	if (v > u + 4) return max(a + 1, 2 * a - b);
	if (v == u) return u & 1 ? en - st + 1 : 1;
	if (v == u + 1) return u & 1 ? a - ((st - 1) % (a + b)) : ((en - 1) % (a + b)) + 2;
	if (v == u + 2) {
		int x = a - ((st - 1) % (a + b)), y = (en - 1) % (a + b) + 1;
		return u & 1 ? max(min(x + y, a), max(x, y + min(x, a - b))) : a + 1;
	}
	return max(solve(a * (tag(st) & 1) + 1 + (a + b) * (tag(st) >> 1), en), solve(st, (a + b) * ((tag(en) - 1) >> 1) + a * ((tag(en) - 1) & 1)));
}

int main() {
	scanf("%d %d %d %d", &a, &b, &st, &en);
	printf("%d\n", solve(st, en));
	return 0;
}

  

Mister B and PR Shiftsget

考慮對於每個數能夠預知在右移某些步數的範圍內使答案變好,其他範圍使答案不變或者變差,因而能夠用線段樹維護,而後求和。it

可是n有100w  時限只有2s O(nlogn)可能超時 應該有O(n)的算法。io

因爲在詢問以前給出了全部數值信息,即不需動態維護線段。

因此用線段樹是大材小用了,直接維護便可。複雜度O(n)注意邊界狀況要特殊判斷。

#include <bits/stdc++.h>

using namespace std;

int n, ta, tb, md;
long long mi = LLONG_MAX, cur, cs, dx[2000005], add[2000005];

int main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &ta);
		cur += abs(ta - i);
		dx[(ta - i + n) % n] += 2;
		dx[(1 - i + n) % n] -= 2;
		add[n-i] += abs(ta - 1) - (abs(ta - n) + 1);
		if ((1 - i + n) % n <= (ta - i + n) % n)
			cs++;
		else
			cs--;
	}
	for (int i = 0; i < n; i++) {
		if (cur < mi)
			mi = cur, md = i;
		cs += dx[i];
		cur += cs + add[i];
	}
	printf("%lld %d\n", mi, md);
	return 0;
}

  

Mister B and Beacons on Field

相關文章
相關標籤/搜索