BZOJ3638缓存

#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
inline int read()
{
    int x=0,f=1; char ch=getchar();
    while (ch<‘0‘ || ch>‘9‘) {if (ch==‘-‘) f=-1; ch=getchar();}
    while (ch>=‘0‘ && ch<=‘9‘) {x=x*10+ch-‘0‘; ch=getchar();}
    return x*f;
}
#define maxn 101000
int n,m,a[maxn],ans;
struct DataNode
{
    int lx,rx,mx,sum,pl,pr,p1,p2;
    void add(int pos,int x) {p1=p2=pl=pr=pos,mx=sum=lx=rx=x;}
};
struct SegmentTreeNode
{
    int l,r,tag;
    DataNode maxx,minn;
    void add(int pos,int x) {maxx.add(pos,x); minn.add(pos,-x);}
}tree[maxn<<2];
inline DataNode Merge(DataNode ls,DataNode rs)
{
    DataNode rt;
    rt.sum=ls.sum+rs.sum;
    rt.lx=ls.sum+rs.lx>ls.lx? ls.sum+rs.lx : ls.lx;
    rt.pl=ls.sum+rs.lx>ls.lx? rs.pl : ls.pl;
    rt.rx=rs.sum+ls.rx>rs.rx? rs.sum+ls.rx : rs.rx;
    rt.pr=rs.sum+ls.rx>rs.rx? ls.pr : rs.pr;

    rt.mx=ls.rx+rs.lx; rt.p1=ls.pr; rt.p2=rs.pl;
    if (rt.mx<ls.mx) rt.mx=ls.mx,rt.p1=ls.p1,rt.p2=ls.p2;
    if (rt.mx<rs.mx) rt.mx=rs.mx,rt.p1=rs.p1,rt.p2=rs.p2;

    return rt;
}
inline void Update(int now)
{
    tree[now].minn=Merge(tree[now<<1].minn,tree[now<<1|1].minn);
    tree[now].maxx=Merge(tree[now<<1].maxx,tree[now<<1|1].maxx);
}
inline void Pushdown(int now)
{
    if (!tree[now].tag || tree[now].l==tree[now].r) return;
    tree[now].tag=0;
    swap(tree[now<<1].maxx,tree[now<<1].minn);
    swap(tree[now<<1|1].minn,tree[now<<1|1].maxx);
    tree[now<<1].tag^=1; tree[now<<1|1].tag^=1;
}
inline void BuildTree(int now,int l,int r)
{
    tree[now].l=l; tree[now].r=r; tree[now].tag=0;
    if (l==r) {tree[now].add(l,a[l]); return;}
    int mid=(l+r)>>1;
    BuildTree(now<<1,l,mid); BuildTree(now<<1|1,mid+1,r);
    Update(now);
}
inline void Change(int now,int pos,int x)
{
    Pushdown(now);
    if (tree[now].l==tree[now].r) {tree[now].add(tree[now].l,x); return;}
    int mid=(tree[now].l+tree[now].r)>>1;
    if (pos<=mid) Change(now<<1,pos,x); else Change(now<<1|1,pos,x);
    Update(now);
}
inline DataNode Query(int now,int L,int R)
{
    Pushdown(now);
    if (L<=tree[now].l && R>=tree[now].r) return tree[now].maxx;
    int mid=(tree[now].l+tree[now].r)>>1;
    DataNode re; re.add(0,0);
    if (L<=mid) re=Merge(re,Query(now<<1,L,R));
    if (R>mid) re=Merge(re,Query(now<<1|1,L,R));
    return re;
}
inline void Reverse(int now,int L,int R)
{
    Pushdown(now);
    if (L<=tree[now].l && R>=tree[now].r)
        {swap(tree[now].maxx,tree[now].minn); tree[now].tag^=1; return;}
    int mid=(tree[now].r+tree[now].l)>>1;
    if (L<=mid) Reverse(now<<1,L,R);
    if (R>mid) Reverse(now<<1|1,L,R);
    Update(now);
}
struct StackNode
{
    int l,r;
    void Push(int L,int R) {l=L,r=R;}
}stack[21];
int top;
inline void SolveAsk(int L,int R,int K)
{
    ans=0; top=0;
    while (K--)
        {
            DataNode tmp=Query(1,L,R);
            if (tmp.mx>0) ans+=tmp.mx; else break;
            Reverse(1,tmp.p1,tmp.p2);
            stack[++top].Push(tmp.p1,tmp.p2);
        }
    for (int i=1; i<=top; i++)
        Reverse(1,stack[i].l,stack[i].r);
    printf("%d\n",ans);
}
inline void SolveChange(int pos,int x) {Change(1,pos,x);}
int main()
{
    n=read();
    for (int i=1; i<=n; i++) a[i]=read();
    BuildTree(1,1,n);
    m=read();
    while (m--)
        {
            int opt=read(),L,R,K,x,d;
            switch (opt)
                {
                    case 1 : L=read(),R=read(),K=read(); SolveAsk(L,R,K); break;
                    case 2 : x=read(),d=read(); SolveChange(x,d); break;
                }
        }
    return 0;
}

目前状态  50ms RE

时间: 2024-10-14 09:55:41

BZOJ3638缓存的相关文章

Apache Ignite——新一代数据库缓存系统

Apache Ignite是一个通用的数据库缓存系统,它不仅支持所有的底层数据库系统,比如RDBMS.NoSQL和HDFS,还支持Write-Through和Read-Through.Write-Behind Caching等可选功能. Apache Ignite是一个聚焦分布式内存计算的开源项目,它在内存中储存数据,并分布在多个节点上以提供快速数据访问.此外,可选地将数据同步到缓存层同样是一大优势.最后,可以支持任何底层数据库存储同样让 Ignite成为数据库缓存的首先.

数据字典实现缓存

数据字典的好处很多比如: 1.可以减少使用表,来专门记录类型. 2.类型使用key检索,或者报表统计分析,在一定程度上相比汉字来讲,效率好得多. 3.使用缓存的数据字典.也可以减少不少的io操作. 等等.... 首先,库表设计就智者见智了.不多说.爱怎么设计就怎么设计. 完整的数据字典设计 ,需要 1.生成select 自定义标签. 2.list页面,或者get页面, 一个key转 value的标签 使用自定义标签,搭配上缓存的数据字典是最方便.最完美的解决办法, 接下来,就直接贴代码了. 一.

4.缓存控制技术

动态网站的数据都是从数据库获取而来的.所以网站的瓶颈往往就是反复连接数据库和大量的SQL语句查询的执行.由于HTTP协议是无状态性的,所以每次对页面请求都会执行相同的操作.我们可以让页面内容本身变化不大但是偶尔还是要变化的页面(例如新闻网站)缓存起来作为静态的页面,下一次再访问的时候直接访问静态的HTML页面即可. ① Smarty里面控制缓存 需要做3步工作:开启缓存,指定缓存目录,定义缓存的生命周期

Shiro缓存(十三)

使用缓存,可以解决每次访问请求都查数据库的问题.第一次授权后存入缓存. 缓存流程 shiro中提供了对认证信息和授权信息的缓存.shiro默认是关闭认证信息缓存的,对于授权信息的缓存shiro默认开启的.主要研究授权信息缓存,因为授权的数据量大. 用户认证通过. 该 用户第一次授权:调用realm查询数据库 该 用户第二次授权:不调用realm查询数据库,直接从缓存中取出授权信息(权限标识符). -------------------------------------使用ehcache缓存框架

Hibernate session缓存

一级缓存(执行代码时查看console台上的sql语句)  清空缓存 @Test public void demo03(){ //清空缓存 Session session=factory.openSession(); session.beginTransaction(); //1.查询 User user = (User)session.get(User.class, 1); System.out.println(user); //session.evitc(user) //将执行对象从一级缓存

nginx三 之缓存模块

友情提示: 缓存模块是在动静分离的环境基础上搭建,动静分离可以参考http://www.cnblogs.com/dahuandan/p/6759212.html 介绍 提高网站响应速度是web应用不容忽视的目标,在之前动静分离的基础上,我们已经降低了后端服务器压力,提高了处理请求的性能,但是用户请求的静态资源是从硬盘读取,相比内存的性能还有很大的提高: Nginx自带的缓存模块可以把静态资源缓存到内存中,提高了用户请求静态资源的速度,并且nginx自带缓存模块配置简单,使用灵活,搭配第三方插件可

一个缓存容灾写的样例

背景 有时我们能够使用缓存进行容灾的处理.场景例如以下:我们当前有一个专门提供各种数据的应用DataCore,该应用开放多个RFC方法供其它应用使用.      我们平时在读写数据时,会在Cache备份一份(为平时DataCore提高响应速度.减少DB.CPU压力所用),当DB挂掉的时候.Cache还能够用来容灾.使用缓存容灾的优点是:性能足够好,坏处是缓存可比数据库成本高多了. 让我们想象得更猛烈些,当DataCore整个挂掉的时候,A.B.C.D方怎么才干安然的执行下去? 我们能够在A.B.

浏览器缓存机制浅析

非HTTP协议定义的缓存机制 浏览器缓存机制,其实主要就是HTTP协议定义的缓存机制(如: Expires: Cache-control等).但是也有非HTTP协议定义的缓存机制,如使用HTML Meta 标签,Web开发者可以在HTML页面的<head>节点中加入<meta>标签,代码如下: <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> 上述代码的作用是告诉浏览器当前页面不被缓存,每

缓存与数据库的一致性思考

时隔两年,重新启动这个博客.熟悉又有点陌生,这两年我的技术方向有了很大改变,但由于一直在使用为知笔记,因此这些改变没有提现在本博客上.之所以重启这个博客,主要是因为博客是一个开放的东西,可以带来一些交流,而笔记则是个人的东西,缺少思维碰撞.闲话少叙,这就开始. 问题:怎么保持缓存与数据库一致? 要解答这个问题,我们首先来看不一致的几种情况.我将不一致分为三种情况: 1. 数据库有数据,缓存没有数据: 2. 数据库有数据,缓存也有数据,数据不相等: 3. 数据库没有数据,缓存有数据. 在讨论这三种