RT,玄学复杂度AC求问QAQ
#include <stdio.h>
#include <string.h>
inline int read()
{
int num = 0; char c = getchar();
while (c < 48 || c > 57)c = getchar();
while (c >= 48 && c <= 57)num = (num << 3) + (num << 1) + (c ^ 48), c = getchar();
return num;
}
char _F[33];
inline void print(long long x) {
if (x == 0)
{
putchar(48);
return;
}
long long tmp = x > 0 ? x : ~x + 1;
if (x < 0) putchar('-');
int cnt = 0;
while (tmp) {
_F[cnt++] = tmp % 10 + '0';
tmp /= 10;
}
while (cnt > 0) putchar(_F[--cnt]);
}
int a[300005],t[300005];
#include <stdlib.h>
int main() {
srand(114514);
int n = read(), w = read(), ans = 0x3f3f3f3f, sum=0;
for (int i = 1; i <= n; i++) t[a[i] = read()]++;
for(int i=1;i<=n;i++)if(t[a[i]]*2>n)return printf("%d\n",n-t[a[i]])&0;else ans=ans>n-t[a[i]]?n-t[a[i]]:ans;
for(int m=n>1000?8:1;m<=w/n;m++,sum=0){
if(n>1000&&rand()%5<=1)continue;
//for(int i=1,q=1;i<=w-m*(n-1);i++,q=i,sum=0)
for(int i=w-m*(n-1),q=w-m*(n-1);i>=1;i--,q=i,sum=0)
{
if(i!=a[1])sum++;
if (!i)continue;
for (int j = 2; j <= n; j++)
{
q+=m,sum+=(q!=a[j]);
if(sum>=ans)goto hi;
}
// printf("m = %d i = %d sum = %d\n",m,i,sum);
//if(sum<6)getchar();
if (ans > sum)
{
ans = sum;
}
hi:;
}
}
print(ans); putchar(10);
return 0;
}
最后一个Subtask公差是不是都>=8?
60% 概率试探一个答案就AC了?
这是甚么数据qaq