这次写的还挺快的(
#include "testlib.h"
#include <queue>
using namespace std;
typedef pair<int,int> pii;
priority_queue<pii, vector<pii>, greater<pii> > PQ;
int nxt[1000010];
int A[1000010], B[1000010];
int getN(int x){
return nxt[x] == x ? x : nxt[x] = getN(nxt[x]);
}
int main(int argc, char* argv[]) {
registerTestlibCmd(argc, argv);
int N, K;
N = inf.readInt();
K = inf.readInt();
for(int i=1; i<=N; i++)
A[i]=inf.readInt();
for(int i=1; i<=N+K; i++)
B[i]=ouf.readInt(0, 30, "arr");
int l=1;
for(int i=1; i<=N+K; i++)
if(l <= N && A[l]==B[i]) ++l;
if(l != N+1)
quitf(_wa, "Cannot identify new array from initial array.");
for(int i=1;i<=N+K+1;i++) nxt[i]=i;
for(int i=1;i<=N+K;i++) PQ.push(make_pair(B[i], i));
while(PQ.size()>1){
pii x = PQ.top();PQ.pop();
pii y = PQ.top();PQ.pop();
if(x.first != y.first || getN(x.second+1) != y.second)
quitf(_wa, "Cannot combine [30]!");
nxt[x.second]=y.second;
PQ.push(make_pair(y.first+1, y.second));
}
if(PQ.top().first!=30)
quitf(_wa, "Cannot combine [30]!");
quitf(_ok, "Answer correct!");
}