제출 #390683

#제출 시각아이디문제언어결과실행 시간메모리
390683cadmiumskyFountain (eJOI20_fountain)C++14
100 / 100
885 ms24176 KiB
#include <iostream>
#include <vector>

using namespace std;

vector<int> tree[100001];

int diam[100001],cap[100001];
int father[100001][18];
int stack[100001],spoz;
int nzbound[100001];

static void setcapa(int node, int b=-1) {
  nzbound[node]=b;
  //cout << cap[node] <<' ' << node << " capa\n"; 
  for(int child,i=0; i<tree[node].size();i++) {
    child=tree[node][i];
    cap[child]+=cap[node];
    setcapa(child,(b==-1?child:b));
  }
}

static inline int sum(int down,int up) {
  return cap[down]-cap[father[up][0]];
}

int main() {
  int n,q;
  cin >> n >> q;
  spoz=0;
  stack[0]=0;
  cap[0]=0;
  diam[0]=1000000001;
  for(int i=1,d,c; i<=n; i++) {
    cin >> d >> c;
    diam[i]=d;
    cap[i]=c;
  }
  for(int i=n,d; i>0; i--) {
    d=diam[i];
    //c=cap[i];
    while(diam[ stack[spoz] ]<=d)
      spoz--;
    father[i][0]=stack[spoz];
    //cout << i << ' '<< stack[spoz] <<'\n';
    tree[stack[spoz]].push_back(i);
    stack[++spoz]=i;
  }
  father[0][0]=0;
  for(int step=1; step<18; step++) {
    for(int i=0; i<=n; i++)
      father[i][step]=father[father[i][step-1]][step-1];
  }
  setcapa(0);
  for(int i=0,node,vol; i<q; i++) {
    cin >> node >> vol;
    //cout << node <<' ' << nzbound[node] <<' '<< sum(1,5) <<'\t';
    if(cap[node]<vol) {
      cout << "0\n";
      continue;
    }
    int currcapa=sum(node,node);
    if(currcapa>=vol) {
      cout << node << '\n';
      continue;
    }
    int bound=node,temp;
    for(int step=17; step>=0; step--) {
      temp=father[bound][step];
      if(temp==0)
        temp=nzbound[node];
      //cout <<"mama "<< node <<' ' << temp <<' ' << sum(node,temp) <<' '<< vol << '\n';
      if(sum(node,temp)<vol)
        bound=temp;
    } 
    cout <<  father[bound][0] << '\n';
  }
}

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

fountain.cpp: In function 'void setcapa(int, int)':
fountain.cpp:16:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   16 |   for(int child,i=0; i<tree[node].size();i++) {
      |                      ~^~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...