제출 #1340061

#제출 시각아이디문제언어결과실행 시간메모리
1340061kokoxuya자리 배치 (IOI18_seats)C++20
0 / 100
3358 ms40480 KiB
#include "seats.h"
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define lsb(x) (x&(-x))
#define pii pair<int,int>
#define ss second
#define ff first
#define piii pair<int,pii>
#define debu(x) (cerr << #x  << " = "<< x << "\n")
#define debu2(x,y) (cerr << #x  << " = "<< x << " " << #y << " = " << y << "\n")
#define debu3(x,y,z) (cerr << #x  << " = "<< x << " " << #y << " = " << y << " " << #z << " = " << z<< "\n")
#define bitout(x,y) {\
	cerr << #x << " : ";\
	for (int justforbits = y; justforbits >=0; justforbits--)cout << (((1 << justforbits) & x)>=1);\
	cout << "\n";\
}
#define rangeout(j,rangestart,rangeend) {\
	cerr << "outputting " << #j<< ":\n";\
	for (int forrang = rangestart; forrang <= rangeend; forrang++)cerr << j[forrang] << " ";\
	cerr<<"\n";\
}
#define c1 {cerr << "Checkpoint 1! \n\n";cerr.flush();}
#define c2 {cerr << "Checkpoint 2! \n\n";cerr.flush();}
#define c3 {cerr << "Checkpoint 3! \n\n";cerr.flush();}
#define c4 {cerr << "Checkpoint 4! \n\n";cerr.flush();}
//AGH YOU DONT NEED A SEGMENT TREE FONFWNOFN
#define pipi pair<pii,pii>

vector<pii>foreach;
int n;
vector<pipi>curr;
vector<bool>keyi;
int ans=0;

void give_initial_chart(int H, int W, vector<int> R, vector<int> C) 
{
	int h=H,w=W;n=h*w;
	keyi.resize(n,false);
	
	for(int i=0;i<n;i++){foreach.pb(mp(R[i],C[i]));}
	
	int minr=R[0],maxr=R[0],minc=C[0],maxc=C[0];
	for(int a=0;a<n;a++)
	{
		minr=min(minr,foreach[a].ff);maxr=max(maxr,foreach[a].ff);
		minc=min(minc,foreach[a].ss);maxc=max(maxc,foreach[a].ss);
		if((maxr-minr+1)*(maxc-minc+1) == a+1)
		{
			ans++;
			keyi[a]=true;
		}
		curr.pb(mp(mp(minr,maxr),mp(minc,maxc)));
	}
}

int swap_seats(int a, int b) 
{
	swap(foreach[a],foreach[b]);
  
	int minr,maxr,minc,maxc;
	if(a==0){minr=foreach[a].ff;maxr=foreach[a].ff;minc=foreach[a].ss;maxc=foreach[a].ss;}
	else {minr=curr[a-1].ff.ff,maxr=curr[a-1].ff.ss,minc=curr[a-1].ss.ff,maxc=curr[a-1].ss.ss;}
	
	for(int i=a;i<b;i++)
	{
		minr=min(foreach[i].ff,minr);maxr=max(foreach[i].ff,maxr);
		minc=min(foreach[i].ss,minc);maxc=max(foreach[i].ss,maxc);
		curr[i]=mp(mp(minr,maxr),mp(minc,maxc));
		
		if((maxr-minr+1)*(maxc-minc+1)==i+1)
		{
			ans+=(1-keyi[i]);
			keyi[i]=true;
		}
		else
		{
			ans-=keyi[i];
			keyi[i]=false;
		}
	}
	
	return ans;
}
#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...