module main; // https://yukicoder.me/problems/no/258/editorial より // 動的計画法、経路復元 import std; void main() { // 入力 int N = readln.chomp.to!int; auto V = 0 ~ readln.split.to!(int[]); // 答えの計算 auto dp = new int[](N + 1); dp[0] = 0; dp[1] = V[1]; foreach (i; 2 .. N + 1) { dp[i] = max(dp[i - 1], dp[i - 2] + V[i]); } int[] ans; int i = N; while (true) { if (dp[i] == dp[i - 1]) { i--; if (i == 1) break; } if (dp[i] - dp[i - 2] == V[i]) { ans ~= i; i -= 2; if (i <= 1) break; } } if (i == 1 && dp[1] == V[1]) ans ~= 1; // 答えの出力 writeln(dp[N]); writefln("%(%d %)", ans.reverse); }