Intel Code Challenge Elimination Round (Div. 1 + Div. 2, combined), problem: (C) Destroying Array並查集
阿新 • • 發佈:2018-11-19
我本題的思路是反過來考慮,即應該從全部銷燬的狀態,一個一個的恢復這些數字。這樣可以用並查集的思想解決問題,不至於導致Time Limit Exceeded。
ac程式碼:
#include <bits/stdc++.h>
#define FOR(I,A,B) for(int I = (A); I < (B); I++)
#define FORE(I,A,B) for(int I = (A); I <= (B); I++)
#define PRII pair<int,int>
#define ll long long
#define INF 1000000001
using namespace std;
int n;
ll a[100005];
int b[100005],bcj[100005];
ll res[100005];
PRII lr[100005];
int main()
{
cin>>n;
FORE(i,1,n){
scanf("%d",&a[i]);
a[i]+=a[i-1];
}
FORE(i,1,n) scanf("%d",&b[i]);
ll mx=0;
for(int i=n;i>=1;i--){
res[i]=mx;
int l=b[i]-1;
int r=b[i]+1;
bcj[b[i] ]=b[i];
if(bcj[l]){
bcj[b[i]]=bcj[l];
l=lr[bcj[l]].first;
}
if(bcj[r]){
r=lr[bcj[r]].second;
bcj[r-1]=bcj[b[i]];
}
lr[bcj[b[i]]].first=l;
lr[bcj[b[i]]].second=r;
ll sum=a[r-1]-a[l];
if(sum>mx) mx=sum;
}
FORE(i,1,n) printf("%lld\n",res[i]);
return 0;
}