首页 > 其他分享 >洛谷P6492

洛谷P6492

时间:2024-10-11 15:02:17浏览次数:6  
标签:洛谷 lc int sum mid P6492 rc include

题意:对一个点进行修改,然后进行查询符合条件的子串。思路:单点修改+查询,很容易想到线段树,用线段树来存,考虑每一次修改后进行合并,然后看能不能合并于是用3个数组来表示,分别表示该节点编号下的区间内最长的01串的前后缀的长度。

点击查看代码
#include <iostream>
#include <stack>
#include <cmath>
#include <algorithm>
#include <set>
#include <vector>
#include <climits>
#include <string.h>
#include <map>
#include <queue>
#include <list>
#include <cmath>
#include <iomanip> 
#define int long long 
#define ios ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define lc u<<1
#define rc u<<1|1
#define gcd __gcd
#define double long double
#define endl "\n"
#define INF LLONG_MAX
#define mod  1000000007
#define N 200005
const double PI = 3.14159265358979323846;
using namespace std;
int n, m;
int a[N], sum[N*4], lsum[N*4], rsum[N*4];//分别代表区间内最大的01字串一个前缀区间最大的01字串一个后缀区间最大的01字串
void push_up(int u, int l, int r)
{
    int mid = l + r >> 1;
    int L = mid - l + 1, R = r - mid;//左右孩子长
    lsum[u] = lsum[lc], rsum[u] = rsum[rc], sum[u] = max(sum[lc], sum[rc]);//先从左右孩子身上找最值
    if (a[mid] != a[mid + 1])//考虑连接情况
    {
        sum[u] = max(sum[u], rsum[lc] + lsum[rc]);//维护最大值
        if (sum[lc] == L)lsum[u] = L + lsum[rc];//可以前面加上后面的前缀和长度
        if (sum[rc] == R)rsum[u] = R + rsum[lc];//后面可以加上前面的后缀和长度
    }
}
void build(int u, int l, int r)
{
    sum[u] = 1;lsum[u] = 1;rsum[u] = 1;//初始化
    if (l == r)return;
    int mid = l + r >> 1;
    build(lc, l, mid); build(rc, mid + 1, r);
    push_up(u, l, r);
}
void update(int u, int l, int r, int idx)
{
    if (l == r && l == idx)
    {
        a[l] ^= 1;
        return;
    }
    int mid = l + r >> 1;
    if (idx <= mid)update(lc, l, mid, idx);
    else update(rc, mid + 1, r, idx);
    push_up(u, l, r);
}
signed main() {
    ios;
    cin >> n >> m;
    build(1, 1, n);
    while (m--)
    {
        int x; cin >> x;
        update(1, 1, n, x);
        cout << sum[1] << endl;
    }
    return 0;
}

标签:洛谷,lc,int,sum,mid,P6492,rc,include
From: https://www.cnblogs.com/youyong1/p/18458376

相关文章

  • 洛谷P3375
    kmp算法:扫描字符串A,并且更新可以匹配到B的什么位置。时间复杂度O(n)。P[i]表示当前模式串在该位置匹配冲突时,应该将模式串的哪一位与此对齐。总之就是扫描字符串A,并更新2可以匹配到什么位置点击查看代码#include<bits/stdc++.h>#defineiosios::sync_with_stdio(false);c......
  • 洛谷P10387 [蓝桥杯 2024 省 A] 训练士兵
    洛谷P10387[蓝桥杯2024省A]训练士兵1.Mysolution#include<stdio.h>#include<algorithm>#include<cmath>#include<iostream>#include<set>#include<string>#defineFor(i,j,n)for(inti=j;i<=n;++i)template&l......
  • 洛谷P2224产品加工(DP)
    [HNOI2001]产品加工题目描述某加工厂有A、B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成。由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时由两台机器共同进行加工,所完成任务又会不同。某一天,加工厂接到\(n\)个......
  • 洛谷P4074糖果公园(带修莫队)
    [WC2013]糖果公园题目描述Candyland有一座糖果公园,公园里不仅有美丽的风景、好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园游玩。糖果公园的结构十分奇特,它由\(n\)个游览点构成,每个游览点都有一个糖果发放处,我们可以依次将游览点编号为\(1\)......
  • 洛谷 P7517 [省选联考 2021 B 卷] 数对
    题目传送门解题思路其实你只要知道:这题你就秒了。我们发现 ,于是开一个桶来统计每个数出现的数量。我们只需要枚举每一个数的倍数,然后统计。最后,如果一个数出现了多次,再特判一下即可。代码#include<bits/stdc++.h>usingnamespacestd;intn;intcnt[500001];......
  • 洛谷题单指南-字符串-P2580 于是他错误的点名开始了
    原题链接:https://www.luogu.com.cn/problem/P2580题意解读:给n个字符串,再依次处理m个字符串,对于每个字符串,如果在前面n个字符串中输出OK,如果不在n个字符串中输出WRONG,如果在n个字符串中且不止一次查询过输出REPEAT。解题思路:1、set/map方法很简单直接,用set存下前n个字符串,map......
  • 洛谷题单指南-字符串-P1481 魔族密码
    原题链接:https://www.luogu.com.cn/problem/P1481题意解读:在n个字符串中找到最长的词链长度,定义字符串a、b、c可以形成词链,即a是b的前缀、b是c的前缀。解题思路:1、Trie树定义Trie树,也称前缀树、字典树,核心思想是将字符串拆解为单个字符,每个字符是树的一条边,节点是字符添加到树......
  • 洛谷题单指南-字符串-P4391 [BOI2009] Radio Transmission 无线传输
    原题链接:https://www.luogu.com.cn/problem/P4391题意解读:s1由若干个s2组成,求s2的最小长度,注意题目中说明s1是子串,但是不影响,可以认为s1是补全的由若干s2组成的字符串。解题思路:设s1由x个s2组成,如图所示设s1的Next数组从0开始,那么其最长相同前后缀长度为x-1个s2,即Next[s1.siz......
  • 洛谷P3258 [JLOI2014] 松鼠的新家
    Problem给定一棵树,再给出其在树上的移动顺序,从\(a_1\)开始,在\(a_n\)结束,求出每个节点最少需要经过多少次(终点即\(a_n\)的最后一次到达不算)。其中\(n\le3\times10^5\),\(1\lea_i\len\)且保证a是1~n的排列Solve不难想到最少遍历的次数就是全走最短路,而一棵树中u->v的最短......
  • 洛谷 P7469 [NOI Online 2021 提高组] 积木小赛(字符串哈希)
    题目传送门解题思路读题后,我们可以发现,字母串  只能从两边删除,于是我们可以枚举一个区间 ,然后在字母串  中匹配(可以用指针来进行匹配),同时可以做字符串哈希去重。注意如果怕被卡,可以用双模哈希;记得开longlong代码#include<bits/stdc++.h>usingnamespacestd;......