数字串

来源:牛客网:

题目描述

一个只含数字的字符串,q次操作,每次操作将第i位数字改为x,每次操作后,统计长度在[l, r]之间且首数字大于尾数字的子串的个数。

输入描述:
第一行一个只含数字的字符串;
第二行3个整数q, l, r;
接下来q行,每行两个整数i, x。
输出描述:
输出q行,每行一个整数,表示长度在[l, r]之间且首数字大于尾数字的子串的个数。
示例1
输入
复制

585605
2 2 4
1 6
4 2

输出
复制

7
8

备注:

设字符串长度为n则: 1 <= n <= 100000; 1 <= q <= 100000; 1 <= l <= r <= n; 1 <=
i <= n; 0 <= x <= 9;

题解:

题意很明确,可以用树状数组和线段树来做
我用的树状数组,用到一个二维的数组,0~9的每个数组为一维,记录的是该范围内数组x出现的次数
虽然是二维数组sum[x][y],但其实大部分操作和一维树状数组是一样的,因为数组sum中的x是给定的,只剩下一个y来变动
本题中有两个操作,一个是修改数,一个是输出结果
在每次输出时我们要先将指定位置原来的数删去,因为不这样的话查询新值的时候可能会把当前没有更新的值算进去。即add(now,pos,-1)
在查询结果的代码中,会出现连续的四个for循环,我来讲解一下:

	for(int j = 0;j< now;j++)ans-= query(j,pos+l-1,pos+r-1);//包含第pos位的区间, for(int j = 0;j< x;j++)ans+= query(j,pos+l-1,pos+r-1);for(int j = now+1;j<= 9;j++)ans-= query(j,pos-r+1,pos-l+1);for(int j = x+1;j<= 9;j++)ans+= query(j,pos-r+1,pos-l+1);

要先记住一个条件:
我们要替代的位置是pos,该位置的数原本是now,要替换成x
题目要求统计长度在[l, r]之间且首数字大于尾数字的子串的个数
第一个for:因为now被替代了,那以now为首字母,以小于now的数为尾数子所构成的子串就不存在了,所以查询区间[pos+l-1,pos+r-1]内小于now数的数量,这就是不存在的子串数。为什么区间是[pos+l-1,pos+r-1]呢?因为被代替的位置是pos,题目要求的是长度在[l, r]的子串,所以从pos往后l和r才是我们所要的区间
第二个for:正好与第一个相反,因为x的加入,所以以x为首字母,小于x的数为尾字母所构成的子串增加,所以要加上,就是上一个翻版
第三个for:因为now没了,那以now为尾字母,以大于now的数为首字母的数所构成的子串也没了,所以要减去
第四个for:是第三个for的翻版
总结一下:因为now的离开和x的加入,导致以now为首字母和以now为尾字母的情况不再存在,而以x为首字母和以x为尾字母的情况增加
最后记得:要把x加入到树状里

add(x,pos,1); 

感觉讲的足够详细了

代码:

#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define mod 1000000007
using namespace std;
typedef long long ll;
const int maxn = 2e5+5;
const double esp = 1e-12;
const int ff = 0x3f3f3f3f;
map<int,int>::iterator it;int n,q,l,r;
char s[maxn];
ll sum[11][maxn];int lowbit(int x)
{return x&(-x);
}ll get_sum(int num,int x)//计算区间和?
{ll ans = 0;for(int i = x;i>= 1;i-= lowbit(i))ans+= sum[num][i];return ans;
}ll query(int num,int l,int r)
{if(l> n||r< 1) return 0;l = max(1,l);//注意细节r = min(n,r);return get_sum(num,r)-get_sum(num,l-1);
}void add(int num,int x,int val)//更新num这个数的那一维?
{for(int i = x;i<= n;i+= lowbit(i))sum[num][i]+= val;
}int main()
{scanf("%s",s+1);cin>>q>>l>>r;n = strlen(s+1);for(int i = 1;i<= n;i++)add(s[i]-'0',i,1);//更新树状数组?ll ans = 0;for(int i = 1;i<= n;i++)for(int j = 0;j< s[i]-'0';j++)ans+= query(j,i+l-1,i+r-1);//查询 i+l-1,i+r-1之间比他小的数while(q--){int pos,x,now;scanf("%d %d",&pos,&x);now = s[pos]-'0';//被代替的数//x是替代的数 add(now,pos,-1);//注意要先减掉,因为不这样的话查询新值的时候可能会把当前没有更新的值算进去for(int j = 0;j< now;j++)ans-= query(j,pos+l-1,pos+r-1);//包含第pos位的区间, for(int j = 0;j< x;j++)ans+= query(j,pos+l-1,pos+r-1);for(int j = now+1;j<= 9;j++)ans-= query(j,pos-r+1,pos-l+1);for(int j = x+1;j<= 9;j++)ans+= query(j,pos-r+1,pos-l+1);add(x,pos,1); s[pos] = x+'0';printf("%lld\n",ans);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319211.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【随机】Kuroni and the Punishment(CF1305F)

正题 luogu CF1305F 题目大意 给你n个数&#xff0c;每次操作可以使一个数1或-1&#xff0c;让你用最小的操作数使所有数的gcd>1 解题思路 显然把所有数都修改为偶数可以得到 2|gcd&#xff0c;且步数 ≤n\leq n≤n 对于其它方案&#xff0c;至少有一半的数修改次数小于…

hdu5909-Tree Cutting【FWT】

正题 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid5909 题目大意 给出nnn和mmm&#xff08;m2km2^km2k&#xff09;。再给出一个大小为nnn的树&#xff0c;每个点有点权&#xff0c;对于每个i∈[1,m)i\in[1,m)i∈[1,m)求有多少个联通子图的点权异或和为iii 1≤T≤10…

codeforces1455 D. Sequence and Swaps

昨天晚上巨困&#xff0c;就没有打&#xff0c;今天课间的时候就看了一下D题&#xff0c;发现好像可以瞎搞&#xff0c;于是吃完饭就写了一下&#xff0c;调过样例一次就A了qaq。 D. Sequence and Swaps 枚举贪心 由于数据范围n≤500n\leq500n≤500&#xff0c;由此我们可以在…

珂朵莉的数列

来源&#xff1a;牛客网&#xff1a; 题目描述 珂朵莉给了你一个序列&#xff0c;有n(n1)/2 ​ 个子区间&#xff0c;求出她们各自的逆序对个数&#xff0c;然后加起来输出 输入描述: 第一行一个数 n 表示这个序列 a 的长度 之后一行 n 个数&#xff0c;第i个数表示ai 输出…

aspnet core 2.1中使用jwt从原理到精通二

在aspnet core中&#xff0c;自定义jwt管道验证有了上一节的内容作为基础&#xff0c;那这点也是非常容易的&#xff0c;关键点在中间件&#xff0c;只是把上一级在测试类中的自定义验证放到中间件中来即可&#xff0c;不过需要注意&#xff1a;中间件 的位置很重要&#xff0c…

【线段树】Traffic Jams in the Land(CF498D)

正题 luogu CF498D 题目大意 给n个1-6的数&#xff0c;让你进行以下操作&#xff1a; 修改其中一个数从第x个数走到第y个数&#xff08;x≤yx\leq yx≤y&#xff09;&#xff0c;到达一个点时&#xff0c;如果当前时间能被该数整除&#xff0c;那么时间2&#xff0c;否则1&a…

P4201-[NOI2008]设计路线【结论,树形dp】

正题 题目链接:https://www.luogu.com.cn/problem/P4201 题目大意 给出nnn个点的一棵树开始所有边都是白色&#xff0c;选出若干条没有公共点的路径将上面所有边变为黑色。 要求所有点到111号点的路径上经过的白色边的数量的最大值最小。 求最小值和方案数 解题思路 直接记…

codeforces1453 D. Checkpoints

以为又要掉分了&#xff08;结果没掉说明太菜了&#xff09;&#xff0c;写完ABC还有45分钟&#xff0c;推式子一直没啥结果&#xff0c;最后10分钟想到D题的一个性质&#xff0c;可惜没时间了~ D. Checkpoints Heltion大佬题解 性质&#xff1a;把形如100…01 \ 0 \ 0 \dots…

CentOS开发ASP.NET Core入门教程

因为之前一直没怎么玩过CentOS&#xff0c;大多数时间都是使用Win10进行开发&#xff0c;然后程序都部署在Window Server2008或者Window Server2012上&#xff01;因此想尝试下Linux系统。最后经过选型选了比较流行的CentOS系统。正好&#xff0c;今晚要加班&#xff0c;所以在…

Java的学习与java大数运算

之前就学过一点java&#xff0c;但太久没用知识点早就还给书本&#xff0c;之前在实验室搞到一本java的书&#xff0c;今天来重新温习一下 java的语法大部分和c语言是一样的&#xff0c;入门非常快&#xff0c;所以在这里基础语句的用法就省略了 输出&#xff1a; System.out.…

【DP】【容斥】Nice to Meet You(AT3634)

正题 luogu AT3634 题目大意 给你一个图&#xff0c;让你给图上的边定方向&#xff0c;问1,2两个点可以到同一个点的方案数 解题思路 直接求可以到同一个点不好求&#xff0c;可以用总方案数减去不合法方案数&#xff0c;即到不了同一个点的方案数 那么就是有若干点把1,2分…

codeforces1453 E. Dog Snacks

E. Dog Snacks Heltion大佬题解 fuf_ufu​表示节点uuu到最近叶子节点的距离。 首先不难发现&#xff0c;考虑一棵子树根节点为uuu&#xff0c;一定每次都把一整棵子树上的食物吃完&#xff0c;然后再去别的子树。 由于每次狗总是先去离他最近的节点&#xff0c;如果我们把一…

工厂参观记:.NET Core 中 HttpClientFactory 如何解决 HttpClient 臭名昭著的问题

在 .NET Framework 与 .NET Core 中 HttpClient 有个臭名昭著的问题&#xff0c;HttpClient 实现了 IDispose 接口&#xff0c;但当你 Dispose 它时&#xff0c;它不会立即关闭所使用的 tcp 连接&#xff0c;而是将 tcp 连接置为 TIME_WAIT 状态&#xff0c;240秒&#xff08;4…

数据结构题(莫队算法)

数据结构题 题目&#xff1a; 问在区间[l,r]和[l1,r1]内x的出现次数的乘积是多少&#xff1f; 题解&#xff1a; 莫队算法的模板题 关于莫队算法你可以参考这个 我这里简单的说说我对莫队的理解&#xff1a; 莫队是一个优雅的暴力&#xff0c;就是将原本复杂度不能过的程序…

AT4120-[ARC096D]Sweet Alchemy【贪心,背包】

正题 题目链接:https://www.luogu.com.cn/problem/AT4120 题目大意 给出nnn个物品和一个容量mmm&#xff0c;第iii个物品体积为cic_ici​。除了第一个物品每个物品还有一个pi(pi<i)p_i(p_i<i)pi​(pi​<i)表示如果pip_ipi​个物品选择了xxx个&#xff0c;第iii个物品…

【DP】Table(CF232B)

正题 luogu CF232B 题目大意 给你一个 nmn\times mnm 的网格&#xff0c;问你有多少种放点方案可以满足每个 nnn\times nnn 的网格内都恰好有 kkk 个点 解题思路 不难发下&#xff0c;nnn\times nnn 的格子往下移一行&#xff0c;新的一行和刚过的一行点的数量一样 那么设 …

枚举子集dp

枚举子集 二进制枚举子集下面代码就是枚举的s的子集&#xff08;二进制状态压缩&#xff09; for(int is;i;i(i-1)&s){//i表示的就是s的子集}枚举所有子集的子集的时间复杂度 比如一个有n个元素构成的集合&#xff0c;子集的数量是2n2^n2n&#xff0c;现要求枚举所有子集的…

数列互质(莫队算法)

数列互质 题目描述 给出一个长度为 n 的数列 { a[1] , a[2] , a[3] , … , a[n] }&#xff0c;以及 m 组询问 ( l[i] , r[i] , k[i])。 求数列下标区间在 [ l[i] , r[i] ] 中有多少数在该区间中的出现次数与 k[i] 互质&#xff08;最大公约数为1&#xff09;。 输入描述: 第一…

P3211-[HNOI2011]XOR和路径【高斯消元】

正题 题目链接:https://www.luogu.com.cn/problem/P3211 题目大意 一个nnn个点mmm条边的无向图&#xff0c;从111到nnn随机游走。求期望路径异或和。 2≤n≤100,1≤m≤1042\leq n\leq 100,1\leq m\leq 10^42≤n≤100,1≤m≤104 解题思路 因为是异或的期望&#xff0c;很难直…

【随机】Ghd(CF364D)

正题 luogu CF364D 题目大意 给你一个大小为n的集合&#xff0c;选择一个至少为一半的子集&#xff0c;另其gcd最大 解题思路 由于数字个数很多&#xff0c;考虑随机 随机选10个数&#xff0c;对于每个数&#xff0c;先处理出约数&#xff0c;然后求出所有数和当前数的gcd&…