题意:有一篇博客。一共有n个人,心中有他们期望该博客得到的赞数a[i]。当某个时刻该博客的获赞数<a[i],则该人会使得赞数+1,当赞数>a[i],该人会使得赞数-1,当赞数=a[i],不做任何改变。

对于1<=k<=n,询问1~k个人按一定的顺序给该博客从0开始点赞或点踩,该博客的最大获赞数。

-1e5<=a[i]<=1e5,n<=1e5。

标程:

 #include<bits/stdc++.h>
#define mid ((l+r)>>1)
using namespace std;
const int N=;
const int inf=0x3f3f3f3f;
int tag1[N<<],tag2[N<<],Max[N<<],Min[N<<],n,ax; void build1(int k,int l,int r)
{
if (l==r) {Max[k]=l;return;}
build1(k<<,l,mid);build1(k<<|,mid+,r);
Max[k]=max(Max[k<<],Max[k<<|]);
}
void build2(int k,int l,int r)
{
if (l==r) {Min[k]=l;return;}
build2(k<<,l,mid);build2(k<<|,mid+,r);
Min[k]=min(Min[k<<],Min[k<<|]);
}
void down1(int k)
{
if (tag1[k])
{
tag1[k<<]+=tag1[k],tag1[k<<|]+=tag1[k];
Max[k<<]+=tag1[k],Max[k<<|]+=tag1[k];
tag1[k]=;
}
}
void down2(int k)
{
if (tag2[k])
{
tag2[k<<]+=tag2[k],tag2[k<<|]+=tag2[k];
Min[k<<]+=tag2[k],Min[k<<|]+=tag2[k];
tag2[k]=;
}
}
void add1(int k,int l,int r,int x)
{
if (x<=l) {tag1[k]++;Max[k]++;return;}
down1(k);
if (x<=mid) add1(k<<,l,mid,x);
add1(k<<|,mid+,r,x);
Max[k]=max(Max[k<<],Max[k<<|]);
}
void add2(int k,int l,int r,int x)
{
if (r<=x) {tag2[k]++;Min[k]++;return;}
down2(k);
if (x>mid) add2(k<<|,mid+,r,x);
add2(k<<,l,mid,x);
Min[k]=min(Min[k<<],Min[k<<|]);
}
int qry1(int k,int l,int r)//找到恰好为0的位置
{
if (l==r) return l;
down1(k);
if (Max[k<<]>=) return qry1(k<<,l,mid);
else return qry1(k<<|,mid+,r);
}
int qry2(int k,int l,int r,int x)
{
if (x<=l) return Min[k];
down2(k); int res=inf;
if (x<=mid) res=min(res,qry2(k<<,l,mid,x));
res=min(res,qry2(k<<|,mid+,r,x));
return res;
}
int main()
{
build1(,-N,);
build2(,-N,N);
scanf("%d",&n);
for (int i=;i<=n;i++)
{
scanf("%d",&ax);
if (ax<) add1(,-N,,ax);
add2(,-N,N,ax-);
int l=qry1(,-N,);
printf("%d\n",qry2(,-N,N,l));
}
return ;
}

易错点:1.add1前缀++时,最后一个位置是不加的,所以应该从ax-1开始。

题解:线段树优化dp展开

发现一定是升序过来给赞是最优的,而这样一定存在一个分界点,该点之前x--,该点之后x单调不减。具体地,当a[x]<=-x时,x=x-1。我们设a[x]=-x的点为分界点。

之后的单调不减怎么求答案?设f[i]为第i个人点赞后,该博客的获赞数。f[i]=min(f[i-1]+1,a[i])。

展开:设分界点为x,分界点右边的第一个人为第l个,右端点为r,则f[r]=min(x+(r-l+1),a[l]+r-l,...,a[r-1]+1,a[r])。也可以用线段树优化掉。

开两棵权值线段树,一棵用来寻找分界点,维护a[x]+x的值,插入时后缀区间+1,查询时求a[x]=x的点。一棵用来维护f数组,插入时前缀区间+1(不包括右端点),查询时求后缀最小值。

不管是否实际加入元素,权值线段树的区间都是整体加,因为有单调性不会冲突。

CF773E Blog Post Rating的更多相关文章

  1. Blog Post Rating CodeForces - 806E (线段树二分)

    题目链接 题目大意: 有一个博客, 初始分数为$0$, 有$n$个人, 第$i$个人有一个期望值$a_i$, 如果第$i$个人浏览博客时,博客赞数高于$a_i$博客分数$-1$, 低于$+1$, 相等 ...

  2. EF6 DataMigration 从入门到进阶

    引言 在EntityFramework的开发过程中我们有时因需求变化或者数据结构设计的变化经常会改动表结构.但数据库Schema发生变化时EF会要求我们做DataMigration 和UpdateDa ...

  3. Ef core 如何设置主键

    在正题之前,先说明几个问题. (1)写 sql 不好吗,为什么要引入 ORM ? 总的来说由于需求的复杂性增加,引入了面向对象编程,进而有了 ORM ,ORM 使得开发人员以对象的方式表达业务逻辑.对 ...

  4. HDU 4870 Rating(高斯消元 )

    HDU 4870   Rating 这是前几天多校的题目,高了好久突然听旁边的大神推出来说是可以用高斯消元,一直喊着赶快敲模板,对于从来没有接触过高斯消元的我来说根本就是一头雾水,无赖之下这几天做DP ...

  5. SharePoint中Rating相关的字段。

      From: https://sharepoint.stackexchange.com/questions/194197/how-to-manipulate-likeby-nooflikes-rat ...

  6. 日向blog开发记录

    一点历史关于,Sonne Blog 2016.03.25springmvc + hibernate框架搭建.2016.04.21日向blog首页.2016.04.24分页实现.2016.04.30登录 ...

  7. blog (后续更新)

    设计Model(设计数据库) from django.db import models # Create your models here. class BlogsPost(models.Model) ...

  8. tensorflow 一些好的blog链接和tensorflow gpu版本安装

    pading :SAME,VALID 区别  http://blog.csdn.net/mao_xiao_feng/article/details/53444333 tensorflow实现的各种算法 ...

  9. http://blog.csdn.net/java2000_wl/article/details/8627874

    http://blog.csdn.net/java2000_wl/article/details/8627874

随机推荐

  1. Centos7下Firewalld防火墙配置命令

    前    言 服务端口日常被拦截,记录一下常用的命令便于查询 Firewalld服务管理 查看防火墙状态   1 systemctl status firewalld 开机启用/禁用防火墙   1 s ...

  2. Centos 能ping通域名和公网ip但是网站不能够打开,服务器拒绝了请求。打开80端口解决。

    博客搬迁,给你带来的不便,敬请谅解! http://www.suanliutudousi.com/2017/10/29/centos-%E8%83%BDping%E9%80%9A%E5%9F%9F%E ...

  3. C# Winform Dev控件之TileControl

    tileControl 包含TileGroup TileGroup 包含 Tile Tile拖拽时代码 TilteControl的itemPress事件执行 或Tile的itemPress执行 Til ...

  4. 1、如何在列表,字典,集合种根据条件筛选数据?2、如何为元组中的每个元素命名,提高程序的可读性3、如何统计出序列中元素出现的频度4、如何根据字典中value的大小,对字典的key进行排序

    一.数据筛选: 处理方式: 1.filter函数在py3,返回的是个生成式. from random import randint data = [randint(-100,100) for i in ...

  5. Django(九) xadmin全局配置

    xadmin的使用,首先需要对model进行注册,才能在后台管理中进行操作. 1.在app里创建py文件:adminx(必须这个名称) 2.导入xadmin和models里的类,格式如下: 其中lis ...

  6. Jquery中$.get(),$.post(),$.ajax(),$.getJSON(),$.getScript(),$.load()的用法总结

    参考文档 :  https://blog.csdn.net/jiandanokok/article/details/48809717 本文是对Jquery中$.get(),$.post(),$.aja ...

  7. main中的argc,argv

    那么我们运行程序时,传入的参数,就是这个argc的值:从截图中,我们很清楚的可以看出,argc是传入参数的个数,”传入的参数“加上可执行文件的文件名:  

  8. shell脚本中:单引号和双引号的区别

    单引号和双引号的区别 前面我们还留下一个疑问,定义变量时,变量的值可以由单引号' '包围,也可以由双引号" "包围,它们到底有什么区别呢?不妨以下面的代码为例来说明: #!/bin ...

  9. C中空指针、NULL与0

    空指针是指确保可以没有指向任何一个对象的指针.空指针常量值通常使用宏定义NULL来表示. 空指针和任何非空指针比较都不相等,因此经常作为函数异常时的返回值使用. 链表也经常在数据末尾放一个空指针提示后 ...

  10. VS 解决方案

    //1.如果你的VS用到了环境变量,你在更改了环境变量路径后需要重启VS