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的更多相关文章

  1. Codeforce Round #218 Div2

    A:没个元素的个数少的变成多的和就是了 B:居然被systemtest搓掉了- -分东西,我改的代码,还是shit一样的过的...别人的直接两个操作数相减就可以了! C:二分题- -,没想到比赛时因为 ...

  2. codeforce 192 div2解题报告

    今天大家一起做的div2,怎么说呢,前三题有点坑,好多特判.... A. Cakeminator 题目的意思是说,让你吃掉cake,并且是一行或者一列下去,但是必须没有草莓的存在.这道题目,就是判断一 ...

  3. Codeforce 287 div2 C题

    题目链接:http://codeforces.com/contest/507/problem/C 解题报告:现在有一个满二叉树型的迷宫,入口在根结点,出口在第n个叶节点,有一串命令,LRLRLRLRL ...

  4. codeforce #339(div2)C Peter and Snow Blower

    Peter and Snow Blower 题意:有n(3 <= n <= 100 000)个点的一个多边形,这个多边形绕一个顶点转动,问扫过的面积为多少? 思路:开始就认为是一个凸包的问 ...

  5. Codeforce 220 div2

    D 插入: 在当前指针位置sz处插入一个1,col[sz]记录插入的内容,sz++; 删除i: 找到第i个1的位置,赋为0; 于是转化为一个维护区间和的问题; trick: 如果是依次删除a[0],a ...

  6. Codeforce 217 div2

    C 假设每种颜色的个数都相同,可以用轮换的方式,让答案达到最大n,当不同的时候,可以每次从每种颜色中取出相同个数的手套来操作; 一直迭代下去直到只剩下1种颜色; 再将这一种颜色与之前交换过的交换就行了 ...

  7. Codeforce 216 div2

    D 只要搞清楚一个性质:确定了当前最大和次大的位置,局面就唯一确定了; 根据这个性质设计dp,统计到达该局面的方法数即可. E 询问的要求是: 求有多少个区间至少覆盖了询问的点集中的一个; 转化成逆命 ...

  8. codeforce 459 DIV2 D题

    题意   在一个DAG上面有N个点M条边,每一条边上都有一个小写字母.两个人Max and Lucas 每个人一颗棋子,两个人轮流行棋,当前这一步选择的路上面的字母必须大于等于上一步路上面的字母,当轮 ...

  9. codeforce 382 div2 E —— 树状dp

    题意:给一棵n个结点的无根树染色,求使每个结点距离为k的范围内至少有一个被染色的结点的总染色方法数目 分析:首先我们定义: 对于结点v, 如果存在一个黑色结点u距离v不超过k,则结点v被“控制” 首先 ...

随机推荐

  1. 转载: C#: Left outer joins with LINQ

    I always considered Left Outer Join in LINQ to be complex until today when I had to use it in my app ...

  2. linux下mysql的卸载、安装全过程

    卸载mysql 1.查找以前是否装有mysql 命令:rpm -qa|grep -i mysql 可以看到mysql的两个包: mysql-4.1.12-3.RHEL4.1 mysqlclient10 ...

  3. [React Testing] Children with Shallow Rendering

    When testing React components, we often want to make sure the rendered output of the component match ...

  4. 手机软件记事本(SuperNotepad)的使用教程

    软件简介: 手机应用记事本(SuperNotepad)类似电脑应用notepad, 可用于文本阅读和编辑新建电子书(本应用限文本txt文件),是阅读小说和便签记录的好帮手. 电子书阅读器及便签的手机应 ...

  5. setTimeout 理解

    1.定义简介 setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式.   function foo(){}; var id = setTimeout(foo,1000); //返回一 ...

  6. Sass混合宏、继承、占位符

    混合宏-声明混合宏如果你的整个网站中有几处小样式类似,比如颜色,字体等,在 Sass 可以使用变量来统一处理,那么这种选择还是不错的.但当你的样式变得越来越复杂,需要重复使用大段的样式时,使用变量就无 ...

  7. FineUI 点击按钮添加标签页

    <html xmlns="http://www.w3.org/1999/xhtml"> <head id="Head1" runat=&quo ...

  8. lvm拉伸逻辑卷分区小总结

    文件系统                                      容量     已用      可用     已用% 挂载点 /dev/mapper/vg_znl-lv_root   ...

  9. DateTime对象反序列化的那些事

    今天在Android的Json反序列化过程中,Date类型无法转化成自己想要的格式,鉴于之前在C#的反序列话中也遇到过这个问题,解决的同时,顺手做个总结,供自己及需要的人日后查阅.       将Da ...

  10. Sql Server添加用户

    1.sa用户登陆之后,在安全性中新建登录名 2.添加登录名,下面的默认数据库选择该用户可访问的默认数据库 3.服务器角色中选择public 4.用户映射中选择该用户可访问的数据库,数据库角色一般选择p ...