# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1228232 | salmon | Sparklers (JOI17_sparklers) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
int N,K;
long long int T;
int lst[100100];
int m;
bool zero;
pair<long long int, long long int> ii;
pair<long long int, long long int> ii1;
int it;
int it1;
void propit(){
if(it == N + 1){
ii = {-1,-1};
return;
}
zero = false;
ii = {0,0};
while(it != N + 1 && (!zero || ii.first < 0)){
zero = true;
ii.first += - (lst[it] - lst[it - 1]) + T * m;
ii.second = min(ii.first,ii.second);
it++;
}
}
void propit1(){
if(it1 == 0){
ii1 = {-1,-1};
return;
}
zero = false;
ii1 = {0,0};
while(it1 != 0 && (!zero || ii1.first < 0)){
zero = true;
ii1.first += - (lst[it1 + 1] - lst[it1]) + T * m;
ii1.second = min(ii1.first,ii1.second);
it1--;
}
}
void properit(){
if(it == K + 1){
ii = {-1,-1};
return;
}
zero = false;
ii = {0,0};
while(it != K + 1 && (!zero || ii.first < 0)){
zero = true;
ii.first += (lst[it] - lst[it - 1]) - T * m;
ii.second = min(ii.first,ii.second);
it++;
}
}
void properit1(){
if(it1 == K - 1){
ii1 = {-1,-1};
return;
}
zero = false;
ii1 = {0,0};
while(it1 != K - 1 && (!zero || ii1.first < 0)){
zero = true;
ii1.first += (lst[it1 + 1] - lst[it1]) - T * m;
ii1.second = min(ii1.first,ii1.second);
it1--;
}
}
int main(){
scanf(" %d",&N);
scanf(" %d",&K);
scanf(" %lld",&T);
for(int i = 1; i <= N; i++) scanf(" %d",&lst[i]);
int s = 0;
int e = 1e9;
while(s != e){
int m = (s + e)/2;
m *= 2;
::m = m;
__int128 cesh = T * m;
bool zero = false;
int l = K;
int r = K;
it = K + 1;
it1 = K - 1;
propit();
propit1();
while(l != 1 || r != N){
if(max(ii.first,ii1.first) < 0) break;
if(cesh + max(ii.second,ii1.second) - T * m < 0) break;
if(cesh + min(ii.second,ii1.second) - T * m > 0){
if(max(ii.first,ii1.first) == ii.first){
cesh += ii.first;
r = it - 1;
propit();
}
else{
cesh += ii.second;
l = it1 + 1;
propit1();
}
}
else{
if(max(ii.second,ii1.second) == ii.second){
if(ii.first < 0) break;
cesh += ii.first;
r = it - 1;
propit();
}
else{
if(ii1.first < 0) break;
cesh += ii1.first;
l = it1 + 1;
propit1();
}
}
}
cesh = T * m;
cesh *= (N - 1);
cesh += - lst[N];
int fl = 1;
int fr = N;
it = 2;
it1 = N - 1;
properit();
properit1();
while(fl != K || fr != K){
if(max(ii.first,ii1.first) < 0) break;
if(cesh + max(ii.second,ii1.second) < 0) break;
if(cesh + min(ii.second,ii1.second) > 0){
if(max(ii.first,ii1.first) == ii.first){
cesh += ii.first;
fl = it - 1;
properit();
}
else{
cesh += ii.second;
fr = it1 + 1;
properit1();
}
}
else{
if(max(ii.second,ii1.second) == ii.second){
if(ii.first < 0) break;
cesh += ii.first;
fl = it - 1;#include <bits/stdc++.h>
using namespace std;
int N,K;
long long int T;
int lst[100100];
int m;
bool zero;
pair<long long int, long long int> ii;
pair<long long int, long long int> ii1;
int it;
int it1;
void propit(){
if(it == N + 1){
ii = {-1,-1};
return;
}
zero = false;
ii = {0,0};
while(it != N + 1 && (!zero || ii.first < 0)){
zero = true;
ii.first += - (lst[it] - lst[it - 1]) + T * m;
ii.second = min(ii.first,ii.second);
it++;
}
}
void propit1(){
if(it1 == 0){
ii1 = {-1,-1};
return;
}
zero = false;
ii1 = {0,0};
while(it1 != 0 && (!zero || ii1.first < 0)){
zero = true;
ii1.first += - (lst[it1 + 1] - lst[it1]) + T * m;
ii1.second = min(ii1.first,ii1.second);
it1--;
}
}
void properit(){
if(it == K + 1){
ii = {-1,-1};
return;
}
zero = false;
ii = {0,0};
while(it != K + 1 && (!zero || ii.first < 0)){
zero = true;
ii.first += (lst[it] - lst[it - 1]) - T * m;
ii.second = min(ii.first,ii.second);
it++;
}
}
void properit1(){
if(it1 == K - 1){
ii1 = {-1,-1};
return;
}
zero = false;
ii1 = {0,0};
while(it1 != K - 1 && (!zero || ii1.first < 0)){
zero = true;
ii1.first += (lst[it1 + 1] - lst[it1]) - T * m;
ii1.second = min(ii1.first,ii1.second);
it1--;
}
}
int main(){
scanf(" %d",&N);
scanf(" %d",&K);
scanf(" %lld",&T);
for(int i = 1; i <= N; i++) scanf(" %d",&lst[i]);
int s = 0;
int e = 1e9;
while(s != e){
int m = (s + e)/2;
m *= 2;
::m = m;
__int128 cesh = T * m;
bool zero = false;
int l = K;
int r = K;
it = K + 1;
it1 = K - 1;
propit();
propit1();
while(l != 1 || r != N){
if(max(ii.first,ii1.first) < 0) break;
if(cesh + max(ii.second,ii1.second) - T * m < 0) break;
if(cesh + min(ii.second,ii1.second) - T * m > 0){
if(max(ii.first,ii1.first) == ii.first){
cesh += ii.first;
r = it - 1;
propit();
}
else{
cesh += ii.second;
l = it1 + 1;
propit1();
}
}
else{
if(max(ii.second,ii1.second) == ii.second){
if(ii.first < 0) break;
cesh += ii.first;
r = it - 1;
propit();
}
else{
if(ii1.first < 0) break;
cesh += ii1.first;
l = it1 + 1;
propit1();
}
}
}
cesh = T * m;
cesh *= (N - 1);
cesh += - lst[N];
int fl = 1;
int fr = N;
it = 2;
it1 = N - 1;
properit();
properit1();
while(fl != K || fr != K){
if(max(ii.first,ii1.first) < 0) break;
if(cesh + max(ii.second,ii1.second) < 0) break;
if(cesh + min(ii.second,ii1.second) > 0){
if(max(ii.first,ii1.first) == ii.first){
cesh += ii.first;
fl = it - 1;
properit();
}
else{
cesh += ii.second;
fr = it1 + 1;
properit1();
}
}
else{
if(max(ii.second,ii1.second) == ii.second){
if(ii.first < 0) break;
cesh += ii.first;
fl = it - 1;
properit();
}
else{
if(ii1.first < 0) break;
cesh += ii1.first;
fr = it1 + 1;
properit1();
}
}
}
//printf("%d %d %d %d %d\n\n",l,r,fl,fr,m/2);
m/= 2;
if(l <= fl && fr <= r){
e = m;
}
else s = m + 1;
}
printf("%d\n",s);
}
properit();
}
else{
if(ii1.first < 0) break;
cesh += ii1.first;
fr = it1 + 1;
properit1();
}
}
}
//printf("%d %d %d %d %d\n\n",l,r,fl,fr,m/2);
m/= 2;
if(l <= fl && fr <= r){
e = m;
}
else s = m + 1;
}
printf("%d\n",s);
}
#include <bits/stdc++.h>
using namespace std;
int N,K;
long long int T;
int lst[100100];
int m;
bool zero;
pair<long long int, long long int> ii;
pair<long long int, long long int> ii1;
int it;
int it1;
void propit(){
if(it == N + 1){
ii = {-1,-1};
return;
}
zero = false;
ii = {0,0};
while(it != N + 1 && (!zero || ii.first < 0)){
zero = true;
ii.first += - (lst[it] - lst[it - 1]) + T * m;
ii.second = min(ii.first,ii.second);
it++;
}
}
void propit1(){
if(it1 == 0){
ii1 = {-1,-1};
return;
}
zero = false;
ii1 = {0,0};
while(it1 != 0 && (!zero || ii1.first < 0)){
zero = true;
ii1.first += - (lst[it1 + 1] - lst[it1]) + T * m;
ii1.second = min(ii1.first,ii1.second);
it1--;
}
}
void properit(){
if(it == K + 1){
ii = {-1,-1};
return;
}
zero = false;
ii = {0,0};
while(it != K + 1 && (!zero || ii.first < 0)){
zero = true;
ii.first += (lst[it] - lst[it - 1]) - T * m;
ii.second = min(ii.first,ii.second);
it++;
}
}
void properit1(){
if(it1 == K - 1){
ii1 = {-1,-1};
return;
}
zero = false;
ii1 = {0,0};
while(it1 != K - 1 && (!zero || ii1.first < 0)){
zero = true;
ii1.first += (lst[it1 + 1] - lst[it1]) - T * m;
ii1.second = min(ii1.first,ii1.second);
it1--;
}
}
int main(){
scanf(" %d",&N);
scanf(" %d",&K);
scanf(" %lld",&T);
for(int i = 1; i <= N; i++) scanf(" %d",&lst[i]);
int s = 0;
int e = 1e9;
while(s != e){
int m = (s + e)/2;
m *= 2;
::m = m;
__int128 cesh = T * m;
bool zero = false;
int l = K;
int r = K;
it = K + 1;
it1 = K - 1;
propit();
propit1();
while(l != 1 || r != N){
if(max(ii.first,ii1.first) < 0) break;
if(cesh + max(ii.second,ii1.second) - T * m < 0) break;
if(cesh + min(ii.second,ii1.second) - T * m > 0){
if(max(ii.first,ii1.first) == ii.first){
cesh += ii.first;
r = it - 1;
propit();
}
else{
cesh += ii.second;
l = it1 + 1;
propit1();
}
}
else{
if(max(ii.second,ii1.second) == ii.second){
if(ii.first < 0) break;
cesh += ii.first;
r = it - 1;
propit();
}
else{
if(ii1.first < 0) break;
cesh += ii1.first;
l = it1 + 1;
propit1();
}
}
}
cesh = T * m;
cesh *= (N - 1);
cesh += - lst[N];
int fl = 1;
int fr = N;
it = 2;
it1 = N - 1;
properit();
properit1();
while(fl != K || fr != K){
if(max(ii.first,ii1.first) < 0) break;
if(cesh + max(ii.second,ii1.second) < 0) break;
if(cesh + min(ii.second,ii1.second) > 0){
if(max(ii.first,ii1.first) == ii.first){
cesh += ii.first;
fl = it - 1;
properit();
}
else{
cesh += ii.second;
fr = it1 + 1;
properit1();
}
}
else{
if(max(ii.second,ii1.second) == ii.second){
if(ii.first < 0) break;
cesh += ii.first;
fl = it - 1;
properit();
}
else{
if(ii1.first < 0) break;
cesh += ii1.first;
fr = it1 + 1;
properit1();
}
}
}
//printf("%d %d %d %d %d\n\n",l,r,fl,fr,m/2);
m/= 2;
if(l <= fl && fr <= r){
e = m;
}
else s = m + 1;
}
printf("%d\n",s);
}