import sysdef main(): data = sys.stdin.buffer.read().split() n, q = int(data[0]), int(data[1]) t = [int(x) for x in data[2:2 + n]] # P[i] = t[0..i-1]의 합, Q[i] = j * t[j] (j < i)의 합 P = [0] * (n + 1) Q = [0] * (n + 1) for i in range(n): P[i + 1] = P[i] + t[i] Q[i + 1] = Q[i] + i * t[i] def forward(a, b, c): """자리 a..b-1을 번호가 커지는 쪽으로 돌 때: a가 c번, 그다음이 c-1번, … 기다리게 한다.""" dp = P[b] - P[a] return c * dp - ((Q[b] - Q[a]) - a * dp) def backward(a, b, c): """자리 b-1..a를 번호가 작아지는 쪽으로 돌 때: b-1이 c번, 그다음이 c-1번, … 기다리게 한다.""" dp = P[b] - P[a] return c * dp - ((b - 1) * dp - (Q[b] - Q[a])) out = [] pos = 2 + n for _ in range(q): s, k = int(data[pos]) - 1, int(data[pos + 1]) pos += 2 if s + k <= n: cw = forward(s, s + k, k - 1) else: cw = forward(s, n, k - 1) + forward(0, s + k - n, k - 1 - (n - s)) if k <= s + 1: ccw = backward(s - k + 1, s + 1, k - 1) else: ccw = backward(0, s + 1, k - 1) + backward(n - (k - s - 1), n, k - 1 - (s + 1)) out.append("%d %d" % (cw, ccw)) print("\n".join(out))main()
JavaScriptmain.js · 36 行
const data = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const n = data[0];const q = data[1];// P[i] = t[0..i-1]의 합, Q[i] = j * t[j] (j < i)의 합const P = new Array(n + 1).fill(0);const Q = new Array(n + 1).fill(0);for (let i = 0; i < n; i++) { P[i + 1] = P[i] + data[2 + i]; Q[i + 1] = Q[i] + i * data[2 + i];}// 자리 a..b-1을 번호가 커지는 쪽으로 돌 때: a가 c번, 그다음이 c-1번, … 기다리게 한다function forward(a, b, c) { const dp = P[b] - P[a]; return c * dp - (Q[b] - Q[a] - a * dp);}// 자리 b-1..a를 번호가 작아지는 쪽으로 돌 때: b-1이 c번, 그다음이 c-1번, … 기다리게 한다function backward(a, b, c) { const dp = P[b] - P[a]; return c * dp - ((b - 1) * dp - (Q[b] - Q[a]));}const out = [];for (let i = 0; i < q; i++) { const s = data[2 + n + 2 * i] - 1; const k = data[3 + n + 2 * i]; let cw; if (s + k <= n) cw = forward(s, s + k, k - 1); else cw = forward(s, n, k - 1) + forward(0, s + k - n, k - 1 - (n - s)); let ccw; if (k <= s + 1) ccw = backward(s - k + 1, s + 1, k - 1); else ccw = backward(0, s + 1, k - 1) + backward(n - (k - s - 1), n, k - 1 - (s + 1)); out.push(cw + " " + ccw);}console.log(out.join("\n"));
TypeScriptmain.ts · 37 行
import { readFileSync } from "node:fs";const data: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const n = data[0];const q = data[1];// P[i] = t[0..i-1]의 합, Q[i] = j * t[j] (j < i)의 합const P: number[] = new Array<number>(n + 1).fill(0);const Q: number[] = new Array<number>(n + 1).fill(0);for (let i = 0; i < n; i++) { P[i + 1] = P[i] + data[2 + i]; Q[i + 1] = Q[i] + i * data[2 + i];}// 자리 a..b-1을 번호가 커지는 쪽으로 돌 때: a가 c번, 그다음이 c-1번, … 기다리게 한다function forward(a: number, b: number, c: number): number { const dp = P[b] - P[a]; return c * dp - (Q[b] - Q[a] - a * dp);}// 자리 b-1..a를 번호가 작아지는 쪽으로 돌 때: b-1이 c번, 그다음이 c-1번, … 기다리게 한다function backward(a: number, b: number, c: number): number { const dp = P[b] - P[a]; return c * dp - ((b - 1) * dp - (Q[b] - Q[a]));}const out: string[] = [];for (let i = 0; i < q; i++) { const s = data[2 + n + 2 * i] - 1; const k = data[3 + n + 2 * i]; let cw: number; if (s + k <= n) cw = forward(s, s + k, k - 1); else cw = forward(s, n, k - 1) + forward(0, s + k - n, k - 1 - (n - s)); let ccw: number; if (k <= s + 1) ccw = backward(s - k + 1, s + 1, k - 1); else ccw = backward(0, s + 1, k - 1) + backward(n - (k - s - 1), n, k - 1 - (s + 1)); out.push(cw + " " + ccw);}console.log(out.join("\n"));
JavaMain.java · 46 行
import java.io.*;import java.util.*;public class Main { static long[] P, Q; // P[i] = t[0..i-1]의 합, Q[i] = j * t[j] (j < i)의 합 // 자리 a..b-1을 번호가 커지는 쪽으로 돌 때: a가 c번, 그다음이 c-1번, … 기다리게 한다 static long forward(int a, int b, int c) { long dp = P[b] - P[a]; return c * dp - ((Q[b] - Q[a]) - a * dp); } // 자리 b-1..a를 번호가 작아지는 쪽으로 돌 때: b-1이 c번, 그다음이 c-1번, … 기다리게 한다 static long backward(int a, int b, int c) { long dp = P[b] - P[a]; return c * dp - ((b - 1) * dp - (Q[b] - Q[a])); } public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(in.readLine()); int n = Integer.parseInt(st.nextToken()); int q = Integer.parseInt(st.nextToken()); P = new long[n + 1]; Q = new long[n + 1]; st = new StringTokenizer(in.readLine()); for (int i = 0; i < n; i++) { long t = Long.parseLong(st.nextToken()); P[i + 1] = P[i] + t; Q[i + 1] = Q[i] + i * t; } StringBuilder out = new StringBuilder(); for (int i = 0; i < q; i++) { st = new StringTokenizer(in.readLine()); int s = Integer.parseInt(st.nextToken()) - 1; int k = Integer.parseInt(st.nextToken()); long cw, ccw; if (s + k <= n) cw = forward(s, s + k, k - 1); else cw = forward(s, n, k - 1) + forward(0, s + k - n, k - 1 - (n - s)); if (k <= s + 1) ccw = backward(s - k + 1, s + 1, k - 1); else ccw = backward(0, s + 1, k - 1) + backward(n - (k - s - 1), n, k - 1 - (s + 1)); out.append(cw).append(' ').append(ccw).append('\n'); } System.out.print(out); }}
C#Main.cs · 48 行
using System;using System.Text;class Program{ static long[] P, Q; // P[i] = t[0..i-1]의 합, Q[i] = j * t[j] (j < i)의 합 // 자리 a..b-1을 번호가 커지는 쪽으로 돌 때: a가 c번, 그다음이 c-1번, … 기다리게 한다 static long Forward(int a, int b, int c) { long dp = P[b] - P[a]; return c * dp - ((Q[b] - Q[a]) - a * dp); } // 자리 b-1..a를 번호가 작아지는 쪽으로 돌 때: b-1이 c번, 그다음이 c-1번, … 기다리게 한다 static long Backward(int a, int b, int c) { long dp = P[b] - P[a]; return c * dp - ((b - 1) * dp - (Q[b] - Q[a])); } static void Main() { string[] p = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries); int n = int.Parse(p[0]), q = int.Parse(p[1]); long[] t = Array.ConvertAll(Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries), long.Parse); P = new long[n + 1]; Q = new long[n + 1]; for (int i = 0; i < n; i++) { P[i + 1] = P[i] + t[i]; Q[i + 1] = Q[i] + i * t[i]; } var sb = new StringBuilder(); for (int i = 0; i < q; i++) { p = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries); int s = int.Parse(p[0]) - 1, k = int.Parse(p[1]); long cw, ccw; if (s + k <= n) cw = Forward(s, s + k, k - 1); else cw = Forward(s, n, k - 1) + Forward(0, s + k - n, k - 1 - (n - s)); if (k <= s + 1) ccw = Backward(s - k + 1, s + 1, k - 1); else ccw = Backward(0, s + 1, k - 1) + Backward(n - (k - s - 1), n, k - 1 - (s + 1)); sb.Append(cw).Append(' ').Append(ccw).Append('\n'); } Console.Write(sb); }}
C++main.cpp · 40 行
#include <iostream>#include <vector>using namespace std;int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, q; cin >> n >> q; // P[i] = t[0..i-1]의 합, Q[i] = j * t[j] (j < i)의 합 vector<long long> P(n + 1, 0), Q(n + 1, 0); for (int i = 0; i < n; i++) { long long t; cin >> t; P[i + 1] = P[i] + t; Q[i + 1] = Q[i] + i * t; } // 자리 a..b-1을 번호가 커지는 쪽으로 돌 때: a가 c번, 그다음이 c-1번, … 기다리게 한다 auto forward = [&](int a, int b, int c) -> long long { long long dp = P[b] - P[a]; return c * dp - ((Q[b] - Q[a]) - a * dp); }; // 자리 b-1..a를 번호가 작아지는 쪽으로 돌 때: b-1이 c번, 그다음이 c-1번, … 기다리게 한다 auto backward = [&](int a, int b, int c) -> long long { long long dp = P[b] - P[a]; return c * dp - ((b - 1) * dp - (Q[b] - Q[a])); }; while (q--) { int s, k; cin >> s >> k; s--; long long cw, ccw; if (s + k <= n) cw = forward(s, s + k, k - 1); else cw = forward(s, n, k - 1) + forward(0, s + k - n, k - 1 - (n - s)); if (k <= s + 1) ccw = backward(s - k + 1, s + 1, k - 1); else ccw = backward(0, s + 1, k - 1) + backward(n - (k - s - 1), n, k - 1 - (s + 1)); cout << cw << ' ' << ccw << '\n'; } return 0;}
Cmain.c · 39 行
#include <stdio.h>/* P[i] = t[0..i-1]의 합, Q[i] = j * t[j] (j < i)의 합 */static long long P[9001], Q[9001];/* 자리 a..b-1을 번호가 커지는 쪽으로 돌 때: a가 c번, 그다음이 c-1번, … 기다리게 한다 */static long long forward(int a, int b, int c) { long long dp = P[b] - P[a]; return c * dp - ((Q[b] - Q[a]) - a * dp);}/* 자리 b-1..a를 번호가 작아지는 쪽으로 돌 때: b-1이 c번, 그다음이 c-1번, … 기다리게 한다 */static long long backward(int a, int b, int c) { long long dp = P[b] - P[a]; return c * dp - ((b - 1) * dp - (Q[b] - Q[a]));}int main(void) { int n, q; if (scanf("%d %d", &n, &q) != 2) return 0; for (int i = 0; i < n; i++) { long long t; if (scanf("%lld", &t) != 1) return 0; P[i + 1] = P[i] + t; Q[i + 1] = Q[i] + i * t; } for (int i = 0; i < q; i++) { int s, k; if (scanf("%d %d", &s, &k) != 2) return 0; s--; long long cw, ccw; if (s + k <= n) cw = forward(s, s + k, k - 1); else cw = forward(s, n, k - 1) + forward(0, s + k - n, k - 1 - (n - s)); if (k <= s + 1) ccw = backward(s - k + 1, s + 1, k - 1); else ccw = backward(0, s + 1, k - 1) + backward(n - (k - s - 1), n, k - 1 - (s + 1)); printf("%lld %lld\n", cw, ccw); } return 0;}
Craykonmain.cray · 52 行
첫줄 = コンソール.数読み();n = 첫줄[0];q = 첫줄[1];t = コンソール.数読み();// P[i] = t[0..i-1]의 합, Q[i] = j * t[j] (j < i)의 합P = 新リスト(n + 1, 0);Q = 新リスト(n + 1, 0);繰り返す (i = 0; i < n; i++){ P[i + 1] = P[i] + t[i]; Q[i + 1] = Q[i] + i * t[i];}// 자리 a..b-1을 번호가 커지는 쪽으로 돌 때: a가 c번, 그다음이 c-1번, … 기다리게 한다앞으로(a, b, c){ dp = P[b] - P[a]; 返す c * dp - (Q[b] - Q[a] - a * dp);}// 자리 b-1..a를 번호가 작아지는 쪽으로 돌 때: b-1이 c번, 그다음이 c-1번, … 기다리게 한다뒤로(a, b, c){ dp = P[b] - P[a]; 返す c * dp - ((b - 1) * dp - (Q[b] - Q[a]));}繰り返す (i = 0; i < q; i++){ 줄 = コンソール.数読み(); s = 줄[0] - 1; k = 줄[1]; 시계 = 0; 반시계 = 0; もし (s + k <= n) { 시계 = 앞으로(s, s + k, k - 1); } でなければ { 시계 = 앞으로(s, n, k - 1) + 앞으로(0, s + k - n, k - 1 - (n - s)); } もし (k <= s + 1) { 반시계 = 뒤로(s - k + 1, s + 1, k - 1); } でなければ { 반시계 = 뒤로(0, s + 1, k - 1) + 뒤로(n - (k - s - 1), n, k - 1 - (s + 1)); } コンソール.書く(시계 + " " + 반시계);}