蒟蒻求助为何60MLE

P5290 [十二省联考 2019] 春节十二响

哪位大佬帮忙看一下 拜托了
by 光明正大 @ 2019-04-12 23:57:39


我告诉你
by 渺小的Mastar @ 2019-04-13 00:12:58


@[光明正大](/space/show?uid=121563) 你把swap交换的换成两个下标就好了 具体可以可以看我的代码
by 渺小的Mastar @ 2019-04-13 00:19:12


```cpp #include<queue> #include<cstdio> #include<vector> #include<iostream> #include<algorithm> #define rgi register int #define rgu register unsigned int using namespace std; typedef long long ll; const ll MAXN=200005; int M[MAXN],ttt,k,id[MAXN]; inline int read() { int x=0,f=1; char c=getchar(); for(;!isdigit(c);c=getchar()) if(c=='-')f=-1; for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0'; return x*f; } vector<int>v,vec[MAXN]; priority_queue<int>que[MAXN]; inline void merge(int father,int child) { if(que[id[father]].size()<que[id[child]].size()) swap(id[father],id[child]); while(que[id[child]].size()) { v.push_back(max(que[id[father]].top(),que[id[child]].top())); que[id[father]].pop(),que[id[child]].pop(); } while(v.size())que[id[father]].push(v.back()),v.pop_back(); } inline void dfs(int x) { id[x]=++ttt; for(rgu i=0;i<vec[x].size();++i) { dfs(vec[x][i]); merge(x,vec[x][i]); } que[id[x]].push(M[x]); } int main() { int fi,n=read(); for(rgi i=1;i<=n;++i) M[i]=read(); for(rgi i=2;i<=n;++i) vec[read()].push_back(i); ll ans=0; dfs(1); while(que[id[1]].size())ans+=que[id[1]].top(),que[id[1]].pop(); printf("%lld\n",ans); return 0; } ```
by 渺小的Mastar @ 2019-04-13 00:19:29


得写启发式合并啊
by _虹_ @ 2019-04-13 06:54:44


哦 谢谢,改成id[]的样子就过了 但这是为什么?
by 光明正大 @ 2019-04-13 23:47:29


@[光明正大](/space/show?uid=121563) 你怎么写的和提接一模一样
by ecnerwaIa @ 2019-04-16 10:43:25


好歹自己想一下啊
by ecnerwaIa @ 2019-04-16 10:44:18


@[光明正大](/user/121563) 开C++11
by lnwsh @ 2021-07-02 11:12:56


|