Submission

Status:

Compilation Error

Score: 0

User: Newtonabc

Problemset: อโมกุส

Language: cpp

Time: 0.000 second

Submitted On: 2024-09-28 21:11:33

#include <vector>
#include <climits>
#include <queue>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#define mp make_pair
using namespace std;
const int S=5e4+10;
const int N=1<<17;
int n,m,k,sz,rnk[S];
long long dist[S],mn[S],a[S];
bool vs[S];
vector<pair<long long,int> > adj[S];
priority_queue<pair<long long,int>,vector<pair<long long,int> >,greater<pair<long long,int> > > q;
struct stree{
	long long s[N];
	void build(int l,int r,int idx){
		s[idx]=1e18;
		if(l==r) return;
		int m=(l+r)/2;
		build(l,m,idx*2);
		build(m+1,r,idx*2+1);
	}
	void update(int l,int r,int idx,int x,long long val){
		if(x<l || x>r) return;
		if(l==r){
			s[idx]=min(s[idx],val);
			return;
		}
		int m=(l+r)/2;
		update(l,m,idx*2,x,val);
		update(m+1,r,idx*2+1,x,val);
		s[idx]=min(s[idx*2],s[idx*2+1]);
	}
	long long query(int l,int r,int idx,int a,int b){
		if(b<l || a>r) return 1e18;
		if(a<=l && b>=r) return s[idx];
		int m=(l+r)/2;
		return min(query(l,m,idx*2,a,b),query(m+1,r,idx*2+1,a,b));
	}
}s1,s2;
void dijkstra(){
    for(int i=0;i<=n;i++) vs[i]=false;
    while(!q.empty()){
        int u=q.top().second;
        q.pop();
        if(vs[u]) continue;
        vs[u]=true;
        for(int i=0;i<adj[u].size();i++){
            int v=adj[u][i].second;
            long long w=adj[u][i].first;
            if(dist[u]+w<dist[v]){
                dist[v]=dist[u]+w;
                q.push(mp(dist[v],v));
            }
        }
    }
}
long long minimum_energy(int N, int M, int K, vector<int> A, vector<int> L, 
                         vector<int> R, vector<int> C){
    n=N,m=M,k=K;
    for(int i=1;i<=n;i++){
        a[i]=A[i-1];
        adj[i-1].push_back(mp(a[i],i));
        adj[i].push_back(mp(a[i],i-1));
    }
    sort(A.begin(),A.end());
    A.erase(unique(A.begin(),A.end()),A.end());
    sz=A.size();
    for(int i=1;i<=n;i++) rnk[i]=lower_bound(A.begin(),A.end(),a[i])-A.begin()+1;
    for(int i=1;i<=m;i++){
        adj[L[i-1]].push_back(mp(C[i-1],R[i-1]+1));
        adj[R[i-1]+1].push_back(mp(C[i-1],L[i-1]));
    }
    for(int i=1;i<=n;i++) dist[i]=LLONG_MAX;
    q.push(mp(0,0));
    dijkstra();
    for(int lp=0;lp<k;lp++){
	    for(int i=1;i<=n;i++) mn[i]=LLONG_MAX;
	    s1.build(0,sz,1),s2.build(0,sz,1);
	    for(int i=1;i<=n;i++){
	    	long long tmpa,tmpb;
	    	s1.update(0,sz,1,rnk[i],dist[i-1]-a[i]*a[i]);
	    	s2.update(0,sz,1,rnk[i],dist[i-1]+a[i]*a[i]);
	    	tmpa=s1.query(0,sz,1,1,rnk[i])+a[i]*a[i];
	    	tmpb=s2.query(0,sz,1,rnk[i],n)-a[i]*a[i];
	    	mn[i]=min(tmpa,tmpb);
		}
		s1.build(0,sz,1),s2.build(0,sz,1);
		for(int i=n;i>=1;i--){
			long long tmpa,tmpb;
			s1.update(0,sz,1,rnk[i],dist[i]-a[i]*a[i]);
			s2.update(0,sz,1,rnk[i],dist[i]+a[i]*a[i]);
			tmpa=s1.query(0,sz,1,1,rnk[i])+a[i]*a[i];
			tmpb=s2.query(0,sz,1,rnk[i],n)-a[i]*a[i];
			mn[i-1]=min(mn[i-1],min(tmpa,tmpb));
		}
		/*for(int i=0;i<=n;i++) cout<<rnk[i] <<" ";
		cout<<"\n";
		for(int i=0;i<=n;i++) cout<<mn[i] <<" ";
		cout<<"\n";*/
		for(int i=1;i<=n;i++){
			if(mn[i]<dist[i]){
				dist[i]=mn[i];
				q.push(mp(dist[i],i));
			}
		}
		dijkstra();
	}
    return dist[n];
}