bzoj2658[ZJOI2012]小蓝的好友(mrx)

题目链接
校内模拟赛出了这题,然后考试时写出了一个做法,评测机貌似有点慢被卡成90了,原题上可以A掉。首先可以知道\(O(n^2)\)的做法,就是只算全0的矩形个数,枚举下边界是哪一行,定义\(h\)值表示这个点向上碰到的第一个1的距离,然后可以从左到右枚举右边界,用单调栈维护以每个列作为左边界的矩形最大高度,那么以某一列作为右边界的对答案的贡献就是单调栈中的元素和。
然后数据随机,可以进一步优化这个做法,用线段树存每个点的高度值,当下边界向下移动时,相当于每个点的高度+1,且新出现的1位置的要设置成0。设新出现1的位置为x,由于每个跨过x的矩形的贡献都是0,要把它减掉,我们按照\(O(n^2)\)的想法,把x左边的单调栈通过线段树给做出来,然后显然后面的点r如果影响到了x以左的单调栈(就是存在一个\(l\le x\)\(l\)~\(r-1\)的矩形最大高度与\(l\)~\(r\)的最大矩形高度不同),才会使贡献变化(若没有影响贡献不变,直接用原来的贡献乘区间长度即可),然后就维护一下x以左的单调栈。为了找到这样的r,可以从x开始每次往右找第一个高度小于x的点,x跳过去,这样的每个点都是会影响贡献值的点。
复杂度\(O(qklogn)\),k是"从一个点开始每次向右跳到第一个比它小的点的期望跳的次数",由于数据随机k的平均大小是小于\(logn\)级别的。
刚刚去看了看别人的做法,怎么都是用treap啊,只能说想不到想不到。实际运行速度我的做法顶多比treap慢一倍的样子,可能是因为线段树比treap快了蛮多吧。
\(O(n^2)\)的:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#define P puts("lala")
#define cp cerr<<"lala"<<endl
#define ln putchar('\n')
#define pb push_back
#define fi first
#define se second 
#define shmem(x) cerr<<sizeof(x)/(1024*1024.0)<<"MB"
using namespace std;
inline int read()
{
    char ch=getchar();int g=1,re=0;
    while(ch<'0'||ch>'9') {if(ch=='-')g=-1;ch=getchar();}
    while(ch<='9'&&ch>='0') re=(re<<1)+(re<<3)+(ch^48),ch=getchar();
    return re*g;
}
typedef long long ll;
typedef pair<int,int> pii;

const int N=2050;
int dot[N][N],up[N][N];
int n,m,T;
pii stk[N]; int top=0;

void wj()
{
    freopen("alice.in","r",stdin);
    freopen("alice.out","w",stdout);
}
int main()
{
    wj();
    n=read(); m=read(); T=read();
    for(int i=1;i<=T;++i) dot[read()][read()]=1;
    for(int i=1;i<=n;++i) for(int j=1;j<=m;++j)
        up[i][j]=(dot[i][j]?0:up[i-1][j]+1);
    ll ans=0;
    for(int i=1;i<=n;++i)
    {
        ll sum=0;
        for(int j=1;j<=m;++j)
        {
            pii v=pii(up[i][j],1);
            while(top&&stk[top].fi>=v.fi) 
            {
                sum-=1ll*stk[top].fi*stk[top].se;
                v.se+=stk[top].se;
                top--;
            }
            stk[++top]=v;
            sum+=1ll*v.fi*v.se;
            ans+=sum;
        }
    }
    printf("%lld\n",(1ll*n*(n+1)/2)*(1ll*m*(m+1)/2)-ans);
    return 0;
}

\(O(qklogn)\)的:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#include<ctime>
#define P puts("lala")
#define cp cerr<<"lala"<<endl
#define ln putchar('\n')
#define pb push_back
#define fi first
#define se second 
#define shmem(x) cerr<<sizeof(x)/(1024*1024.0)<<"MB"
using namespace std;
inline int read()
{
    char ch=getchar();int g=1,re=0;
    while(ch<'0'||ch>'9') {if(ch=='-')g=-1;ch=getchar();}
    while(ch<='9'&&ch>='0') re=(re<<1)+(re<<3)+(ch^48),ch=getchar();
    return re*g;
}
typedef long long ll;
typedef pair<int,int> pii;

const int N=70050;
int n,m,T;
int minv[N<<2],addv[N<<2],add=0;
inline void modify(int o,int l,int r,int x,int k)
{
    if(l==r) {minv[o]=k; return ;}
    int mid=l+r>>1;
    if(x<=mid) modify(o<<1,l,mid,x,k);
    else modify(o<<1|1,mid+1,r,x,k);
    minv[o]=min(minv[o<<1],minv[o<<1|1]);
}
inline int query(int o,int l,int r,int x)
{
    if(l==r) return minv[o];
    int mid=l+r>>1;
    if(x<=mid) return query(o<<1,l,mid,x);
    else return query(o<<1|1,mid+1,r,x);
}
int ret=0,found=0,val;
inline void gorig(int o,int l,int r,int x)
{
    if(l==r) {if(minv[o]<x) ret=l,found=1,val=minv[o];return ;}
    int mid=l+r>>1;
    if(minv[o<<1|1]<x) gorig(o<<1|1,mid+1,r,x);
    else gorig(o<<1,l,mid,x);
}
inline void findpre(int o,int l,int r,int x,int y,int k)
{
    if(found) return ;
    if(x<=l&&r<=y) 
    {
        if(minv[o]<k) gorig(o,l,r,k);
        return ;
    }
    int mid=l+r>>1;
    if(y>mid) findpre(o<<1|1,mid+1,r,x,y,k);
    if(x<=mid) findpre(o<<1,l,mid,x,y,k);
}
inline int getpre(int x,int y,int k)
{
    if(x>y) return 0;
    ret=0; found=0; val=0; findpre(1,1,m,x,y,k);
    return ret;
}
inline void golef(int o,int l,int r,int x)
{
    if(l==r) {if(minv[o]<x) ret=l,found=1,val=minv[o];return ;}
    int mid=l+r>>1;
    if(minv[o<<1]<x) golef(o<<1,l,mid,x);
    else golef(o<<1|1,mid+1,r,x);
}
inline void findnex(int o,int l,int r,int x,int y,int k)
{
    if(found) return ;
    if(x<=l&&r<=y) 
    {
        if(minv[o]<k) golef(o,l,r,k);
        return ;
    }
    int mid=l+r>>1;
    if(x<=mid) findnex(o<<1,l,mid,x,y,k);
    if(y>mid) findnex(o<<1|1,mid+1,r,x,y,k);
}
inline int getnex(int x,int y,int k)
{
    if(x>y) return m+1;
    ret=m+1; found=0; val=0; findnex(1,1,m,x,y,k);
    return ret;
}

pii stk[N],stk2[N]; int top=0,top2=0;
vector<int>ask[N];

void wj()
{
    freopen("alice.in","r",stdin);
    freopen("alice.out","w",stdout);
}
int main()
{
    wj();
    clock_t sta=clock();
    n=read(); m=read(); T=read();
    for(int i=1;i<=T;++i) 
    {
        int x=read(),y=read();
        ask[x].pb(y);
    }
    ll ans=0,sum=0;
    for(int row=1;row<=n;++row)
    {
        add++;
        sum+=1ll*(m+1)*m/2;
        for(int i=0,siz=ask[row].size();i<siz;++i)
        {
            top=0; top2=0;
            int in=ask[row][i];
            ll tot=0;
            int hi=query(1,1,m,in);
            while(in)
            {
                int las=getpre(1,in-1,hi);
                stk2[++top2]=pii(hi,in-las);
                sum-=1ll*(hi+add)*(in-las);
                tot+=1ll*(hi+add)*(in-las);
                in=las; hi=val;
            }

            top=top2;
            for(int j=1;j<=top;++j) stk[top-j+1]=stk2[j];
            in=ask[row][i];

            hi=query(1,1,m,in);
            while(in<=m)
            {
                int las=getnex(in+1,m,hi);
                sum-=1ll*(las-in)*tot;
                if(in==ask[row][i]) sum+=tot;

                if(las>m) break;
                pii v=pii((hi=val),0);
                while(top&&stk[top].fi>=v.fi) 
                {
                    tot-=1ll*(stk[top].fi+add)*stk[top].se;
                    v.se+=stk[top].se;
                    top--;
                }
                stk[++top]=v;
                tot+=1ll*(v.fi+add)*v.se;
                in=las;
            }
            modify(1,1,m,ask[row][i],-add);
        }
        ans+=sum;
    }
    printf("%lld\n",(1ll*n*(n+1)/2)*(1ll*m*(m+1)/2)-ans);
    //cerr<<(1ll*n*(n+1)/2)*(1ll*m*(m+1)/2)-ans<<endl;
    clock_t fin=clock();
    //cerr<<(double)(fin-sta)/CLOCKS_PER_SEC<<endl;
    return 0;
}

转载于:https://www.cnblogs.com/thkkk/p/8491922.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值