# |
제출 시각 |
아이디 |
문제 |
언어 |
결과 |
실행 시간 |
메모리 |
1047063 |
2024-08-07T08:25:45 Z |
이종영(#11084) |
청소 (JOI20_sweeping) |
C++17 |
|
15588 ms |
273860 KB |
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#include "debug.h"
#else
#define debug(...)
#endif
using pii=array<int,2>;
const int N=1500005;
int n,m,m2,q,k=1,g[N];
pii arr[N];
pii ans[N];
bool in[N];
pii a[N],R[N];
set<pii> V1[N],V2[N];
set<pii> S1,S2;
pii Get(int idx){
return {max(a[idx][0],R[g[idx]][0]),max(a[idx][1],R[g[idx]][1])};
}
void SweepH(int L){
auto iter=S2.upper_bound({L,q+1557});
int idxL=(*prev(iter))[1];
int xL=R[idxL][0],yL=R[idxL][1];
if(n-L<=xL) return;
S1.erase({R[idxL][0],idxL});
S2.erase({R[idxL][1],idxL});
vector<int> nL,nR;
bool ok=false;
while(V2[idxL].size()){
{
auto iter=V2[idxL].begin();
int idx=(*iter)[1];
if(Get(idx)[1]>L){
ok=true;
break;
}
V1[idxL].erase({a[idx][0],idx});
V2[idxL].erase({a[idx][1],idx});
nL.push_back(idx);
}
if(V2[idxL].empty()) break;
{
auto iter=prev(V2[idxL].end());
int idx=(*iter)[1];
if(Get(idx)[1]<=L) break;
V1[idxL].erase({a[idx][0],idx});
V2[idxL].erase({a[idx][1],idx});
nR.push_back(idx);
}
}
if(ok){
for(int idx: nR){
V1[idxL].insert({a[idx][0],idx});
V2[idxL].insert({a[idx][1],idx});
}
if(V1[idxL].size()){
R[idxL][0]=xL;
R[idxL][1]=L+1;
S1.insert({R[idxL][0],idxL});
S2.insert({R[idxL][1],idxL});
}
if(nL.size()){
k++;
for(int idx: nL){
g[idx]=k;
V1[k].insert({a[idx][0],idx});
V2[k].insert({a[idx][1],idx});
}
R[k][0]=n-L;
R[k][1]=yL;
S1.insert({R[k][0],k});
S2.insert({R[k][1],k});
}
} else{
for(int idx: nL){
V1[idxL].insert({a[idx][0],idx});
V2[idxL].insert({a[idx][1],idx});
}
if(V1[idxL].size()){
R[idxL][0]=n-L;
R[idxL][1]=yL;
S1.insert({R[idxL][0],idxL});
S2.insert({R[idxL][1],idxL});
}
if(nR.size()){
k++;
for(int idx: nR){
g[idx]=k;
V1[k].insert({a[idx][0],idx});
V2[k].insert({a[idx][1],idx});
}
R[k][0]=xL;
R[k][1]=L+1;
S1.insert({R[k][0],k});
S2.insert({R[k][1],k});
}
}
}
void SweepV(int L){
auto iter=S1.upper_bound({L,q+1557});
int idxL=(*prev(iter))[1];
int xL=R[idxL][0],yL=R[idxL][1];
if(n-L<=yL) return;
S1.erase({R[idxL][0],idxL});
S2.erase({R[idxL][1],idxL});
vector<int> nL,nR;
bool ok=false;
while(V1[idxL].size()){
{
auto iter=V1[idxL].begin();
int idx=(*iter)[1];
if(Get(idx)[0]>L){
ok=true;
break;
}
V1[idxL].erase({a[idx][0],idx});
V2[idxL].erase({a[idx][1],idx});
nL.push_back(idx);
}
if(V1[idxL].empty()) break;
{
auto iter=prev(V1[idxL].end());
int idx=(*iter)[1];
if(Get(idx)[0]<=L) break;
V1[idxL].erase({a[idx][0],idx});
V2[idxL].erase({a[idx][1],idx});
nR.push_back(idx);
}
}
if(ok){
for(int idx: nR){
V1[idxL].insert({a[idx][0],idx});
V2[idxL].insert({a[idx][1],idx});
}
if(V1[idxL].size()){
R[idxL][0]=L+1;
R[idxL][1]=yL;
S1.insert({R[idxL][0],idxL});
S2.insert({R[idxL][1],idxL});
}
if(nL.size()){
k++;
for(int idx: nL){
g[idx]=k;
V1[k].insert({a[idx][0],idx});
V2[k].insert({a[idx][1],idx});
}
R[k][0]=xL;
R[k][1]=n-L;
S1.insert({R[k][0],k});
S2.insert({R[k][1],k});
}
} else{
for(int idx: nL){
V1[idxL].insert({a[idx][0],idx});
V2[idxL].insert({a[idx][1],idx});
}
if(V1[idxL].size()){
R[idxL][0]=xL;
R[idxL][1]=n-L;
S1.insert({R[idxL][0],idxL});
S2.insert({R[idxL][1],idxL});
}
if(nR.size()){
k++;
for(int idx: nR){
g[idx]=k;
V1[k].insert({a[idx][0],idx});
V2[k].insert({a[idx][1],idx});
}
R[k][0]=L+1;
R[k][1]=yL;
S1.insert({R[k][0],k});
S2.insert({R[k][1],k});
}
}
}
void solve(int l,int r){
if(l==r) return;
int m=(l+r)>>1;
solve(l,m);
// [l, m]에서 추가된 점의 [m+1, r]에서의 쿼리 시 결과를 구한다.
for(int i=l;i<=m;i++) if(arr[i][0]==0){
int idx=arr[i][1];
in[idx]=1;
g[idx]=1;
V1[1].insert({a[idx][0],idx});
V2[1].insert({a[idx][1],idx});
}
S1.insert({0,1});
S2.insert({0,1});
S1.insert({n+1,q+1557});
S2.insert({n+1,q+1557});
for(int i=m+1;i<=r;i++){
if(arr[i][0]==2) SweepH(arr[i][1]);
else if(arr[i][0]==3) SweepV(arr[i][1]);
else if(arr[i][0]==1&&in[arr[i][1]]) ans[i]=Get(arr[i][1]);
}
for(int i=l;i<=m;i++) if(arr[i][0]==0){
int idx=arr[i][1];
a[idx]=Get(idx);
in[idx]=0;
g[idx]=0;
}
S1.clear();
S2.clear();
for(int i=1;i<=k;i++){
V1[i].clear();
V2[i].clear();
R[i]={0,0};
}
k=1;
solve(m+1,r);
}
int main(){
ios::sync_with_stdio(false); cin.tie(0);
cin>>n>>m>>q;
for(int i=1;i<=m;i++){
cin>>a[i][0]>>a[i][1];
arr[i]={0,i};
}
for(int op,i=1;i<=q;i++){
cin>>op;
if(op==1){
int p;
cin>>p;
arr[i+m]={1,p};
} else if(op==2){
int l;
cin>>l;
arr[i+m]={2,l};
} else if(op==3){
int l;
cin>>l;
arr[i+m]={3,l};
} else{
m2++;
cin>>a[m+m2][0]>>a[m+m2][1];
arr[i+m]={0,m+m2};
}
}
solve(1,m+q);
for(int i=1;i<=m+q;i++) if(arr[i][0]==1){
cout<<ans[i][0]<<" "<<ans[i][1]<<"\n";
}
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
33 ms |
150616 KB |
Output is correct |
2 |
Correct |
26 ms |
150284 KB |
Output is correct |
3 |
Correct |
24 ms |
150620 KB |
Output is correct |
4 |
Correct |
30 ms |
150616 KB |
Output is correct |
5 |
Correct |
48 ms |
150672 KB |
Output is correct |
6 |
Correct |
22 ms |
150620 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
13289 ms |
248744 KB |
Output is correct |
2 |
Correct |
13229 ms |
259200 KB |
Output is correct |
3 |
Correct |
13109 ms |
248756 KB |
Output is correct |
4 |
Correct |
5041 ms |
241528 KB |
Output is correct |
5 |
Correct |
5460 ms |
241328 KB |
Output is correct |
6 |
Correct |
11739 ms |
253692 KB |
Output is correct |
7 |
Correct |
11889 ms |
244148 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3922 ms |
250616 KB |
Output is correct |
2 |
Correct |
3307 ms |
253488 KB |
Output is correct |
3 |
Correct |
2649 ms |
257028 KB |
Output is correct |
4 |
Correct |
2295 ms |
265064 KB |
Output is correct |
5 |
Correct |
3255 ms |
253540 KB |
Output is correct |
6 |
Correct |
2813 ms |
252624 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3922 ms |
250616 KB |
Output is correct |
2 |
Correct |
3307 ms |
253488 KB |
Output is correct |
3 |
Correct |
2649 ms |
257028 KB |
Output is correct |
4 |
Correct |
2295 ms |
265064 KB |
Output is correct |
5 |
Correct |
3255 ms |
253540 KB |
Output is correct |
6 |
Correct |
2813 ms |
252624 KB |
Output is correct |
7 |
Correct |
9309 ms |
270972 KB |
Output is correct |
8 |
Correct |
9353 ms |
251184 KB |
Output is correct |
9 |
Correct |
9295 ms |
251404 KB |
Output is correct |
10 |
Correct |
4673 ms |
243868 KB |
Output is correct |
11 |
Correct |
3968 ms |
245460 KB |
Output is correct |
12 |
Correct |
5183 ms |
232592 KB |
Output is correct |
13 |
Correct |
5022 ms |
232996 KB |
Output is correct |
14 |
Correct |
410 ms |
160596 KB |
Output is correct |
15 |
Correct |
2848 ms |
233336 KB |
Output is correct |
16 |
Correct |
8568 ms |
249676 KB |
Output is correct |
17 |
Correct |
8584 ms |
242028 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
33 ms |
150616 KB |
Output is correct |
2 |
Correct |
26 ms |
150284 KB |
Output is correct |
3 |
Correct |
24 ms |
150620 KB |
Output is correct |
4 |
Correct |
30 ms |
150616 KB |
Output is correct |
5 |
Correct |
48 ms |
150672 KB |
Output is correct |
6 |
Correct |
22 ms |
150620 KB |
Output is correct |
7 |
Correct |
13289 ms |
248744 KB |
Output is correct |
8 |
Correct |
13229 ms |
259200 KB |
Output is correct |
9 |
Correct |
13109 ms |
248756 KB |
Output is correct |
10 |
Correct |
5041 ms |
241528 KB |
Output is correct |
11 |
Correct |
5460 ms |
241328 KB |
Output is correct |
12 |
Correct |
11739 ms |
253692 KB |
Output is correct |
13 |
Correct |
11889 ms |
244148 KB |
Output is correct |
14 |
Correct |
3922 ms |
250616 KB |
Output is correct |
15 |
Correct |
3307 ms |
253488 KB |
Output is correct |
16 |
Correct |
2649 ms |
257028 KB |
Output is correct |
17 |
Correct |
2295 ms |
265064 KB |
Output is correct |
18 |
Correct |
3255 ms |
253540 KB |
Output is correct |
19 |
Correct |
2813 ms |
252624 KB |
Output is correct |
20 |
Correct |
9309 ms |
270972 KB |
Output is correct |
21 |
Correct |
9353 ms |
251184 KB |
Output is correct |
22 |
Correct |
9295 ms |
251404 KB |
Output is correct |
23 |
Correct |
4673 ms |
243868 KB |
Output is correct |
24 |
Correct |
3968 ms |
245460 KB |
Output is correct |
25 |
Correct |
5183 ms |
232592 KB |
Output is correct |
26 |
Correct |
5022 ms |
232996 KB |
Output is correct |
27 |
Correct |
410 ms |
160596 KB |
Output is correct |
28 |
Correct |
2848 ms |
233336 KB |
Output is correct |
29 |
Correct |
8568 ms |
249676 KB |
Output is correct |
30 |
Correct |
8584 ms |
242028 KB |
Output is correct |
31 |
Correct |
8683 ms |
249656 KB |
Output is correct |
32 |
Correct |
11158 ms |
264488 KB |
Output is correct |
33 |
Correct |
10853 ms |
269380 KB |
Output is correct |
34 |
Correct |
15586 ms |
273684 KB |
Output is correct |
35 |
Correct |
15588 ms |
273860 KB |
Output is correct |
36 |
Correct |
5134 ms |
253656 KB |
Output is correct |
37 |
Correct |
5476 ms |
268828 KB |
Output is correct |
38 |
Correct |
6627 ms |
256948 KB |
Output is correct |
39 |
Correct |
6734 ms |
256536 KB |
Output is correct |
40 |
Correct |
10372 ms |
260988 KB |
Output is correct |