海港

有的时候,看起来很像暴力思想都能过。

对于这道题,每艘船进入海港时,都有一次询问。

我们很自然就能想到,将每艘船里面的人的国籍塞进一个桶\(c\)里面,如果\(c_{x_{i,j}}=1\),就让答案加一。我们再将前面过时的那些船踢掉,\(c_{x_{i,j}}=0\),就让答案减一。

一眼望去,这个代码时间复杂度为\(O(n\sum{k_i})\).

那么这份代码怎么过的?

经过我与xxx大佬的体育课激烈讨论,我们发现,其实这就是一个类双指针做法。

Talk is cheap,show me your code.

#include <bits/stdc++.h>
using namespace std;
int c[100005];
int n,cnt=0;
int k[100005],t[100005];
vector<int> a[100005];
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&t[i],&k[i]);
		for(int j=1;j<=k[i];j++){
			int x;
			scanf("%d",&x);
			a[i].push_back(x);
		}
	}
	for(int i=0;i<k[1];i++){
		c[a[1][i]]++;
		if(c[a[1][i]]==1)cnt++;
	}
	printf("%d\n",cnt);
	int x=1;
	for(int i=2;i<=n;i++){
		for(int j=x;j<i;j++){
			if(t[j]+86400<=t[i]){
				x=j+1;
				for(int p=0;p<k[j];p++){
					c[a[j][p]]--;
					if(c[a[j][p]]==0)cnt--;
				}
			}else break;
		}
		for(int j=0;j<k[i];j++){
			c[a[i][j]]++;
			if(c[a[i][j]]==1)cnt++;
		}
		printf("%d\n",cnt);
	}
}

最慢的点 51ms,看起来跑的飞快。

posted @ 2026-01-31 10:23  OI_emperor  阅读(6)  评论(0)    收藏  举报