void topological_sort(int num_nodes)
{
  for (int i = 0; i < num_nodes; ++i) {
    if (incoming_degree.find(i) == incoming_degree.end()) pq.push(i);
  }

  while (!pq.empty()) {
    int u = pq.top(); pq.pop();
    printf("%d ", u);

    for (int i = 0; i < adj_list[u].size(); ++i) {
      if (--incoming_degree[adj_list[u][i]] == 0)
        pq.push(adj_list[u][i]);
    }

    adj_list[u].clear();
  }
}
Ejemplo n.º 2
0
int main()
{
	#ifdef LOCAL
		freopen(fn".in", "r", stdin);
		freopen(fn".out", "w", stdout);
	#endif
	scanf("%I64d%I64d%I64d%I64d", &a1, &b1, &a2, &b2);
	calc(a1, d1);
	calc(b1, d1);
	calc(a2, d2);
	calc(b2, d2);

	for (auto it = begin(d1); it != end(d1); it++)
	{
		if (it -> f != 2 && it -> f != 3)
		{
			int k = it -> f;
			if (d2.find(k) == end(d2) || d2[k] != it -> s)
			{
				puts("-1");
				return 0;
			}
		}
	}
	for (auto it = begin(d2); it != end(d2); it++)
	{
		if (it -> f != 2 && it -> f != 3)
		{
			int k = it -> f;
			if (d1.find(k) == end(d1) || d1[k] != it -> s)
			{
				puts("-1");
				return 0;
			}
		}
	}

	ll delta1 = 0, delta2 = 0;
	if (d2[3] > d1[3])
	{
		delta1 = d2[3] - d1[3];
		d2[3] -= delta1;
		d2[2] += delta1;
		ch(a2, b2, delta1);
	}
	else
	{
		delta1 = d1[3] - d2[3];
		d1[3] -= delta1;
		d1[2] += delta1;
		ch(a1, b1, delta1);
	}
	if (d2[2] > d1[2])
	{
		delta2 = d2[2] - d1[2];
		d2[2] -= delta2;
		change(a2, b2, pow(2, delta2));
	}
	else
	{
		delta2 = d1[2] - d2[2];
		d1[2] -= delta2;
		change(a1, b1, pow(2, delta2));
	}
	printf("%I64d\n", delta1 + delta2);
	printf("%I64d %I64d\n%I64d %I64d", a1, b1, a2, b2);
}
Ejemplo n.º 3
0
int main()
{
	fibPos[1] = 1;
	for(int i = 2; i < 46; ++i)
	{
		
		fib[i] = fib[i-2] + fib[i-1];
		fibPos[ fib[i] ] = i;
		//printf("%d: %u %u %lld \n", i, fib[i], 1U << 31, (ll) (1U << 31) - (ll) fib[i] );
	}
	
	int T;
	scanf("%d", &T);
	
	while(T--)
	{
		int nPos;
		scanf("%d", &nPos);

		int fibNum;
		int maxPos = 0;
		for(int i = 0; i < nPos; ++i)
		{
			scanf("%d", &fibNum);
			mii::iterator mit = fibPos.find(fibNum);
			pos[i] = mit->second;
			maxPos = max(maxPos, pos[i]);
			//printf("fibNum %d  pos=%d\n", fibNum, pos[i]);
		}
		
		gets(buf);
		int len = strlen(buf);
		if (len == 0)
		{
			gets(buf);
			len = strlen(buf);
		}
		//printf("%s\n", buf);
		
		for(int i = 0; i < maxPos; ++i)
		{
			ans[i] = ' ';
		}
		ans[maxPos] = '\0';
		
		int ansPos = 0;
		for(int i = 0; i < len; ++i)
		{			
			if (buf[i] < 'A' || buf[i] > 'Z')
				continue;
			
			//printf("Ans pos %d pos[] = %d  i=%d %c\n", ansPos, pos[ansPos], i, buf[i]);
			ans[ pos[ansPos] - 1 ] = buf[i];
			++ansPos;
			if (ansPos >= nPos)
				break;
		}
		
		printf("%s\n", ans);
		//printf("[%s]  maxPos %d\n", ans, maxPos);
	}

	return 0;
}