Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <algorithm>
- #include <utility>
- #include <set>
- #include <string>
- #include<map>
- #include <vector>
- #define pb push_back
- #define mp make_pair
- using namespace std;
- int t,n;
- long long dp[100010];
- int kuda[100010];
- bool uzo[100010];
- long long a[100010];
- int main()
- {
- cin>>t;
- while(t--)
- {
- cin>>n;
- for(int i=0;i<=n+5;i++)
- dp[i]=1000000000,uzo[i]=false;
- for(int i=1;i<=n;i++)
- cin>>a[i];
- a[0]=0;
- dp[0]=0;
- vector<int>b;
- b.pb(0);
- if(a[1]<a[2])
- b.pb(1);
- for(int i=2;i<n;i++)
- if( a[i]<a[i-1]&&a[i]<a[i+1] ) b.pb(i);
- if( a[n]<a[n-1] )
- b.pb(n);
- b.pb(0);
- b.pb(0);
- // cout<<b.size()<<endl;
- // if(b.size()==1)
- // cout<<-b[0]<<endl;
- // for(int i=0;i<b.size();i++)
- // cout<<b[i]<<" ";
- // cout<<endl;
- dp[1]= -a[ b[1] ];
- uzo[1]=true;
- kuda[1]=0;
- for( int i=1;i<b.size()-2;i++ )
- {
- // cout<<i<<endl;
- if( dp[i]-a[b[i+2] ] < dp[i+2] )
- {
- dp[i+2]=dp[i]-a[b[i+2] ];
- kuda[i+2]=i,uzo[i+2]=true;
- }
- if( b[i+1]-b[i]==2 && a[ b[i] ]+a[b[i+1] ] >= a[b[i]+1 ] && dp[i] < dp[i+1] )
- {
- dp[i+1]=dp[i];
- kuda[i+1]=i,uzo[i+1]=false;
- }
- else
- {
- if( dp[i]-a[b[i+1] ] < dp[i+1] )
- dp[i+1]= dp[i]-a[ b[i+1] ],kuda[i+1]=i,uzo[i+1]=true;
- }
- }
- int start = b.size()-3;
- // cout<<dp[start]<< " meho " <<endl;
- vector<int> res;
- // cout<< start << " " << uzo[start] << " lalal " <<endl;
- while( true )
- {
- if(start==0)
- break;
- if( uzo[start] )
- a[ b[start] ]*=-1;
- start=kuda[start];
- }
- for( int i = 1;i<=n;i++ )
- cout<<a[i]<< " ";
- cout<<endl;
- }
- return 0
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement