【Luogu】 P5445 [APIO2019] 路灯

这篇具有很好参考价值的文章主要介绍了【Luogu】 P5445 [APIO2019] 路灯。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目链接

点击打开链接

题目解法

转化很妙

考虑关路灯 x x x 的操作
令左边第一个未关的路灯为 L L L,右边第一个未关的路灯为 R R R,那么这一次会影响的区间即为 l ∈ [ L + 1 , x ] ,    r ∈ [ x , R − 1 ] l\in[L+1,x],\;r\in[x,R-1] l[L+1,x],r[x,R1],既然有 2 个限制,那么我们把限制变成二维平面上的矩阵,即把左上为 ( L + 1 , x ) (L+1,x) (L+1,x),右下为 ( x , R − 1 ) (x,R-1) (x,R1) 的矩阵变为 0
开路灯的操作类似

考虑询问的是什么?
1 1 1 q − 1 q-1 q1 次每个版本 ( x , y ) (x,y) (x,y) 位置的和
考虑给矩阵定义一个增加(或减少)值,使查询变成只要查询第 i i i 个版本的 ( x , y ) (x,y) (x,y)
这里直接给出:对于第 i i i 个操作,加上或减去值为 i − q i-q iq
考虑先开路灯,再关路灯的操作,即为 T − i − ( T − j ) = j − i T-i-(T-j)=j-i Ti(Tj)=ji,恰好为答案,这可以拓展到多个开关路灯的操作
这里需要一个特判,如果查询第 i i i 个版本从 x x x 可以到 y y y,那么答案需要 − ( q − i ) -(q-i) (qi)

可以把矩形变成 4 个区域的加减,然后不难发现,这就是一个三维偏序,可以考虑离线 c d q cdq cdq
时间复杂度 O ( n l o g 2 n ) O(nlog^2n) O(nlog2n)文章来源地址https://www.toymoban.com/news/detail-693880.html

#include <bits/stdc++.h>
#define lowbit(x) x&-x
using namespace std;
const int N=300100;
struct Node{ int x1,x2,v,op,id;}q[N*10],t[N*10];
int idx,n,m,state[N],ans[N],tr[N];
char str[N];
set<int> se;
inline int read(){
	int FF=0,RR=1;
	char ch=getchar();
	for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
	for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
	return FF*RR;
}
void ADD(int x,int y,int v){ q[++idx]={x,y,v,0,0};}
void add_square(int x1,int x2,int y1,int y2,int v){
    ADD(x2,y2,v);
    if(x1>1) ADD(x1-1,y2,-v);
    if(y1>1) ADD(x2,y1-1,-v);
    if(x1>1&&y1>1) ADD(x1-1,y1-1,v);
}
void work(int x,int t){
    if(!state[x]){
        auto it=se.upper_bound(x);
        int R=*it,L=*(--it);
        se.insert(x);
        add_square(L+1,x,x,R-1,-(m-t));
    }
    else{
        se.erase(x);
        auto it=se.upper_bound(x);
        int R=*it,L=*(--it);
        add_square(L+1,x,x,R-1,m-t);
    }
}
void add(int x,int y){ for(;x<=n;x+=lowbit(x)) tr[x]+=y;}
int ask(int x){
    if(!x) return 0;
    int res=0;
    for(;x;x-=lowbit(x)) res+=tr[x];
    return res;
}
void cdq(int l,int r){
    if(l==r) return;
    int mid=(l+r)>>1;
    cdq(l,mid),cdq(mid+1,r);
    int i=l,j=mid+1,k=0;
    while(i<=mid||j<=r){
        if(j>r||(i<=mid&&q[i].x1>=q[j].x1)){
            if(!q[i].op) add(q[i].x2,q[i].v);
            t[++k]=q[i],i++;
        }
        else{
            if(q[j].op) ans[q[j].id]+=ask(n)-ask(q[j].x2-1);
            t[++k]=q[j],j++;
        }
    }
    for(i=l;i<=mid;i++) if(!q[i].op) add(q[i].x2,-q[i].v);
    for(int i=1,j=l;i<=k;i++,j++) q[j]=t[i];
}
bool con(int x,int y){ return ask(y)-ask(x-1)==y-x+1;}
int main(){
    n=read(),m=read();
    scanf("%s",str+1);
    for(int i=1;i<=n;i++) state[i]=str[i]-48;
    add_square(1,n,1,n,m);
    se.insert(0),se.insert(n+1);
    for(int i=1;i<=n;i++) if(state[i]) add(i,1);
    for(int i=1;i<=n;i++) if(!state[i]) work(i,0);
    for(int i=1;i<=m;i++){
        char op[10];scanf("%s",op);
        if(op[0]=='t'){
            int x=read();
            state[x]^=1,work(x,i);
            ans[i]=-1e9;
            if(state[x]) add(x,1);
            else add(x,-1);
        }
        else{
            int x=read(),y=read();y--;
            if(con(x,y)) ans[i]=-(m-i);
            q[++idx]={x,y,0,1,i};
        }
    }
    memset(tr,0,sizeof(tr));
    cdq(1,idx);
    for(int i=1;i<=m;i++) if(ans[i]!=-1e9) printf("%d\n",ans[i]);
	return 0;
}

到了这里,关于【Luogu】 P5445 [APIO2019] 路灯的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Luogu】 P6076 [JSOI2015]染色问题

    点击打开链接 可以一个一个条件考虑 只考虑条件 1 1 1 答案即为 ( c + 1 ) n m (c+1)^{nm} ( c + 1 ) nm 考虑条件 1 , 2 1,2 1 , 2 对每一行的方案数减去 1 1 1 答案即为 ( ( c + 1 ) m − 1 ) n ((c+1)^m-1)^n (( c + 1 ) m − 1 ) n 考虑条件 1 , 2 , 3 1,2,3 1 , 2 , 3 考虑容斥 容斥至少有 i i i 列未被染色,即为

    2024年02月09日
    浏览(40)
  • 【LuoGU 1273】有线电视网——树上分组背包问题

    某收费有线电视网计划转播一场重要的足球比赛。他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点。 从转播站到转播站以及从转播站到所有用户终端的信号传输费用都是已知的,一场转播

    2024年02月16日
    浏览(27)
  • luogu P9474 [yLOI2022] 长安幻世绘 详细题解

    原题:P9474 [yLOI2022] 长安幻世绘 看到很多大佬的题解直接讲了做法,本蒟蒻看得不是很懂,调了很久才把这题做出来,于是写了这篇比较详细的题解谈一下我做这题从头到尾的思路,希望对各位有帮助 qwq。 我们首先思考这样一个问题,如果已经知道最终答案对应的最大值和

    2024年02月16日
    浏览(24)
  • luogu_P1040 [NOIP2003 提高组] 加分二叉树

    P1040 [NOIP2003 提高组] 加分二叉树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意:给你一颗中序遍历为1到n的二叉树,和每个节点的val。树的值=左子树的值×右子树的值+根的val,空树值为1,求整个树最大值和这个值树的前序遍历。 题解:区间dp。dp[l][r]表示最大值,root[l][

    2023年04月27日
    浏览(58)
  • Luogu P4552 [Poetize6] IncDec Sequence 更好的题解

    原题链接 第一步对于学过差分的人应该不难想 定义差分数组 $dis quad s.t. quad dis[i] = a[i] - a[i-1] $ 那么不难发现问题一只要让 (dis[2] ... dis[n]) 中全部为 (0) 即可 区间 ([l,r]) 加一操作在差分数组中意味着 (dis[l]=dis[l]+1,dis[r+1]=dis[r+1]-1) 即在差分数组中每次选取 ((x,y),dis[x]=d

    2024年02月16日
    浏览(34)
  • 华为OD真题-路灯照明

    /** * 路灯照明问题 * * 在一条笔直的公路上安装了N个路灯,从位置0开始安装,路灯之间间距固定为100米。 * * 每个路灯都有自己的照明半径,请计算第一个路灯和最后一个路灯之间,无法照明的区间的长度和。 * * 输入描述 * * 第一行为一个数N,表示路灯个数,1=N=100000 * * 第

    2024年02月15日
    浏览(47)
  • 浅谈智慧路灯安全智能供电方案设计

    摘要: 智慧路灯,作为智慧城市、新基建、城市更新的主要组成部分,近些年在各大城市已得到很好的落地和 应用,但其与传统路灯相比集成大量异元异构电子设备,这些设备的供电电压、接口形式、权属单位各不相同, 如何设计一个安全、稳定、可靠的系统供电方案成为

    2024年01月16日
    浏览(34)
  • HALCON的综合应用案例【01】: 3D 算法处理在 Visual Studio 2019 C# 环境中的集成实例

    HALCON 为一款比较流行的商业视觉处理软件,他提供了多种开发的模式,可以在HALCON中开发,也可以将HALCON的设计通过导出库的形式集成到其他开发环境里面,以方便系统集成。本文为笔者自己的一个3D 视觉检测项目,利用HALCON的3D 库开发算法,然后,将算法集成到 MS-VS-C#的环

    2024年02月06日
    浏览(34)
  • 基于STM32的两路/四路红路灯控制系统

    1、设计要求: 东西、南北两干道交于十字路口,各干道有一组红、绿、黄三个指示灯,指挥车辆和行人安全通行。南北方向为主干道,通行时间为9秒;东西方向为支干道,通行时间为15秒。通行时间最后2秒,绿灯灭,黄灯常亮,黄灯亮完变更通行车道。通行时间由数字显示

    2024年02月11日
    浏览(35)
  • 【Proteus仿真】【Arduino单片机】路灯控制系统

    本项目使用Proteus8仿真Arduino单片机控制器,使用LCD1602显示模块、人体红外传感器、光线检测模块、路灯继电器控制等。 主要功能: 系统运行后,LCD1602显示时间、工作模式,光线强度及路灯工作状态。 如果晚上11点到凌晨4点,通过红外感应方式控制路灯; 当感应有人,路灯

    2024年01月16日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包