Submission #165137

#TimeUsernameProblemLanguageResultExecution timeMemory
165137SegtreeWiring (IOI17_wiring)C++14
100 / 100
289 ms58384 KiB
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<set>
#include<unordered_map>
#include<unordered_set>
#include"wiring.h"
using namespace std;
typedef long long ll;
#define chmax(a,b) a=max(a,b)
#define chmin(a,b) a=min(a,b)
#define mod 1000000007
#define mad(a,b) a=(a+b)%mod
#define N 100010
struct qry{
    ll ida,idb,cost;
    bool operator<(const qry&key)const{
	if(this->ida!=key.ida)return this->ida>key.ida;
	if(this->idb!=key.idb)return this->idb>key.idb;
	return this->cost>key.cost;
    };
};
qry qrys(ll p,ll q,ll r){
    qry gen;
    gen.ida=p;
    gen.idb=q;
    gen.cost=r;
    return gen;
}
priority_queue<qry> Q;
unordered_map<ll,ll> dist[N];
unordered_set<ll> ava[N];
void ad(ll x,ll y){
    ava[x].insert(y);
}
bool av(ll x,ll y){
    return ava[x].find(y)!=ava[x].end();
}
ll lastsc[2*N];
ll lastchi[2*N],lastchj[2*N];
ll ruia[N],ruib[N];
ll min_total_length(vector<int> a,vector<int> b){
    ruia[0]=0; for(int i=0;i<a.size();i++)ruia[i+1]=ruia[i]+a[i];
    ruib[0]=0; for(int i=0;i<b.size();i++)ruib[i+1]=ruib[i]+b[i];
    for(int i=0;i<2*N;i++){
	lastsc[i]=1e17;
	lastchi[i]=0;
	lastchj[i]=0;
    }
    Q.push(qrys(0,0,0));
    ad(a.size()-1,b.size()-1);
    ll q=0;
    for(int p=0;p<a.size();p++){
	for(;q<b.size()&&a[p]>b[q];q++){}
	if(q-1>=0)ad(p,q-1);
	if(q<b.size())ad(p,q);
	//cout<<"$"<<p<<" "<<q<<endl;
    }
    q=0;
    for(int p=0;p<b.size();p++){
	for(;q<a.size()&&b[p]>a[q];q++){}
	if(q-1>=0)ad(q-1,p);
	if(q<a.size())ad(q,p);
	//cout<<"$"<<p<<" "<<q<<endl;
    }
    /*
    for(int i=0;i<a.size();i++)for(int j=0;j<b.size();j++){
	if(av(i,j))cout<<"#"<<i<<" "<<j<<endl;
    }*/
    while(!Q.empty()){
	ll i=Q.top().ida;
	ll j=Q.top().idb;
	ll cost=Q.top().cost+abs(a[i]-b[j]);
	Q.pop();
	if(av(i,j)==0)continue;
	if(dist[i].find(j)!=dist[i].end()){
	    if(dist[i][j]<=cost)continue;
	}
	ll base=i-j+N;
	ll ch=lastsc[base]+abs(ruia[i+1]-ruia[lastchi[base]+1]-(ruib[j+1]-ruib[lastchj[base]+1]));
	chmin(cost,ch);
	lastsc[base]=cost;
	lastchi[base]=i,lastchj[base]=j;
	
	if(i+1<a.size()){
	    Q.push(qrys(i+1,j,cost));
	}
	if(j+1<b.size()){
	    Q.push(qrys(i,j+1,cost));
	}
	//cout<<"dist:"<<i<<" "<<j<<" "<<cost<<endl;
	dist[i][j]=cost;
    }
    return dist[a.size()-1][b.size()-1];
}/*
int main(){
    cin.tie(0);
    ios::sync_with_stdio(0);
    vector<ll> a,b;
    ll n,m; cin>>n>>m;
    for(int i=0;i<n;i++){
	ll x; cin>>x;
	a.push_back(x);
    }
    for(int i=0;i<m;i++){
	ll x; cin>>x;
	b.push_back(x);
    }
    cout<<min_total_length(a,b)<<endl;
}*/

Compilation message (stderr)

wiring.cpp: In function 'll min_total_length(std::vector<int>, std::vector<int>)':
wiring.cpp:44:29: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     ruia[0]=0; for(int i=0;i<a.size();i++)ruia[i+1]=ruia[i]+a[i];
                            ~^~~~~~~~~
wiring.cpp:45:29: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     ruib[0]=0; for(int i=0;i<b.size();i++)ruib[i+1]=ruib[i]+b[i];
                            ~^~~~~~~~~
wiring.cpp:54:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int p=0;p<a.size();p++){
                 ~^~~~~~~~~
wiring.cpp:55:8: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(;q<b.size()&&a[p]>b[q];q++){}
       ~^~~~~~~~~
wiring.cpp:57:6: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  if(q<b.size())ad(p,q);
     ~^~~~~~~~~
wiring.cpp:61:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int p=0;p<b.size();p++){
                 ~^~~~~~~~~
wiring.cpp:62:8: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(;q<a.size()&&b[p]>a[q];q++){}
       ~^~~~~~~~~
wiring.cpp:64:6: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  if(q<a.size())ad(q,p);
     ~^~~~~~~~~
wiring.cpp:86:8: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  if(i+1<a.size()){
     ~~~^~~~~~~~~
wiring.cpp:89:8: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  if(j+1<b.size()){
     ~~~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...