Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2012, 20:59   #11
Assasin92
 
Регистрация: 30.10.2010
Сообщений: 7
По умолчанию

Помогли на другом форуме:
Код:
#include <iostream>
#include <fstream>
using namespace std;

int numOfDots, *firstArray, *sumArray, *s;

int prev(int x) { return (x & (x - 1)); }

int next(int x) { return ((x << 1) - (x & (x - 1))); }

int findSum(int left, int right) {
	int res = 0, x = right;
	for( ; x > 0; x = prev(x))
		res += s[x];

	for(x = left - 1; x > 0; x = prev(x))
		res -= s[x];

	return res;
}

void modify(int pos, int value) {
	sumArray[pos] += value;
	for(int x = pos; x < numOfDots; x = next(x))
		s[x] += value;
}

void getData() {
	int numOfChords, firstDot, secondDot;
	ifstream in("chords.in");
	in >> numOfChords;

	numOfDots = 2 * numOfChords + 1;
	firstArray = new int[numOfDots];
	sumArray = new int[numOfDots];
	s = new int[numOfDots];

	for(int i = 1, count = 0; count < numOfChords; ++count)
	{
		in >> firstDot >> secondDot;
		while (i < firstDot)
			++i;
		firstArray[i] = secondDot;
		firstArray[secondDot] = sumArray[i] = s[i] = 0;
	}
	in.close();
}

unsigned long check () {
	unsigned long res = 0;
	for (int i = 1; i < numOfDots; ++i)
		if (firstArray[i] != 0 && i + 1 != firstArray[i])
		{
			modify(firstArray[i], 1);
			res += findSum(i + 1, firstArray[i] - 1);
		}

	return res;
}

int main() {
	getData();
	ofstream out ("chords.out");
	out << check();
	out.close();
	return 0;
}
Assasin92 вне форума Ответить с цитированием
Старый 03.04.2012, 21:58   #12
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Эм, а где тут проверка на пересечение 2 хорд?
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача про рекурсию NIKI18 Общие вопросы C/C++ 1 19.12.2011 20:35
Задача про списки Алекс12345 Паскаль, Turbo Pascal, PascalABC.NET 2 20.08.2011 19:33
Задача про банк..... Васильева Зинаида Помощь студентам 3 07.11.2010 13:05
задача про муху DarkMage Общие вопросы C/C++ 1 14.09.2010 20:59