이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> P;
typedef tuple<ll,ll,ll> PP;
typedef vector<ll> vi;
typedef vector<vi> vvi;
typedef vector<P> vp;
typedef vector<bool> vb;
typedef vector<vb> vvb;
#define rep(i,n) for(ll i=0;i<(ll)(n);i++)
#define REP(i,k,n) for(ll i=(ll)(k);i<(ll)(n);i++)
#define pb emplace_back
#define fi first
#define se second
template<class T> void out(T a){cout<<a<<endl;}
template<class T> bool chmin(T&a,T b){if(a>b){a=b;return true;}return false;}
const ll inf=1001001001001001001;
struct segtree{
vp seg;vi lazy;
ll n=1;
segtree(vp v){
while(n<v.size())n*=2;
seg=vp(n*2,P(2*inf,0));lazy=vi(n*2);
rep(i,v.size())seg[i+n]=v[i];
for(ll i=n-1;i>0;i--)seg[i]=min(seg[i*2],seg[i*2+1]);
}
void eval(ll k,ll l,ll r){
seg[k].fi+=lazy[k];
if(r-l>1)rep(j,2)lazy[k*2+j]+=lazy[k];
lazy[k]=0;
}
P get(ll a,ll b,ll k=1,ll l=0,ll r=-1){
if(r==-1)r=n;
eval(k,l,r);
if(r<=a||b<=l)return P(2*inf,0);
if(a<=l&&r<=b)return seg[k];
return min(get(a,b,k*2,l,(l+r)/2),get(a,b,k*2+1,(l+r)/2,r));
}
void add(ll x,ll a,ll b,ll k=1,ll l=0,ll r=-1){
if(r==-1)r=n;
eval(k,l,r);
if(r<=a||b<=l)return;
if(a<=l&&r<=b){
lazy[k]+=x;eval(k,l,r);return;
}
add(x,a,b,k*2,l,(l+r)/2);
add(x,a,b,k*2+1,(l+r)/2,r);
seg[k]=min(seg[k*2],seg[k*2+1]);
}
};
vvb ans;
vi num;
void init(int k,vector<int> v){
ll n=v.size();
ans=vvb(n,vb(n,false));
vp tmp1(n),tmp2(n);
rep(i,n)tmp1[i]=P(v[i],i);
rep(i,n)tmp2[i]=P(inf,i);
segtree seg1(tmp1),seg2(tmp2);
auto dif=[&](ll x){
return (x%n+n)%n;
};
ll cnt=0;
num=vi(n);
while(true){
while(true){
auto tmp=seg1.get(0,n);
if(tmp.fi>0)break;
ll i=tmp.se;
seg1.add(inf,i,i+1);
seg2.add(-inf,i,i+1);
if(i+k<=n)seg2.add(1,i+1,i+k);
else{
seg2.add(1,i+1,n);
seg2.add(1,0,i+k-n);
}
}
auto tmp=seg2.get(0,n);
if(tmp.fi>0)break;
ll i=tmp.se;
seg2.add(inf,i,i+1);
// out(i);
num[i]=cnt++;
if(i-k+1>=0)seg1.add(-1,i-k+1,i);
else{
seg1.add(-1,0,i);
seg1.add(-1,i-k+1+n,n);
}
if(i+k<=n)seg2.add(-1,i+1,i+k);
else{
seg2.add(-1,i+1,n);
seg2.add(-1,0,i+k-n);
}
}
vvi g(n);
rep(i,n)rep(j,k-1){
ll t=(i+1+j+n)%n;
if(num[i]<num[t])g[i].pb(t);
else g[t].pb(i);
}
rep(i,n){
queue<ll> que;
que.push(i);ans[i][i]=true;
while(!que.empty()){
ll t=que.front();que.pop();
for(ll x:g[t])if(!ans[i][x]){
ans[i][x]=true;que.push(x);
}
}
}
}
int compare_plants(int x,int y){
if(ans[x][y])return 1;
if(ans[y][x])return -1;
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
plants.cpp: In constructor 'segtree::segtree(vp)':
plants.cpp:23:16: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
23 | while(n<v.size())n*=2;
| ~^~~~~~~~~
plants.cpp: In function 'void init(int, std::vector<int>)':
plants.cpp:62:10: warning: variable 'dif' set but not used [-Wunused-but-set-variable]
62 | auto dif=[&](ll x){
| ^~~
# | 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |