海港
有的时候,看起来很像暴力思想都能过。
对于这道题,每艘船进入海港时,都有一次询问。
我们很自然就能想到,将每艘船里面的人的国籍塞进一个桶\(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,看起来跑的飞快。

浙公网安备 33010602011771号