Pagini recente » Cod sursa (job #2646256) | Cod sursa (job #822362) | Cod sursa (job #2312863) | Monitorul de evaluare | Cod sursa (job #519586)
Cod sursa(job #519586)
using namespace std;
#include<iostream>
#include<fstream>
#include<vector>
#define pb push_back
#define L ((i)*2)
#define R ((L)+1)
#define T ((i)/2)
#define oo 0x3f3f3f3f
#define nmax 10000
struct nod{
short lg,c;};
ofstream fout("scara3.out");
vector<nod> G[nmax];
//int N,K,L;
int N,nh,K,eL;
long long d[nmax];
short poz[nmax];
short H[nmax];
long long bani[nmax];
void upheap(int i)
{ int m;
if(i<=1) return ;
if(d[H[i]]<d[H[T]])
m=T;
else if(d[H[i]]==d[H[T]] && bani[H[i]]<bani[H[T]])
m=T;
if(i!=m) swap(H[i],H[T]),swap(poz[H[i]],poz[H[T]]), upheap(T);
}
void downheap(int i)
{
int m;
m=i;
if(L<=nh)
{
if(d[H[L]]<d[H[m]])
{
m=L;
}
else
if(d[H[L]]==d[H[m]])
{
if(bani[H[L]]<bani[H[m]])
m=L;
}
}
if(R<=nh)
{
if(d[H[R]]<d[H[m]])
{
m=R;
}
else
if(d[H[R]]==d[H[m]])
{
if(bani[H[R]]<bani[H[m]])
{
m=R;
}
}
}
if(m!=i) swap(H[i],H[m]),swap(poz[H[i]],poz[H[m]]), downheap(m);
}
void solve()
{vector<nod>::iterator it;
int i,u;
for(i=1;i<=N;i++)
{
d[i]=oo;
H[i]=i;
poz[i]=i;
bani[i]=oo;
}
d[1]=0;
bani[1]=0;
nh=N;
while(nh)
{
u=H[1];
swap(H[1],H[nh]);
swap(poz[H[1]],poz[H[nh]]);
nh--;
downheap(poz[H[1]]);
for(it=G[u].begin();it<G[u].end();it++)
{
if(d[it->lg]>d[u]+1)
{
d[it->lg]=d[u]+1;
bani[it->lg]=bani[u]+it->c;
upheap(poz[it->lg]);
}
if(d[it->lg]==d[u]+1)
{
if(bani[it->lg]>bani[u]+it->c)
{
bani[it->lg]=bani[u]+it->c;
}
upheap(poz[it->lg]);
}
}
}
//if(d[N]==20 && bani[N]==38)
//if(bani[N]==0)
fout<<d[N]<<" "<<bani[N]<<"\n";
//else
//fout<<d[N]<<" "<<bani[N]<<"\n";
}
void cit()
{int i,j,ord,c;
ifstream fin("scara3.in");
fin>>N;
fin>>K;
N++;
for(i=1;i<=N-1;i++)
{
G[i].pb((nod){i+1,0});
}
for(i=1;i<=K;i++)
{
fin>>ord>>c;
//util[ord]=c;
ord++;
for(j=ord+1;j<=ord+c;j++)
G[ord].pb((nod){j,0});
}
fin>>eL;
for(i=1;i<=eL;i++)
{
fin>>ord>>c;
ord++;
for(j=1;j<=c;j++)
{
G[ord].pb((nod){ord+j*2-1,j});
G[ord].pb((nod){ord+j*2,j});
}
}
}
int main()
{
cit();
solve();
fout.close();
return 0;
}