ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

海港

海港

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

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

我们很自然就能想到,将每艘船里面的人的国籍塞进一个桶\(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,看起来跑的飞快。

返回列表