제출 #308400

#제출 시각아이디문제언어결과실행 시간메모리
308400talant117408Gondola (IOI14_gondola)C++17
75 / 100
28 ms2288 KiB
#include "gondola.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair <int, int> pii; #define precision(n) fixed << setprecision(n) #define pb push_back #define ub upper_bound #define lb lower_bound #define mp make_pair #define eps (double)1e-9 #define PI 2*acos(0.0) #define endl "\n" #define sz(v) (v).size() #define all(v) v.begin(),v.end() #define rall(v) v.rbegin(),v.rend() #define do_not_disturb ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); const ll mod = 1e9+9; ll mult(ll a, ll b){ return (a*b)%mod; } ll binpow(ll a, ll b){ ll res = 1; while(b){ if(b&1) res = mult(res, a); a = mult(a, a); b >>= 1; } return res; } int valid(int n, int s[]){ int in = -1, flag = 1, i; vector <int> vis(250007); for(i = 0; i < n; i++){ if(vis[s[i]]){ flag--; break; } vis[s[i]]++; if(in == -1 && s[i] <= n){ in = s[i]; } else if(s[i] <= n && in != s[i]){ flag--; break; } in = (in == -1 ? in : (in+1 > n ? 1 : in+1)); } return flag; } //---------------------- int replacement(int n, int gon[], int repl[]){ int i, num = 0; vector <int> prev(n); iota(all(prev), 1); int in = -1, j; for(i = 0; i < n; i++){ if(in == -1 && gon[i] <= n){ in = gon[i]; j = i; break; } } if(in != -1){ for(i = j; i < n; i++){ prev[i] = in; in = (in == n ? 1 : in+1); } for(i = 0; i < j; i++){ prev[i] = in; in = (in == n ? 1 : in+1); } } vector <pii> bigger; for(i = 0; i < n; i++){ if(gon[i] > n){ bigger.pb({gon[i], i}); } } int op = n; sort(all(bigger)); for(auto to : bigger){ for(j = op; j < to.first; j++){ repl[num] = prev[to.second]; num++; prev[to.second] = j+1; } op = to.first; } return num; } //---------------------- int countReplacement(int n, int gon[]){ ll res = 1; if(!valid(n, gon)){ return 0; } vector <int> bigger; for(int i = 0; i < n; i++){ if(gon[i] > n){ bigger.pb(gon[i]); } } sort(all(bigger)); int prev = n; for(auto to : bigger){ auto it = ub(all(bigger), prev)-bigger.begin(); ll diff = to-prev-1; res = mult(res, binpow(ll(sz(bigger)-it), diff)); prev = to; } return res*(sz(bigger) == n ? n : 1); }

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

gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:135:28: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  135 |     return res*(sz(bigger) == n ? n : 1);
      |                            ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...