제출 #419556

#제출 시각아이디문제언어결과실행 시간메모리
419556AugustinasJucas말 (IOI15_horses)C++14
컴파일 에러
0 ms0 KiB
#include <bits/stdc++.h> //#include "horses.h" #pragma GCC optimize("O2") #pragma GCC target("avx2") using namespace std; const long long mod = 1e9 + 7; struct medis{ struct node{ int l, r; int sand = 1; int vntCnt = 0; int maxY = 0; }; int n; int dbInd = 0; vector<node> tree; void build(int v){ if(v >= n){ tree[v].l = tree[v].r = dbInd++; }else{ build(v*2); build(v*2+1); tree[v].l = tree[v*2].l; tree[v].r = tree[v*2+1].r; } } medis(int dd){ n = dd; tree.resize(2*n+1); build(1); } void changeX(int v, int l, int r, int x){ if(l <= tree[v].l && tree[v].r <= r){ tree[v].sand = x; tree[v].vntCnt = (x != 1); }else if(r < tree[v].l || tree[v].r < l){ return; }else{ changeX(v*2, l, r, x); changeX(v*2+1, l, r, x); tree[v].sand = 1ll * tree[v*2].sand * tree[v*2+1].sand % mod; tree[v].vntCnt = tree[v*2].vntCnt + tree[v*2+1].vntCnt; } } void changeY(int v, int l, int r, int x){ if(l <= tree[v].l && tree[v].r <= r){ tree[v].maxY = x; }else if(r < tree[v].l || tree[v].r < l){ return; }else{ changeY(v*2, l, r, x); changeY(v*2+1, l, r, x); tree[v].maxY = max(tree[v*2].maxY, tree[v*2+1].maxY); } } int getSand(int v, int l, int r){ if(l <= tree[v].l && tree[v].r <= r){ return tree[v].sand; }else if(r < tree[v].l || tree[v].r < l){ return 1; }else{ return 1ll * getSand(v*2, l, r) * getSand(v*2+1, l, r) % mod; } } long long getMax(int v, int l, int r){ if(l <= tree[v].l && tree[v].r <= r){ return tree[v].maxY; }else if(r < tree[v].l || tree[v].r < l){ return 1; }else{ return max(getMax(v*2, l, r), getMax(v*2+1, l, r)); } } int get1(int v, int l, int r){ if(l <= tree[v].l && tree[v].r <= r){ return tree[v].vntCnt; }else if(r < tree[v].l || tree[v].r < l){ return 0; }else{ return get1(v*2, l, r) + get1(v*2+1, l, r); } } int fd(int v, int sm){ // rasti kairiausia x, kad suf[x; n] <= sm if(tree[v].l == tree[v].r){ if(tree[v].vntCnt == 1 && sm == 0) return tree[v].l + 1; return tree[v].l; } if(tree[v*2+1].vntCnt < sm){ return fd(v*2, sm-tree[v*2+1].vntCnt); }else if(tree[v*2+1].vntCnt == sm){ return fd(v*2, sm-tree[v*2+1].vntCnt); }else{ return fd(v*2+1, sm); } } }; const int dydis = 5e5 + 1; medis tree(dydis); int n; int rt, tr,st; pair<int, int> cur[dydis]; pair<int, vector<pair<int, int> > > last30(int n){ int lastNotIn = n-1; vector<pair<int, int> > ret; int kk = 0; for(int i = 0; i < 32; i++){ if(lastNotIn == -1) break; if(cur[lastNotIn].first == 1){ tr = tree.get1(1, lastNotIn, dydis-1); rt = tree.fd(1, tr); rt = max(rt-1, 0); st = cur[rt].first; ret.push_back({st, tree.getMax(1, rt, lastNotIn)}); lastNotIn = rt-1; kk++; }else{ ret.push_back(cur[lastNotIn]); lastNotIn--; kk++; } if(kk >= 30) break; } reverse(ret.begin(), ret.end()); long long bv = 1; if(lastNotIn != -1) bv = tree.getSand(1, 0, lastNotIn); return {bv, ret}; } long long h; int curMax; long long B; bool did; long long turiButi, ret; long long get(){ auto rk = last30(n); h = rk.first; auto mas = rk.second; curMax = 0; //for(auto x : mas) cout << x.first << "-" << x.second << " "; cout << endl; for(int i = 0; i < (int)mas.size(); i++){ B = 1; did = 0; for(int j = i+1; j < (int) mas.size(); j++){ B *= mas[j].first; if(mas[j].second >= mas[i].second){ curMax = j; did = 1; i = j-1; break; } turiButi = mas[i].second / mas[j].second + 1; if(B >= turiButi){ i = j-1; did = 1; curMax = j; break; } } if(!did) break; } ret = h; for(int i = 0; i <= curMax; i++){ ret = ret * mas[i].first % mod; } ret = ret * mas[curMax].second % mod; return ret; } int init(int N, int X[], int Y[]) { n = N; for(int i = 0; i < n; i++){ tree.changeX(1, i, i, X[i]); tree.changeY(1, i, i, Y[i]); cur[i].first = X[i]; cur[i].second = Y[i]; } return get(); } int updateX(int pos, int val) { tree.changeX(1, pos, pos, val); cur[pos].first = val; return get(); } int updateY(int pos, int val) { tree.changeY(1, pos, pos, val); cur[pos].second = val; return get(); } //#include "horses.h" #include <stdio.h> #include <stdlib.h> static char _buffer[1024]; static int _currentChar = 0; static int _charsNumber = 0; static FILE *_inputFile, *_outputFile; static inline int _read() { if (_charsNumber < 0) { exit(1); } if (!_charsNumber || _currentChar == _charsNumber) { _charsNumber = (int)fread(_buffer, sizeof(_buffer[0]), sizeof(_buffer), _inputFile); _currentChar = 0; } if (_charsNumber <= 0) { return -1; } return _buffer[_currentChar++]; } static inline int _readInt() { int ret; cin >> ret; return ret; int c, x, s; c = _read(); while (c <= 32) c = _read(); x = 0; s = 1; if (c == '-') { s = -1; c = _read(); } while (c > 32) { x *= 10; x += c - '0'; c = _read(); } if (s < 0) x = -x; return x; } int main() { //_inputFile = fopen("horses.in", "rb"); //_outputFile = fopen("horses.out", "w"); int N; N = _readInt(); int *X = (int*)malloc(sizeof(int)*(unsigned int)N); int *Y = (int*)malloc(sizeof(int)*(unsigned int)N); for (int i = 0; i < N; i++) { X[i] = _readInt(); } for (int i = 0; i < N; i++) { Y[i] = _readInt(); } // fprintf(_outputFile,"%d\n",init(N,X,Y)); cout << init(N, X, Y); int M; M = _readInt(); for (int i = 0; i < M; i++) { int type; type = _readInt(); int pos; pos = _readInt(); int val; val = _readInt(); if (type == 1) { cout << updateX(pos, val) << endl; //fprintf(_outputFile,"%d\n",updateX(pos,val)); } else if (type == 2) { //fprintf(_outputFile,"%d\n",updateY(pos,val)); cout << updateY(pos, val) << endl; } } return 0; }

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

horses.cpp: In member function 'void medis::changeX(int, int, int, int)':
horses.cpp:41:59: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
   41 |    tree[v].sand = 1ll * tree[v*2].sand * tree[v*2+1].sand % mod;
      |                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
horses.cpp: In member function 'int medis::getSand(int, int, int)':
horses.cpp:62:59: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
   62 |    return 1ll * getSand(v*2, l, r) * getSand(v*2+1, l, r) % mod;
      |           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
horses.cpp: In function 'std::pair<int, std::vector<std::pair<int, int> > > last30(int)':
horses.cpp:103:48: warning: declaration of 'n' shadows a global declaration [-Wshadow]
  103 | pair<int, vector<pair<int, int> > > last30(int n){
      |                                            ~~~~^
horses.cpp:100:5: note: shadowed declaration is here
  100 | int n;
      |     ^
horses.cpp: In function 'int init(int, int*, int*)':
horses.cpp:179:12: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  179 |  return get();
      |         ~~~^~
horses.cpp: In function 'int updateX(int, int)':
horses.cpp:185:12: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  185 |  return get();
      |         ~~~^~
horses.cpp: In function 'int updateY(int, int)':
horses.cpp:191:12: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  191 |  return get();
      |         ~~~^~
horses.cpp: In function 'int _readInt()':
horses.cpp:228:9: warning: declaration of 'ret' shadows a global declaration [-Wshadow]
  228 |     int ret; cin >> ret;
      |         ^~~
horses.cpp:133:21: note: shadowed declaration is here
  133 | long long turiButi, ret;
      |                     ^~~
horses.cpp: At global scope:
horses.cpp:211:27: warning: '_outputFile' defined but not used [-Wunused-variable]
  211 | static FILE *_inputFile, *_outputFile;
      |                           ^~~~~~~~~~~
/usr/bin/ld: /tmp/ccbYwNvi.o: in function `main':
grader.c:(.text.startup+0x0): multiple definition of `main'; /tmp/ccd9whbh.o:horses.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status