Submission #430204


Source Code Expand

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

//获取小于等于某个和n 的点集数目
long long getSum(long long n)
{
	return (1 + n)*n * 2 + 1;
}
//根据给定 pos 求得所在点的坐标,由于给定数据范围大于 int,所以使用 long long
pair<long long, long long> getPair(long long pos)
{
	if (pos == 1) return pair<long long, long long>(0, 0);
	//求得一个略大于和的 n
	long long n = static_cast<long long>(sqrt(static_cast<double>(pos - 1.0) / 2.0)) + 1;
	//获取略小于当前 pos 的绝对值和的 n
	while (getSum(n)>pos)
	{
		n--;
	}
	//求得小于当前绝对值之和的前面的点集数目之和
	long long sum = getSum(n);
	long long diff = pos - sum;
	n = n + 1;
	//此时说明点位于所求绝对值之和的前一个值,也就是之前和的最大值
	if (diff == 0)
	{
		return pair<long long, long long>(n - 1, 0);
	}
	else if (diff == 1)
	{
		return pair<long long, long long>(-n, 0);
	}
	else if (diff < 2 * n)
	{
		long long l = -(n - diff / 2);
		long long r = diff % 2 == 0 ? -diff / 2 : diff / 2;
		return pair<long long, long long>(l, r);
	}
	else if (diff / 2 == n)
	{
		long long r = diff % 2 == 0 ? -n : n;
		return pair<long long, long long>(0, r);
	}
	else if (diff < 4 * n)
	{
		long long l = (diff - 2 * n) / 2;
		long long r = (diff - 2 * n) % 2 == 0 ? -(n - l) : n - l;
		return pair<long long, long long>(l, r);
	}
	else
	{
		return pair<long long, long long>(n, 0);
	}

}

int main()
{
	int n;
	cin >> n;
	long long num;
	
	for (int i = 0; i < n; i++)
	{
		cin >> num;
		pair<long long, long long> result = getPair(num);
		cout << result.first << " " << result.second << endl;
	}

	return 0;
}

Submission Info

Submission Time
Task B - n-th Points
User cyfcooler
Language C++ (G++ 4.6.4)
Score 100
Code Size 1771 Byte
Status AC
Exec Time 500 ms
Memory 924 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 100 / 100
Status
AC × 1
AC × 11
Set Name Test Cases
Sample subtask0_sample_01.txt
All subtask0_sample_01.txt, subtask1_large_01.txt, subtask1_mini01.txt, subtask1_random01.txt, subtask1_random02.txt, subtask1_random03.txt, subtask1_random04.txt, subtask1_random05.txt, subtask1_random06.txt, subtask1_random07.txt, subtask1_random08.txt
Case Name Status Exec Time Memory
subtask0_sample_01.txt AC 25 ms 800 KB
subtask1_large_01.txt AC 482 ms 800 KB
subtask1_mini01.txt AC 337 ms 924 KB
subtask1_random01.txt AC 391 ms 672 KB
subtask1_random02.txt AC 384 ms 804 KB
subtask1_random03.txt AC 377 ms 672 KB
subtask1_random04.txt AC 475 ms 672 KB
subtask1_random05.txt AC 500 ms 796 KB
subtask1_random06.txt AC 459 ms 920 KB
subtask1_random07.txt AC 480 ms 796 KB
subtask1_random08.txt AC 495 ms 924 KB