제출 #1330928

#제출 시각아이디문제언어결과실행 시간메모리
1330928boclobanchatFurniture (JOI20_furniture)C++20
5 / 100
5101 ms139644 KiB
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1024;
bitset<MAXN> F[MAXN*2][MAXN];
pair<int,int> Q[MAXN*MAXN];
bool ans[MAXN*MAXN];
vector<int> vi[MAXN*2];
int cnt[MAXN*2];
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n,m,q;
    cin>>n>>m;
    for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)
    {
    	int res;
    	cin>>res;
    	F[i+j][0][j]=1-res;
	}
	for(int i=1;i<=n+m;i++) vi[i].push_back(0);
	cin>>q;
	for(int i=1;i<=q;i++)
	{
		cin>>Q[i].first>>Q[i].second;
		int sum=Q[i].first+Q[i].second;
		cnt[sum]++,F[sum][cnt[sum]]=F[sum][cnt[sum]-1];
		F[sum][cnt[sum]][Q[i].second]=0,vi[sum].push_back(i);
		ans[i]=true;
	}
	int st=1;
	while(st<=q)
	{
		int l=st,r=q,pos=q+1;
		while(l<=r)
		{
			int mid=(l+r)/2;
			bitset<MAXN> dp;
			dp[1]=1;
			for(int i=3;i<=n+m;i++)
			{
				int pos=upper_bound(vi[i].begin(),vi[i].end(),mid)-vi[i].begin()-1;
				dp=((dp|(dp<<1))&F[i][pos]);
			}
			if(dp[m]) l=mid+1;
			else r=mid-1,pos=mid;
		}
		if(pos==q+1) break;
		int sum=Q[pos].first+Q[pos].second;
		for(int j=0;j<=cnt[sum];j++) F[sum][j][Q[pos].second]=1;
		ans[pos]=false,st=pos+1;
	}
	for(int i=1;i<=q;i++) cout<<ans[i]<<"\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...