【BZOJ1112】砖块Klo

2023-11-07 18:58
文章标签 砖块 bzoj1112 klo

本文主要是介绍【BZOJ1112】砖块Klo,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:传送门
题解:
显然每次取中位数,暴力枚举区间,用一个平衡树维护就好啦

ps: splay插入时忘记旋转,T得飞起

//by sdfzchy
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define pa t[x].fa
#define ls t[x].ch[0]
#define rs t[x].ch[1]
using namespace std;
typedef long long LL;
const int inf=(1<<30),N=100010,mod=1e9+7;
int n,m,a[N],k;
inline int in()
{char tmp=getchar();int res=0,f=1;while((tmp<'0'||tmp>'9')&&tmp!='-')tmp=getchar();if(tmp=='-') f=-1,tmp=getchar();while(tmp>='0'&&tmp<='9') res=(res<<1)+(res<<3)+(tmp^48),tmp=getchar();return res*f;
}
int root;
LL ans=inf;
struct node
{int ch[2],siz,fa,cnt;LL val,sum;
}t[N];
inline int gi(int x) {return t[pa].ch[1]==x;}
inline void upd(int x)
{t[x].siz=t[ls].siz+t[rs].siz+t[x].cnt;t[x].sum=t[ls].sum+t[rs].sum+t[x].cnt*t[x].val;
}
void rot(int x)
{int f=pa,g=t[pa].fa,o=gi(x);if(g) t[g].ch[gi(f)]=x;t[x].fa=g;t[f].ch[o]=t[x].ch[!o];t[t[x].ch[!o]].fa=f;t[x].ch[!o]=f;t[f].fa=x;upd(f),upd(x);
}void splay(int x,int tar)
{for(;pa!=tar;rot(x))if(t[pa].fa!=tar)rot((gi(x)==gi(pa))?pa:x);if(!tar) root=x;
}
int cnt;
void newnode(int &x,int val)
{x=++cnt;t[x].ch[0]=t[x].ch[1]=0;t[x].siz=t[x].cnt=1;t[x].val=t[x].sum=val;
}
void ins(int &x,int val,int fa)
{if(!x) {newnode(x,val);pa=fa;splay(x,0);return;}t[x].siz++;if(t[x].val==val) {t[x].cnt++;t[x].sum+=val;return;}if(val>t[x].val) ins(rs,val,x);else ins(ls,val,x);upd(x);
}
int find(int val)
{int x=root;while(x){if(t[x].val==val) break;if(val>t[x].val)  x=rs;else x=ls;}if(x) splay(x,0);return x;
}
void del(int val)
{int x=find(val);if(t[x].cnt>1) {t[x].cnt--;t[x].siz--;t[x].sum-=val;return;}if(!ls&&!rs) root=0;if(!ls) {root=rs;t[rs].fa=0;return;}if(!rs) {root=ls;t[ls].fa=0;return;}int pos=t[x].ch[0];while(t[pos].ch[1]) pos=t[pos].ch[1];splay(pos,x);t[pos].ch[1]=rs;t[rs].fa=pos;t[pos].fa=0;root=pos;upd(pos);
}int kth(int kk)
{int x=root;while(x){if(t[ls].siz>=kk) x=ls;else if(t[ls].siz+t[x].cnt<kk) kk-=t[ls].siz+t[x].cnt,x=rs;else return x;}
}void ga()
{int x=kth((k+1)>>1);splay(x,0);ans=min(ans,abs(t[x].val*t[ls].siz-t[ls].sum)+abs(t[x].val*t[rs].siz-t[rs].sum));
}int main()
{ans=10000000000000000ll;n=in(),k=in();for(int i=1;i<=n;i++) a[i]=in();for(int i=1;i<=k;i++) ins(root,a[i],0);ga();for(int i=k+1;i<=n;i++){del(a[i-k]);ins(root,a[i],0);ga();}printf("%lld",ans);return 0;
}

这篇关于【BZOJ1112】砖块Klo的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/365624

相关文章

Python 用pygame简简单单实现一个打砖块

# -*- coding: utf-8 -*-# ## Copyright (C) 2024 , Inc. All Rights Reserved# ## @Time : 2024/3/30 14:34# @Author : 赫凯# @Email : hekaiiii@163.com# @File : ballgame.py# @Software

BZOJ 1112 [POI2008]砖块Klo Treap

Description N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. 现在希望用最小次数的动作完成任务. Input 第一行给出N,K. (1 ≤ k ≤ n ≤ 100000), 下面N行,每行代表这柱砖的高度.0 ≤ hi ≤ 1000000 Output

python:pygame制作童年的游戏打砖块

目录 程序源代码 程序源代码 # /usr/bin/python3# Author: 爱编程的章老师# @Time: 2021/1/9 0009# E-mail: Bluesand2010@163.com'''设计一个打砖块的游戏'''# 1. 开局屏幕上方有4行每行10个砖块# 2. 在屏幕下方有一个长100 的挡板# 3. 有一个小球从挡板中间出发,45角方向import

原生JS实现打砖块,贪吃蛇,弹球小游戏

来来来,先上效果图 赶快学习起来吧 话不多说,放代码 1. <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible"

软件工程项目----打砖块报告

打砖块项目报告 一·需求分析 1.添加一个新窗体,用于开始界面 2.添加音效和背景音乐 3.当所有砖块都消失后,添加胜利的音乐和图片文字等 4.当游戏失败后,添加失败的音乐和图片文字等 5.为不同颜色的砖块添加生命值,需要被小球碰撞多次才消失 6.为小球生命值,三次或多次失败游戏才Game Over 7.为游戏添加积分,累计到一定分数增加小球的生命值 8.为游戏添加数据库存储积分和玩游戏的玩家称

【DP】打砖块

Description KXT是一个很无聊的小朋友,一天到晚都在打坐…   一天,被他发现了一个比打坐更无聊的事情——打砖块。很多块砖分布在一个mm的矩阵中,他可以消掉以他为左上角顶点的一个nn的矩阵里的所有砖块。   喜欢偷懒的他请来了你帮他计算可以消掉最多的砖块数(只能消一次)。 Input 第一行:用空格隔开的三个整数n、m、k。   接下来k行,每行2个用空格隔开的整数Xi、Yi,表

(牛客2018校招真题05)彩色的砖块(网易)

题目描述 小易有一些彩色的砖块。每种颜色由一个大写字母表示。各个颜色砖块看起来都完全一样。现在有一个给定的字符串s,s中每个字符代表小易的某个砖块的颜色。小易想把他所有的砖块排成一行。如果最多存在一对不同颜色的相邻砖块,那么这行砖块就很漂亮的。请你帮助小易计算有多少种方式将他所有砖块排成漂亮的一行。(如果两种方式所对应的砖块颜色序列是相同的,那么认为这两种方式是一样的。) 例如: s = "AB

cocos2d-x for wp7使用cocos2d-x和BOX2D来制作一个BreakOut(打砖块)游戏(一)

本教程基于子龙山人翻译的cocos2d的IPHONE教程,用cocos2d-x for XNA引擎重写,加上我一些加工制作。教程中大多数文字图片都是原作者和翻译作者子龙山人,还有不少是我自己的理解和加工。感谢原作者的教程和子龙山人的翻译。本教程仅供学习交流之用,切勿进行商业传播。 子龙山人翻译的Iphone教程地址:http://www.cnblogs.com/zilongshanren/a

JAVA课程设计 打砖块游戏(颜色匹配版) JAVA语言

玩法简介:  主要玩法是:球,板子,砖块都分为红蓝两种颜色.砖块会随机分配两种颜色,球碰撞同颜色板子或者砖块会反弹,不同颜色的会直接穿过,板子会根据鼠标指针坐标确定位置.每次碰撞板子会改变小球颜色.单击鼠标左键可以改变板子上下颜色. package ball.last;import javax.swing.*;import java.awt.*;import java.awt.event.

基于JavaGUI的打砖块游戏

源代码下载地址 介绍 使用Java开发的一款经典打砖块游戏 展示