제출 #120162

#제출 시각아이디문제언어결과실행 시간메모리
120162KLPPTwo Antennas (JOI19_antennas)C++14
35 / 100
3026 ms43664 KiB
#include<bits/stdc++.h>

using namespace std;
typedef long long int lld;
typedef pair<lld,lld> pii;
#define rep(i,a,b) for(int i=a;i<b;i++)
#define trav(a,v) for(auto a:v)
int n;
lld h[1000000];
lld a[1000000];
lld b[1000000];
lld answer[3000][3000];
lld Max(lld a, lld b){
  if(a==-1)return b;
  if(b==-1)return a;
  return max(a,b);
}
lld Min(lld a, lld b){
  if(a==-1)return b;
  if(b==-1)return a;
  return min(a,b);
}
class ST{
  lld tree1[1000000];
  lld tree2[1000000];
public:
  void build(int a, int b, int node){
    tree1[node]=-1;
    tree2[node]=-1;
    if(a==b)return;
    int mid=(a+b)/2;
    build(a,mid,2*node);
    build(mid+1,b,2*node+1);
  }
  void update(int a, int b, int node, int pos, lld val){
    if(pos<a || b<pos)return;
    if(a==b){
      tree1[node]=val;
      tree2[node]=val;
      return;
    }
    int mid=(a+b)/2;
    update(a,mid,2*node,pos,val);
    update(mid+1,b,2*node+1,pos,val);
    tree1[node]=Max(tree1[2*node],tree1[2*node+1]);
    tree2[node]=Min(tree2[2*node],tree2[2*node+1]);
  }
  lld QMax(int a, int b, int node, int x, int y){
    if(b<x || y<a)return -1;
    if(x<=a && b<=y)return tree1[node];
    int mid=(a+b)/2;
    return Max(QMax(a,mid,2*node,x,y),QMax(mid+1,b,2*node+1,x,y));
  }
  lld QMin(int a, int b, int node, int x, int y){
    if(b<x || y<a)return -1;
    if(x<=a && b<=y)return tree2[node];
    int mid=(a+b)/2;
    return Min(QMin(a,mid,2*node,x,y),QMin(mid+1,b,2*node+1,x,y));
  }
};
int main(){
  scanf("%d",&n);
  rep(i,0,n){
    scanf("%lld %lld %lld",&h[i],&a[i],&b[i]);
  }
  if(n<=2000){
    ST *S=new ST();
    rep(i,1,n+1){
      S->build(1,n,1);
      vector<pii> v;
      rep(j,i,n+1){
	v.push_back(pii(j+a[j-1],j));
	v.push_back(pii(j+b[j-1]+1,-j));
      }
      sort(v.begin(),v.end());
      int ptr=0;
      lld ans=-1;
      //cout<<i<<endl;
      rep(j,i,n+1){
	while(ptr<v.size() && v[ptr].first<=j){
	  //cout<<"U"<<v[ptr].second<<" "<<v[ptr].first<<endl;
	  if(v[ptr].second>0){
	    S->update(1,n,1,v[ptr].second,h[v[ptr].second-1]);
	  }else{
	    S->update(1,n,1,-v[ptr].second,-1);
	  }
	  ptr++;
	}
	lld m,M;
      
      
	m=S->QMin(1,n,1,j-b[j-1],j-a[j-1]);
	M=S->QMax(1,n,1,j-b[j-1],j-a[j-1]);
	//cout<<m<<" "<<M<<endl;
	if(m!=-1)ans=max(ans,h[j-1]-m);
	if(M!=-1)ans=max(ans,M-h[j-1]);
	answer[i][j]=ans;
	//cout<<"A"<<answer[i][j]<<" "<<i<<" "<<j<<endl;
      }
    }
    int q;
    scanf("%d",&q);
    while(q--){
      //cout<<"A"<<endl;
      int l,r;
      scanf("%d %d",&l,&r);
      printf("%lld\n",answer[l][r]);
    }
    return 0;
  }
  ST *S=new ST();
  int q;
  scanf("%d",&q);
  while(q--){
    int l,r;
    scanf("%d %d",&l,&r);
    S->build(1,n,1);
    vector<pii> v;
    rep(i,l,r+1){
      v.push_back(pii(i+a[i-1],i));
      v.push_back(pii(i+b[i-1]+1,-i));
    }
    sort(v.begin(),v.end());
    int ptr=0;
    lld ans=-1;
    rep(i,l,r+1){
      while(ptr<v.size() && v[ptr].first<=i){
	if(v[ptr].second>0){
	  S->update(1,n,1,v[ptr].second,h[v[ptr].second-1]);
	}else{
	  S->update(1,n,1,-v[ptr].second,-1);
	}
	ptr++;
      }
      lld m,M;
      
      
      m=S->QMin(1,n,1,i-b[i-1],i-a[i-1]);
      M=S->QMax(1,n,1,i-b[i-1],i-a[i-1]);
      //cout<<m<<" "<<M<<endl;
      if(m!=-1)ans=max(ans,h[i-1]-m);
      if(M!=-1)ans=max(ans,M-h[i-1]);
    }
    printf("%lld\n",ans);
  }
  return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

antennas.cpp: In function 'int main()':
antennas.cpp:80:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  while(ptr<v.size() && v[ptr].first<=j){
        ~~~^~~~~~~~~
antennas.cpp:127:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       while(ptr<v.size() && v[ptr].first<=i){
             ~~~^~~~~~~~~
antennas.cpp:62:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d",&n);
   ~~~~~^~~~~~~~~
antennas.cpp:64:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%lld %lld %lld",&h[i],&a[i],&b[i]);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
antennas.cpp:102:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d",&q);
     ~~~~~^~~~~~~~~
antennas.cpp:106:12: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
       scanf("%d %d",&l,&r);
       ~~~~~^~~~~~~~~~~~~~~
antennas.cpp:113:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d",&q);
   ~~~~~^~~~~~~~~
antennas.cpp:116:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d",&l,&r);
     ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...