公主的朋友

本文介绍了一道算法题,涉及一系列城市与不同宗教信仰,通过派遣传教士传播宗教并计算途中可停留的城市数量。使用分块算法解决大规模数据处理问题。

题目描述

由于 Wulala 在上个问题中的精彩表现,公主认为 Wulala 是一个很棒的人,就把 Wulala 留在了 X 国。这时正好公主的一位传教士朋友来拜访公主,于是想找 wulala 帮忙X 国如同一条直线,其中有 n 个城市,从东向西分别编号为 1~n。而他的国家中有 m 种宗教,每个城市一定会有一种信仰的宗教。

有时候有些城市为了获得更多的认可,会派出信仰本城市宗教的传教士前往其他国家。X 国

的传教士都十分厉害,只要是他途经的地方都会改信他所传播的宗教。

传教士们在路上碰到自己宗教的城市自然就不用传教了,可以停下来看看里番啥的,所以每

一个传教士在旅行前都会计算自己可以在多少城市停下来(不包括起始的城市)。

而传教士们都是文科僧,数学是很差的,所以他希望 Wulala 能帮他计算。可 Wulala 数学也不好,但他又不想在公主面前丢脸,你能帮帮他吗?

输入

第一行两个整数 n,m

第二行 n 个整数第 i 个整数代表第 i 各城市信仰的宗教

第三行一个整数 T 代表传教士的个数

接下来 T 行每行两个整数 x,y 代表 x 城向 y 城派遣了一个传教士(保证 x < y)

输出

输出 T 行,第 i 行代表第 i 个传教士询问的答案

样例输入

2 21 221 21 2

样例输出

01

提示


对于 30%的数据 n <= 100000, m <= 10, T <= 100



对于 60%的数据 n <= 100000, m <= 10, T <= 100000



对于 100%的数据 n <= 100000, m <= 300, T <= 100000

正解给的是分块,那就没什么好说的了,每次区间修改直接打标记就可以了,注意暴力修改散点以前下传标记

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define maxn 100005
using namespace std;
int n,m,blo,T;
int bl[maxn],L[maxn],R[maxn];
int mark[maxn],a[maxn];
int read()
{
   int x=0;
   char ch=getchar();
   while(ch<'0'||ch>'9') ch=getchar();
   while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
   return x;  
}
int quiry(int x,int y)
{
    int ans=0;
    if(mark[bl[x]]){
        ans+=min(R[bl[x]],y)-x;
        for(int i=L[bl[x]];i<=R[bl[x]];i++) a[i]=mark[bl[x]];
        mark[bl[x]]=0;
    }
    else{
        for(int i=x+1;i<=min(R[bl[x]],y);i++)
          if(a[x]==a[i]) ans++;  else a[i]=a[x];
    }
    if(bl[x]!=bl[y]){
      if(mark[bl[y]]){
           if(mark[bl[y]]==a[x]) ans+=y-L[bl[y]]+1;
           else{
             for(int i=L[bl[y]];i<=y;i++) a[i]=a[x];
             for(int i=y+1;i<=R[bl[y]];i++) a[i]=mark[bl[y]];
             mark[bl[y]]=0;
           }
      } 
      else{
         for(int i=L[bl[y]];i<=y;i++)
         if(a[i]==a[x]) ans++;
         else a[i]=a[x];
      }
    }
    for(int i=bl[x]+1;i<=bl[y]-1;i++){
        if(mark[i]){
           if(mark[i]==a[x]) ans+=R[i]-L[i]+1;
        }
        else{
              for(int j=L[i];j<=R[i];j++)
              if(a[j]==a[x]) ans++;
              else a[j]=a[x];
        }
        mark[i]=a[x];
    }
    return ans;
}
int main()
{
    scanf("%d%d",&n,&m);
    blo=(int)sqrt(n); 
    for(int i=1;i<=n;i++){ 
       scanf("%d",&a[i]);
       bl[i]=(i-1)/blo+1;
    }
    for(int i=1;i<=bl[n];i++){ L[i]=(i-1)*blo+1; R[i]=min(i*blo,n); }
    scanf("%d",&T);
    int x,y,ans;
    for(int i=1;i<=T;i++){
        x=read();y=read();
        ans=quiry(x,y);
        printf("%d\n",ans);
    }
    //while(1);
    return 0;
}


C语言-光伏MPPT算法:电导增量法扰动观察法+自动全局搜索Plecs最大功率跟踪算法仿真内容概要:本文档主要介绍了一种基于C语言实现的光伏最大功率点跟踪(MPPT)算法,结合电导增量法与扰动观察法,并引入自动全局搜索策略,利用Plecs仿真工具对算法进行建模与仿真验证。文档重点阐述了两种经典MPPT算法的原理、优缺点及其在不同光照和温度条件下的动态响应特性,同时提出一种改进的复合控制策略以提升系统在复杂环境下的跟踪精度与稳定性。通过仿真结果对比分析,验证了所提方法在快速性和准确性方面的优势,适用于光伏发电系统的高效能量转换控制。; 适合人群:具备一定C语言编程基础和电力电子知识背景,从事光伏系统开发、嵌入式控制或新能源技术研发的工程师及高校研究人员;工作年限1-3年的初级至中级研发人员尤为适合。; 使用场景及目标:①掌握电导增量法与扰动观察法在实际光伏系统中的实现机制与切换逻辑;②学习如何在Plecs中搭建MPPT控制系统仿真模型;③实现自动全局搜索以避免传统算法陷入局部峰值问题,提升复杂工况下的最大功率追踪效率;④为光伏逆变器或太阳能充电控制器的算法开发提供技术参考与实现范例。; 阅读建议:建议读者结合文中提供的C语言算法逻辑与Plecs仿真模型同步学习,重点关注算法判断条件、步长调节策略及仿真参数设置。在理解基本原理的基础上,可通过修改光照强度、温度变化曲线等外部扰动因素,进一步测试算法鲁棒性,并尝试将其移植到实际嵌入式平台进行实验验证。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值