2
先考虑每次直接判断每个
已经有
不管
因此需要考虑
设原先有
特别的,当
然后要考虑其他数最多能出现多少次:
对于每个数
显然如果
事实上,当且仅当
这样直接做的时间复杂度是
考虑优化,发现对于不同的
-
首先就是
x 会发生\pm 1 的变化,而y 不变,N 仍然可以快速得到。 -
原先
b_j 出现次数会-1 ,l_1 的出现次数会+1 。若
l_1\ne h_1 ,则p_{l_1}+q_{l_1} 会比原先+1 ,需要单独判断。对于
b_j 出现次数-1 ,可以预处理出是否有其他的a 与b_j 有相同或更大的值。同样也可以快速得到。
时间复杂度
#include<bits/stdc++.h>
#define R(i,a,b) for(int i=(a),i##E=(b);i<=i##E;i++)
#define L(i,a,b) for(int i=(b),i##E=(a);i>=i##E;i--)
using namespace std;
int n,p,c,h;
int b[1111111],cnt[1111111];
int l[1111111];
vector<int>ans;
int mx,mmx,cy;
inline int check(int x)
{
if(n==1&&l[p]==h) return 1;
--cnt[b[x]];
++cnt[l[1]];
int del=cnt[h]-cy;
bool ok=1;
if(del<=0) ok=0;
if(cnt[mx]>=del) ok=0;
if(cnt[mmx]>=del) ok=0;
if(l[1]!=h&&cnt[l[1]]>=del) ok=0;
++cnt[b[x]];
--cnt[l[1]];
return ok;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cin>>n>>p>>c>>h;
R(i,1,n) cin>>b[i],++cnt[b[i]];
R(i,1,p) cin>>l[i];
R(i,2,p) if(l[i]!=h) ++cy,++cnt[l[i]];
//cout<<cy<<endl;
R(i,1,c) if(i!=h)
{
if(cnt[i]>cnt[mx]) mmx=mx,mx=i;
else if(cnt[i]>cnt[mmx]) mmx=i;
}
R(i,1,n) if(check(i)) ans.emplace_back(i);
cout<<ans.size()<<endl;
for(int x:ans) cout<<x<<' ';
cout<<endl;
}