結果
問題 | No.738 平らな農地 |
ユーザー |
|
提出日時 | 2021-06-16 23:14:52 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 379 ms / 2,000 ms |
コード長 | 2,847 bytes |
コンパイル時間 | 283 ms |
コンパイル使用メモリ | 82,360 KB |
実行使用メモリ | 107,448 KB |
最終ジャッジ日時 | 2024-12-31 13:06:19 |
合計ジャッジ時間 | 23,613 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 5 |
other | AC * 87 |
ソースコード
import sysinput = lambda : sys.stdin.readline().rstrip()sys.setrecursionlimit(2*10**5+10)write = lambda x: sys.stdout.write(x+"\n")debug = lambda x: sys.stderr.write(x+"\n")writef = lambda x: print("{:.12f}".format(x))### 座標圧縮 (一次元)from bisect import bisect_leftdef press(l):"""xs: ソートした座標値inds: lの各要素のxsにおけるインデックス"""# xs[inds[i]]==l[i]となるxs = sorted(set(l))inds = [None] * len(l)# d = {}for i,item in enumerate(l):inds[i] = bisect_left(xs, item)# d[item] = inds[i]return xs, indsclass BIT:### BIT binarydef __init__(self, n, values=None):self.bit = [0]*(n+1)self.n = nself.total = 0if values is not None:for i,v in enumerate(values):self.add(i,v)self.total += vdef check(self):l = []prv = 0for i in range(1,self.n+1):val = self.query(i)l.append(val-prv)prv = valprint(" ".join(map(str, l)))#a1 ~ aiまでの和 O(logn)def query(self,i):res = 0while i > 0:res += self.bit[i]# res %= Mi -= i&(-i)return resdef get(self,i):return self.query(i+1) - self.query(i)#ai += x(logN)def add(self,i,x):i += 1if i==0:raise RuntimeErrorself.total += xwhile i <= self.n:self.bit[i] += x# self.bit[i] %= Mi += i&(-i)def index(self, v):"""a0,...,aiの和がv以上になる最小のindexを求める存在しないとき配列サイズを返す"""if v <= 0:return 0if self.total<v:return self.nx = 0r = 1while r < self.n:r = r << 1;ll = rwhile ll>0:if x+ll<self.n and self.bit[x+ll]<v:v -= self.bit[x+ll]x += llll = ll>>1return xn,k = list(map(int, input().split()))a = list(map(int, input().split()))xs, inds = press(a)m = len(xs)bit = BIT(m)bit2 = BIT(m)total = 0for i in range(k):bit.add(inds[i], 1)bit2.add(inds[i], xs[inds[i]])total += a[i]ans = float("inf")for i in range(k,n+1):v = bit.index((k+1)//2)left = bit2.query(v)lnum = bit.query(v)right = total - left - bit2.get(v)rnum = k - lnum - bit.get(v)val = (xs[v]*lnum - left) + (right - xs[v]*rnum)ans = min(ans, val)# bit2.check()# print(left, right)if i==n:breakbit.add(inds[i], 1)bit2.add(inds[i], a[i])bit.add(inds[i-k], -1)bit2.add(inds[i-k], -a[i-k])total += a[i] - a[i-k]print(ans)