typedef long long ll;
ll pie(ll army){return (1ll<<army);}
#include "circus.h"
#include <bits/stdc++.h>
#define fr first
#define sc second
#define pb push_back
#define endl '\n'
#define mid ((left+right)>>1)
const ll inf=2000000000000000005;
const int sonsuz=2000000005;
using namespace std;
ll fpow(ll x,ll y,ll m=0){if(y<0){cout<<"powError";return -1;}if(m)x%=m;ll res=1;while(y>0){if(y&1)res*=x;x*=x;if(m){x%=m;res%=m;}y>>=1;}return res;}
struct Seg{
int n;
vector<int>arr,tree,lazy,razy,mn,mx;
void build(int node=1,int left=0,int right=-1){
if(right==-1)right=n-1;
tree[node]=sonsuz;
lazy[node]=-sonsuz;
razy[node]=sonsuz;
mn[node]=arr[left];
mx[node]=arr[right];
if(left==right)return;
build(node*2,left,mid);
build(node*2+1,mid+1,right);
}
void init(vector<int> Arr){
arr=Arr;
n=arr.size();
tree.resize(n<<2);
lazy.resize(n<<2);
razy.resize(n<<2);
mn.resize(n<<2);
mx.resize(n<<2);
build();
}
void push(int node,int left,int right){
if(lazy[node]!=-sonsuz){
tree[node]=min(tree[node],mn[node]-lazy[node]);
if(left!=right){
lazy[node*2]=max(lazy[node],lazy[node*2]);
lazy[node*2+1]=max(lazy[node],lazy[node*2+1]);
}
lazy[node]=-sonsuz;
}
if(razy[node]!=sonsuz){
tree[node]=min(tree[node],razy[node]-mx[node]);
if(left!=right){
razy[node*2]=min(razy[node],razy[node*2]);
razy[node*2+1]=min(razy[node],razy[node*2+1]);
}
razy[node]=sonsuz;
}
}
void comb(int node,int left,int right){
if(mn[node*2]==-23){
tree[node]=tree[node*2+1];
mn[node]=mn[node*2+1];
mx[node]=mx[node*2+1];
}
else if(mn[node*2+1]==-23){
tree[node]=tree[node*2];
mn[node]=mn[node*2];
mx[node]=mx[node*2];
}
else{
tree[node]=min(tree[node*2],tree[node*2+1]);
mn[node]=min(mn[node*2],mn[node*2+1]);
mx[node]=max(mx[node*2],mx[node*2+1]);
}
}
int l,r,tip,x;
void up(int node=1,int left=0,int right=-1){
if(right==-1)right=n-1;
if(left>=l&&right<=r){
if(tip){
razy[node]=min(razy[node],x);
}
else{
lazy[node]=max(lazy[node],x);
}
push(node,left,right);
return;
}
push(node,left,right);
if(left>r||right<l)return;
up(node*2,left,mid);
up(node*2+1,mid+1,right);
comb(node,left,right);
}
void update(int lef,int rig,int val,int tp){
l=lef;
r=rig;
x=val;
tip=tp;
up();
}
void dal(int node=1,int left=0,int right=-1){
if(right==-1)right=n-1;
push(node,left,right);
if(left==right){
arr[left]=-23;
mn[node]=-23;
return;
}
if(l>mid)dal(node*2+1,mid+1,right);
else dal(node*2,left,mid);
comb(node,left,right);
}
void sil(int tar){
l=tar;
dal();
}
int walk(int node=1,int left=0,int right=-1){
if(right==-1)right=n-1;
push(node,left,right);
if(left==right){
return left;
}
push(node*2,left,mid);
push(node*2+1,mid+1,right);
if((mn[node*2+1]!=-23&&tree[node*2+1]==tree[node])||mn[node*2]==-23){
return walk(node*2+1,mid+1,right);
}
else{
return walk(node*2,left,mid);
}
}
};
int n;
int arr[100001],need[100001],mn[400005],mx[400005];
Seg seg;
void build(int node=1,int left=0,int right=-1){
if(right==-1)right=n-1;
if(left==right){
mn[node]=arr[left]+need[left];
mx[node]=arr[left]-need[left];
return;
}
build(node*2,left,mid);
build(node*2+1,mid+1,right);
mx[node]=max(mx[node*2],mx[node*2+1]);
mn[node]=min(mn[node*2],mn[node*2+1]);
}
int mxwalk(int k,int node=1,int left=0,int right=-1){
if(right==-1)right=n-1;
if(left==right)return arr[left]-k;
if(mx[node*2]>=k)return mxwalk(k,node*2,left,mid);
return mxwalk(k,node*2+1,mid+1,right);
}
int mnwalk(int k,int node=1,int left=0,int right=-1){
if(right==-1)right=n-1;
if(mn[node]>k)return -sonsuz;
if(left==right)return k-arr[left];
if(mn[node*2+1]<=k)return mnwalk(k,node*2+1,mid+1,right);
return mnwalk(k,node*2,left,mid);
}
void init(int N,int M,int P[]){
n=N+1;
for(int i=0;i<N;i++){
arr[i]=P[i];
}
sort(arr,arr+N);
arr[n-1]=M;
vector<int>temp;
for(int i=0;i<N;i++)
temp.pb(arr[i]);
seg.init(temp);
seg.update(0,N-1,M,1);
for(int i=0;i<N;i++){
int pos=seg.walk();
need[pos]=seg.tree[1];
seg.sil(pos);
int l=-1,r=pos-1;
while(l<r){
int mi=(l+r+1)/2;
if(arr[pos]-arr[mi]>=need[pos])l=mi;
else r=mi-1;
}
if(l!=-1){
seg.update(0,l,arr[pos],1);
}
l=pos+1;r=N;
while(l<r){
int mi=(l+r)/2;
if(arr[mi]-arr[pos]>=need[pos])r=mi;
else l=mi+1;
}
if(l!=N){
seg.update(l,N-1,arr[pos],0);
}
}
build();
}
int minLength(int D){
return min(mnwalk(D),mxwalk(D));
}
컴파일 시 표준 에러 (stderr) 메시지
grader.cpp: In function 'int main()':
grader.cpp:16:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
16 | scanf("%d%d", &N, &M);
| ~~~~~^~~~~~~~~~~~~~~~
grader.cpp:18:22: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
18 | scanf("%d", &P[i]);
| ~~~~~^~~~~~~~~~~~~
grader.cpp:21:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
21 | scanf("%d", &Q);
| ~~~~~^~~~~~~~~~
grader.cpp:23:22: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
23 | scanf("%d", &d);
| ~~~~~^~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |