1. 程式人生 > >Intel Code Challenge Elimination Round (Div. 1 + Div. 2, combined), problem: (C) Destroying Array並查集

Intel Code Challenge Elimination Round (Div. 1 + Div. 2, combined), problem: (C) Destroying Array並查集

我本題的思路是反過來考慮,即應該從全部銷燬的狀態,一個一個的恢復這些數字。這樣可以用並查集的思想解決問題,不至於導致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; }