Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define ll long long int
- #define pb push_back
- #define mp make_pair
- #define INF (ll)(1e18)
- #define inf 0x7fffffff
- #define inff 100000
- #define ff first
- #define ss second
- #define sz(x) ((int) (x).size())
- #define fast cin.sync_with_stdio(0);cin.tie(0)
- #define rep(i,N) for(int i = 0;i < N;i++)
- #define frep(i,a,b) for(int i = a;i <= b;i++)
- #define pii pair<int , int>
- #define pll pair<ll , ll>
- #define vii vector<int>
- #define vpii vector< pii >
- #define fill(A,v) memset(A,v,sizeof(A))
- #define setbits(x) __builtin_popcountll(x)
- #define print(A,j,k) for(int ii=j;ii<k;ii++)cout<<A[ii]<<" ";cout<<"\n"
- #define all(x) (x).begin(), (x).end()
- #define gcd __gcd
- #define SQRT 350
- #define CASES int t;cin>>t;while(t--)
- #define FILE freopen("inp.txt" , "r" , stdin);
- #define ld long double
- const int MOD = 1e9 + 7;
- const int N = 1e6 + 5;
- ll n , x;
- ll cost[2005][2005];
- ll Dist[N];
- ll A[N] , change[N];
- int vis[N];
- /*
- 0 -> 10
- 1 -> 20
- 2 -> 1 + 30
- 3 -> 1
- */
- int main(int argc, char const *argv[])
- {
- fast;
- cin >> n >> x;
- set< pair<ll , int> > S;
- for(int i = 0;i < n;i++) {
- cin >> A[i];
- Dist[i] = A[i];
- S.insert( {Dist[i] , i});
- }
- ll current = 0;
- while (S.size() > 0) {
- auto it = S.begin();
- int source = it -> ss;
- // cout << "source " << source << '\n';
- vis[source] = 1;
- S.erase(it);
- int nxt;
- if (source == n - 1)
- nxt = 0;
- else
- nxt = source + 1;
- if (change[source] + 1 <= current) {
- if (Dist[nxt] > Dist[source]) {
- change[nxt] = change[source] + 1;
- Dist[nxt] = Dist[source];
- if (vis[nxt] == 0) {
- S.insert( {Dist[nxt] , nxt});
- }
- }
- }
- else {
- if (Dist[nxt] > Dist[source] + (change[source] + 1 - current) * x ) {
- change[nxt] = change[source] + 1;
- Dist[nxt] = Dist[source] + (change[source] + 1- current) * x;
- if (vis[nxt] == 0) {
- S.insert( {Dist[nxt] , nxt});
- }
- }
- }
- current = max(current , change[nxt]);
- }
- // print(Dist , 0 , n);
- ll ans = 0;
- for(int i = 0;i < n;i++)
- ans += Dist[i];
- cout << ans << '\n';
- return 0;
- }
Add Comment
Please, Sign In to add comment