智力大冲浪的数据加强版,n^2算法要被卡。
我们发现,原来的暴力代码最暴力的是这一段:
for (register int j=num[i].pos; j>=1; --j)
if (!f[j])
{
f[j]=true,ans+=num[i].w;
break;
}
那么对于一个个往前找,直到找到一个空格子的这个步骤,能不能把它变成找1次就找到呢?
显然是不行的…但是log次,或a(n),即ackermaan,是可以的,所以就用一个并查集来维护每个格子前面第一个空格子是哪个格子。
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n,xx,yy,ans;
int f[N];
struct number{
int pos,w;}num[N];
inline bool cmp(numbe