1. 程式人生 > >【NOIP2018 模擬賽day2】棋盤

【NOIP2018 模擬賽day2】棋盤

今天唯一一道會的題,結果超時了。(整個人都炸了)

這道題是直接減的,如果開二維陣列會直接爆炸,編譯直接報錯。

通過我自己在草稿本上推出來的一些東西,打出了50分的程式碼:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
const int MAXN=1e6;
int x[MAXN+1];
int y[MAXN+1];
int main() {
	int m,n;
	scanf("%d%d",&n,&m);
	for(int i=1; i<=n; i++) {
		x[i]=1;
		y[i]=1;
	}
	while(m--) {
		int a,b;
		cin>>a>>b;
		x[a]=0;
		y[b]=0;
		int totx=0;
		for(int i=1; i<=n; i++)
			if(x[i])
				totx++;
		int toty=0;
		for(int i=1; i<=n; i++)
			if(y[i])
				toty++;
		long long sum=toty*totx;
		printf("%lld\n",sum);
	}
	return 0;
}
然後,在講題之後的AC程式碼(其實我想得差不多)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#pragma G++ optimaze (2)
using namespace std;
const int MAXN=1e6;
long long x[MAXN+5];
long long y[MAXN+5];
int main() {
	long long m,n;
	scanf("%lld%lld",&n,&m);

	long long totx=n;
	long long toty=n;
	long long sum=n*n;
	while(m--) {
		int a,b;
		cin>>a>>b;
		if(!x[a]){
			x[a]=1;
			sum-=toty;
			totx--;
		}
		if(!y[b]){
			y[b]=1;
			sum-=totx;
			toty--;
		}
		printf("%lld\n",sum);
	}
	return 0;
}