BZOJ2118 墨墨的等式[一个图论模型]

由于某些原因,题解之后再写

好久没有这么开心的写代码了,但是还有2个小细节没注意到qwq,下次注意。

//BZOJ2118
//图论模型
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define N 1000010
#define INF (1LL<<60)
bool vis[N];
typedef long long LL;
LL T, a[15], bmin, bmax;
int n;
LL dis[N];
LL ans;
struct node
{
	int id;
	LL dis;
	node(int id = 0, LL dis = 0):id(id), dis(dis){}//注意这里的LL不要写成int呀!!
	bool operator < (const node & a) const
	{
		return dis > a.dis;
	}
};
void Dijkstra_Heap()
{
	priority_queue<node> q;
	for (LL i=0;i<T;i++){
		dis[i] = INF;
		vis[i] = 0;
	}
	dis[0] = 0;
	q.push(node(0, 0));
	while (!q.empty())
	{
		node x = q.top();
		q.pop();
		int u = x.id;
		if (vis[u]) continue;
		vis[u] = 1;
		for (int i=1;i<=n;i++)
		{
			int v = (u + a[i]) % T;
			if (dis[v] > dis[u] + a[i])
			{
				dis[v] = dis[u] + a[i];
				q.push(node(v, dis[v]));
			}
		}
	}
}
int main()
{
	scanf("%d%lld%lld", &n, &bmin, &bmax);
	for (int i=1;i<=n;i++) 
	{
		scanf("%lld", &a[i]);
		if (i == 1) T = a[i]; else T = min(T, a[i]);
	}
	Dijkstra_Heap();
	ans = 0;
	for (LL i = 0;i<T;i++)
	{
		if (dis[i] > bmax) continue;
		LL s;
		if (dis[i] >= bmin)
			s = dis[i];
		else 
			s = (T + i - bmin % T) % T + bmin;
		ans += (bmax - s) / T + 1;
	}
	printf("%lld\n", ans);
}

你可能感兴趣的:(图论,数论)