Submission #1038277


Source Code Expand

#include <cstdlib>
#include <iostream>
#include <vector>

int findMinNum(int a) {
	while (a&(a - 1)) a = a&(a - 1);
	return a;
}

int N;

int question_start = 0;
int question_end = 0;
int range = 0;
int answer = 0;
int temp = 0;

int question(int l, int r){
	question_start = l; question_end = r;
	std::cout << "? " << question_start << " " << question_end << std::endl;
	std::cin >> temp;
	return temp;
}

bool dfs(int l, int r, int nokori, int flag){
	std::cerr << l << " " << r << " " << nokori << " " << flag << std::endl;
	int nr, nl;
	if (r == l) return true;
	if (nokori == 0) return false;

	//small side
	int dist = findMinNum(r - l);
	nl = l + dist;
	nr = r;
	if(dfs(nl, nr, nokori-1, flag)){
		answer += question(l, l + dist) * flag;
		return true;
	}

	dist *= 2;

	nl = r - dist;
	nr = l;
	if (dfs(nl, nr, nokori - 1, -flag)) {
		answer += question(r - dist, r) * flag;
		return true;
	}

	return false;
}

int main() {
	//まず,数列の長さを表す整数 N が標準入力に与えられる.
	std::cin >> N;

	//最初に最大の2の冪の質問をする
	for (int i = 1; i <= N; i *= 2) {
		question_end = i;
	}
	range = question_end - question_start;
	std::cout << "? 0 " << question_end << std::endl;
	std::cin >> temp;
	answer += temp;

	//最初で全ての答えを求められた場合、終了する
	if (question_end == N) {
		std::cout << "! " << answer << std::endl;
		return EXIT_SUCCESS;
	}

	int start = question_end;
	int end = N;
	int flag = 1;
	dfs(start, end, 8, flag);

	//次に最大の2の冪まで計算する
	std::cout << "! " << answer << std::endl;
	return EXIT_SUCCESS;
}

Submission Info

Submission Time
Task A - Array Sum
User iroha_team
Language C++14 (GCC 5.4.1)
Score 100
Code Size 1705 Byte
Status AC
Exec Time 8 ms
Memory 1228 KiB

Judge Result

Set Name All
Score / Max Score 100 / 100
Status
AC × 24
Set Name Test Cases
All 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 01-11.txt, 01-12.txt, 01-13.txt, 01-14.txt, 01-15.txt, 01-16.txt, 01-17.txt, 01-18.txt, 01-19.txt, 01-20.txt, 01-21.txt, 01-22.txt, 01-23.txt, 01-24.txt
Case Name Status Exec Time Memory
01-01.txt AC 7 ms 720 KiB
01-02.txt AC 6 ms 720 KiB
01-03.txt AC 7 ms 596 KiB
01-04.txt AC 7 ms 596 KiB
01-05.txt AC 7 ms 972 KiB
01-06.txt AC 8 ms 976 KiB
01-07.txt AC 7 ms 976 KiB
01-08.txt AC 7 ms 976 KiB
01-09.txt AC 7 ms 976 KiB
01-10.txt AC 7 ms 976 KiB
01-11.txt AC 7 ms 1140 KiB
01-12.txt AC 7 ms 1140 KiB
01-13.txt AC 8 ms 1100 KiB
01-14.txt AC 7 ms 1224 KiB
01-15.txt AC 7 ms 1100 KiB
01-16.txt AC 7 ms 1228 KiB
01-17.txt AC 7 ms 1140 KiB
01-18.txt AC 7 ms 1228 KiB
01-19.txt AC 7 ms 852 KiB
01-20.txt AC 7 ms 972 KiB
01-21.txt AC 7 ms 1140 KiB
01-22.txt AC 7 ms 976 KiB
01-23.txt AC 8 ms 976 KiB
01-24.txt AC 7 ms 1140 KiB