結果
| 問題 |
No.576 E869120 and Rings
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2017-11-27 22:51:15 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 2,547 bytes |
| コンパイル時間 | 1,613 ms |
| コンパイル使用メモリ | 108,328 KB |
| 実行使用メモリ | 12,012 KB |
| 最終ジャッジ日時 | 2024-11-27 11:26:54 |
| 合計ジャッジ時間 | 12,317 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 26 RE * 1 |
ソースコード
#define _USE_MATH_DEFINES
#include <cstdio>
#include <iostream>
#include <sstream>
#include <fstream>
#include <iomanip>
#include <algorithm>
#include <cmath>
#include <complex>
#include <string>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <bitset>
#include <numeric>
#include <limits>
#include <climits>
#include <cfloat>
#include <functional>
#include <iterator>
using namespace std;
class myDeque
{
private:
deque<pair<double, int> > dq;
double offset;
public:
myDeque(){
offset = 0.0;
}
void push_front(pair<double, int> a){
a.first -= offset;
dq.push_front(a);
}
void push_back(pair<double, int> a){
a.first -= offset;
dq.push_back(a);
}
pair<double, int> front(){
auto a = dq.front();
a.first += offset;
return a;
}
pair<double, int> back(){
auto a = dq.back();
a.first += offset;
return a;
}
void pop_front(){
dq.pop_front();
}
void pop_back(){
dq.pop_back();
}
bool empty(){
return dq.empty();
}
void addAll(double x){
offset += x;
}
};
bool check(const vector<double>& a, int k)
{
int n = a.size();
double sum = 0.0;
myDeque dq;
for(int i=k; i<n; ++i){
sum += a[i];
while(!dq.empty() && dq.back().first < sum)
dq.pop_back();
dq.push_back(make_pair(sum, i));
}
double val = 0.0;
for(int i=0; i<k; ++i)
val += a[i];
for(int i=0; i<n; ++i){
if(val + max(0.0, dq.front().first) >= 0.0)
return true;
val -= a[i];
val += a[(k+i)%n];
sum -= a[(k+i)%n];
sum += a[i];
dq.addAll(-a[(k+i)%n]);
if(dq.front().second == (k+i)%n)
dq.pop_front();
while(!dq.empty() && dq.back().first < sum)
dq.pop_back();
dq.push_back(make_pair(sum, i));
}
return false;
}
double solve(const string& s, int k)
{
int n = s.size();
double left = 0.0;
double right = 1.0;
for(int t=0; t<30; ++t){
double mid = (left + right) / 2.0;
vector<double> a(n);
for(int i=0; i<n; ++i)
a[i] = (s[i] - '0') - mid;
if(check(a, k))
left = mid;
else
right = mid;
}
return left;
}
int main()
{
int n, k;
string s;
cin >> n >> k >> s;
double ans = solve(s, k);
printf("%.10f\n", ans);
return 0;
}