Codeforce 218 div2
D
一开始想错了,试图用"前缀和-容量"来求从上层流下来了多少水",但这是错的,因为溢出可能发生在中间.
然后发现对于每层,溢出事件只会发生一次,所以可以用类似并查集的办法,在每次加水后直接更新每层的容量就行了.
E
推出公式后发现只要预处理坐标前缀和sum[]和sum的前缀和ssum[]就可以在o(1)时间内求出给定区间的答案,
接下来枚举区间就行了(区间长度是给定的):
左端点右移,需要先删除第一个点,相当于后面每个点产生的统计值减去一个值v,v可以利用sum快速计算;
添加右端点,需要加上一个值v,v可以利用sum和ssum快速计算.
struct node
{
int id;
llong v;
};node x[maxn]; llong n,k,sum[maxn],ssum[maxn];
llong getsum(int l,int r){return l==?sum[r]:sum[r]-sum[l-];}
llong getssum(int l,int r)
{
if (l<=)
{
if (r<) return 0ll;
return ssum[r];
}else return ssum[r]-ssum[l-];
}
bool cmp(node u,node v) {return u.v<v.v;}
int main()
{
// freopen("test.txt","r",stdin);
scanf("%I64d",&n);
for (int i= ; i<=n ; i++ )
{
scanf("%I64d",&x[i].v);
x[i].id = i;
}
sort(x+,x++n,cmp);
// for (int i=1 ; i<=n ; i++ ) printf("%I64d%c",x[i].v,i==n?'\n':' ');
scanf("%I64d",&k);
for (int i= ; i<=n ; i++ ) sum[i] = sum[i-]+x[i].v;
for (int i= ; i<=n ; i++ ) ssum[i] = ssum[i-]+sum[i];
llong f=;
llong ans;
int p=;
// printf("sum:\n");
// for (int i=1 ; i<=n ; i++ ) printf("%I64d%c",sum[i],i==n?'\n':' ');
// printf("ssum:\n");
// for (int i=1 ; i<=n ; i++ ) printf("%I64d%c",ssum[i],i==n?'\n':' ');
for (int i= ; i<=n ; i++ )
{
if (i<k) f += (llong)(i+)*x[i].v;
else
{
f -= getsum(i-k,i-);
f += k*x[i].v;
llong a = getssum(i-k+,i)-k*sum[i-k];
llong b = getssum(i-k,i-)-k*sum[i-k];
llong c = getsum(i-k+,i);
llong tmp = 2ll*f-a-b-c;
// printf("i=%d f=%I64d a=%I64d b=%I64d c=%I64d tmp=%I64d\n",i,2ll*f,a,b,c,tmp);
if (!p||ans>tmp)
ans = tmp,p=i;
}
}
for (int i=p-k+ ; i<=p ; i++ ) printf("%d%c",x[i].id,i==p?'\n':' ');
return ;
}
Codeforce 218 div2的更多相关文章
- Codeforce Round #218 Div2
A:没个元素的个数少的变成多的和就是了 B:居然被systemtest搓掉了- -分东西,我改的代码,还是shit一样的过的...别人的直接两个操作数相减就可以了! C:二分题- -,没想到比赛时因为 ...
- codeforce 192 div2解题报告
今天大家一起做的div2,怎么说呢,前三题有点坑,好多特判.... A. Cakeminator 题目的意思是说,让你吃掉cake,并且是一行或者一列下去,但是必须没有草莓的存在.这道题目,就是判断一 ...
- Codeforce 287 div2 C题
题目链接:http://codeforces.com/contest/507/problem/C 解题报告:现在有一个满二叉树型的迷宫,入口在根结点,出口在第n个叶节点,有一串命令,LRLRLRLRL ...
- codeforce #339(div2)C Peter and Snow Blower
Peter and Snow Blower 题意:有n(3 <= n <= 100 000)个点的一个多边形,这个多边形绕一个顶点转动,问扫过的面积为多少? 思路:开始就认为是一个凸包的问 ...
- Codeforce 220 div2
D 插入: 在当前指针位置sz处插入一个1,col[sz]记录插入的内容,sz++; 删除i: 找到第i个1的位置,赋为0; 于是转化为一个维护区间和的问题; trick: 如果是依次删除a[0],a ...
- Codeforce 217 div2
C 假设每种颜色的个数都相同,可以用轮换的方式,让答案达到最大n,当不同的时候,可以每次从每种颜色中取出相同个数的手套来操作; 一直迭代下去直到只剩下1种颜色; 再将这一种颜色与之前交换过的交换就行了 ...
- Codeforce 216 div2
D 只要搞清楚一个性质:确定了当前最大和次大的位置,局面就唯一确定了; 根据这个性质设计dp,统计到达该局面的方法数即可. E 询问的要求是: 求有多少个区间至少覆盖了询问的点集中的一个; 转化成逆命 ...
- codeforce 459 DIV2 D题
题意 在一个DAG上面有N个点M条边,每一条边上都有一个小写字母.两个人Max and Lucas 每个人一颗棋子,两个人轮流行棋,当前这一步选择的路上面的字母必须大于等于上一步路上面的字母,当轮 ...
- codeforce 382 div2 E —— 树状dp
题意:给一棵n个结点的无根树染色,求使每个结点距离为k的范围内至少有一个被染色的结点的总染色方法数目 分析:首先我们定义: 对于结点v, 如果存在一个黑色结点u距离v不超过k,则结点v被“控制” 首先 ...
随机推荐
- 修改oracle服务器所在linux主机名
1.修改/etc/hosts 2.修改 /etc/sysconfig/network 3.修改oracle的 listener.ora 4.修改 tnsnames.ora
- 让背景图片跟随div大小变化代码
- js-权威指南学习笔记4
第五章 语句 1.在JS中没有块级作用域,在语句块中声明的变量并不是语句块私有的. 2.尽管函数声明语句和函数定义表达式具有相同的函数名,但二者仍然不同.两种方式都创建了新的函数对象,但函数声明语句中 ...
- [OGRE]看备注学编程(02):打地鼠01-布置场地九只地鼠
项目下载地址:http://download.csdn.net/detail/wxg694175346/6340347 头文件ShrewMouseApplication.h: #ifndef __Sh ...
- @IBDesignable和@IBInspectable
近期一直在看苹果公司提供的两本swift官方教程电子书,一部是<The Swift Programming Language>,还有一部是<Using Swift With Coco ...
- Linux安装WebLogic12
# groupadd weblogic# useradd -g weblogic weblogic# passwd weblogic# mkdir -p /var/bea# chown -R webl ...
- [ES6] Array -- Destructuring and Rest Parameters && for ..of && Arrat.find()
We can use the destructing and rest parameters at the same time when dealing with Array opration. Ex ...
- C#读取注册表
//1.向注册表中写信息using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"", true)){ if (key ...
- KindEditor简单的Demo使用
一般的做网站后台都会用到富文本编辑器,网上也有很多优秀的富文本编辑器,这里是开源中国的富文本编辑器推荐:http://www.oschina.net/project/tag/172/wysiwyg 我 ...
- MVC实现类似QQ的网页聊天功能-Ajax(上)
说到QQ聊天,程序员首先想到的就是如何实现长连接,及时的接收并回馈信息.那么首先想到的就是Ajax,Ajax的运行机制是通过XMLHttpRequest向服务器发出异步请求,并接受数据,这样就可以实现 ...