이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
int n,q,l[500005],r[500005];
int su[800005];
int dis[5005][5005];
struct nod
{
int ll;
int rr;
int id;
}node[500005];
bool cmp(nod x,nod y)
{
if(x.rr == y.rr)return x.ll < y.ll;
else return x.rr < y.rr;
}
void pushup(int rt)
{
su[rt] = min(su[rt<<1],su[rt<<1|1]);
return;
}
void build(int l,int r,int rt,int now)
{
if(l == r)
{
su[rt] = dis[now][l];
return;
}
int mid = (l+r)>>1;
build(l,mid,rt<<1,now);
build(mid+1,r,rt<<1|1,now);
pushup(rt);
return;
}
int query(int l,int r,int queryl,int queryr,int rt)
{
if(queryl <= l && r <= queryr)
{
return su[rt];
}
int maxn = 1e9+2e6;
int mid = (l+r)>>1;
if(mid >= queryl)maxn = min(maxn,query(l,mid,queryl,queryr,rt<<1));
if(mid+1 <= queryr)maxn = min(maxn,query(mid+1,r,queryl,queryr,rt<<1|1));
return maxn;
}
void change(int l,int r,int askl,int askr,int val,int rt)
{
if(askl <= l && r <= askr)
{
su[rt] = val;
return;
}
int mid = (l+r)>>1;
if(mid >= askl)change(l,mid,askl,askr,val,rt<<1);
if(mid+1 <= askr)change(mid+1,r,askl,askr,val,rt<<1|1);
pushup(rt);
return;
}
int main()
{
//freopen("std.out","wb",stdout);
cin>>n>>q;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&l[i],&r[i]);
nod temp = nod{l[i],r[i],i};
node[i] = temp;
}
sort(node+1,node+n+1,cmp);
for(int now = 1;now<=n;now++)
{
for(int i=1;i<=n;i++)dis[now][i] = 1e9;
int init,target;
init = now;
int num = 0;
for(int i=1;i<=n;i++)
{
if(node[i].ll == l[init] && node[i].rr == r[init])
{
num = i;
break;
}
}
dis[now][node[num].id] = 0;
build(1,n,1,now);
change(1,n,num,num,dis[now][node[num].id],1);
for(int i=num+1;i<=n;i++)
{
int l = 1;
int r = i-1;
int ans = -1;
while(l <= r)
{
int mid = (l+r)>>1;
if(node[mid].rr >= node[i].ll)
{
ans = mid;
r = mid - 1;
}
else l = mid + 1;
}
//即[ans,i-1]是滿足rr >= ll的;
//cout<<"yeah2"<<endl;
if(ans != -1)dis[now][node[i].id] = query(1,n,ans,i-1,1) + 1;
//cout<<"yeah3"<<endl;
change(1,n,i,i,dis[now][node[i].id],1);
//cout<<"yeah4"<<endl;
}
}
while(q--)
{
int x,y;
cin>>x>>y;
if(dis[x][y] >= 1e9)
{
cout<<"impossible"<<endl;
}
else cout<<dis[x][y]<<endl;
}
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
events.cpp: In function 'int main()':
events.cpp:74:22: warning: unused variable 'target' [-Wunused-variable]
74 | int init,target;
| ^~~~~~
events.cpp:66:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
66 | scanf("%d%d",&l[i],&r[i]);
| ~~~~~^~~~~~~~~~~~~~~~~~~~
# | 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... |