結果
| 問題 |
No.576 E869120 and Rings
|
| コンテスト | |
| ユーザー |
TangentDay
|
| 提出日時 | 2017-10-14 02:56:42 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 1,113 ms / 1,500 ms |
| コード長 | 1,784 bytes |
| コンパイル時間 | 1,102 ms |
| コンパイル使用メモリ | 95,992 KB |
| 実行使用メモリ | 43,272 KB |
| 最終ジャッジ日時 | 2024-11-17 12:47:35 |
| 合計ジャッジ時間 | 24,097 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 27 |
ソースコード
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <algorithm>
#include <random>
using namespace std;
#define REP(i,n) for(int i=0; i<n; ++i)
#define FOR(i,a,b) for(int i=a; i<=b; ++i)
#define FORR(i,a,b) for (int i=a; i>=b; --i)
#define ALL(c) (c).begin(), (c).end()
typedef long long ll;
typedef vector<int> VI;
typedef vector<ll> VL;
typedef vector<VL> VVL;
typedef vector<VI> VVI;
typedef pair<int,int> P;
typedef pair<ll,ll> PL;
void slide_min(vector<double> &a, int k, vector<double> & ret){
deque<double> dq;
REP(i,a.size()){
while (!dq.empty() && a[dq.back()] >= a[i]) dq.pop_back();
dq.push_back(i);
if (i - k + 1 >= 0){
ret.push_back(a[dq.front()]);
if (dq.front() == i - k + 1) dq.pop_front();
}
}
}
bool check(vector<double> &a, int k){
int n = a.size() / 2;
vector<double> b(2*n+1);
REP(i,2*n) b[i+1] += b[i] + a[i];
vector<double> mi;
slide_min(b, n - k + 1, mi);
// REP(i,2*n+1) cout << b[i] << " ";
// cout << endl;
// REP(i,n) cout << mi[i] << " ";
// cout << endl;
REP(i,n) if (mi[i] <= b[n+i]) return true;
return false;
}
int main() {
int n, k;
string s;
cin >> n >> k;
cin >> s;
// cout << 0 << endl;
// return 0;
vector<double> a(n);
REP(i,n) a[i] = s[i] - '0';
REP(i,n) a.push_back(a[i]);
double ok = 0.0, ng = 1.0;
REP(_,30){
vector<double> b(a);
double mi = (ok + ng) / 2.0;
REP(i,2*n) b[i] -= mi;
if (check(b, k)) ok = mi;
else ng = mi;
}
printf("%.10f\n", ok);
return 0;
}
TangentDay