• E - Replace Digits(线段树)


    Problem Statement

    E - Replace Digits

    You have a string SS of length NN. Initially, all characters in SS are 1s.

    You will perform queries QQ times. In the ii-th query, you are given two integers L_i, R_iLi​,Ri​ and a character D_iDi​ (which is a digit). Then, you must replace all characters from the L_iLi​-th to the R_iRi​-th (inclusive) with D_iDi​.

    After each query, read the string SS as a decimal integer, and print its value modulo 998,244,353998,244,353.

    Constraints

    • 1 \leq N, Q \leq 200,0001≤N,Q≤200,000
    • 1 \leq L_i \leq R_i \leq N1≤Li​≤Ri​≤N
    • 1 \leq D_i \leq 91≤Di​≤9
    • All values in input are integers.

    Input

    Input is given from Standard Input in the following format:

    NN QQ
    L_1L1​ R_1R1​ D_1D1​
    ::
    L_QLQ​ R_QRQ​ D_QDQ​
    

    Output

    Print QQ lines. In the ii-th line print the value of SS after the ii-th query, modulo 998,244,353998,244,353.


    Sample Input 1 Copy

    Copy

    8 5
    3 6 2
    1 4 7
    3 8 3
    2 2 2
    4 5 1
    

    Sample Output 1 Copy

    Copy

    11222211
    77772211
    77333333
    72333333
    72311333
    

    题意:有一个长为n的串,初始的每个位置都是1

    m个操作,每次操作l r x,把l~r这一段位置上的每个数都改成x

    每次修改之后看总的串膜上998,244,353之后的结果

    思路:先建树

    sum表示l~r这段的总数,s表示l~r这段的数应该乘的数位,lazy表示懒标记

    建树的时候sum和s随着更新

    但是修改的时候只有sum在更新,因为l~r这段应该乘的位数是不变的

    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. const int N=2e5+10;
    4. const long long mod=998244353;
    5. typedef long long ll;
    6. struct name{
    7. int l,r;
    8. ll sum,lazy,s;
    9. }tr[N*4];
    10. int n,m;
    11. ll a[N];
    12. void pushup(int u){
    13. tr[u].sum =(tr[u<<1].sum+tr[u<<1|1].sum )%mod;
    14. tr[u].s =(tr[u<<1].s +tr[u<<1|1].s)%mod;
    15. }
    16. void build(int u,int l,int r){
    17. if(l==r){
    18. tr[u]={l,r,a[l],0,a[l]};
    19. }else{
    20. int mid=l+r>>1;
    21. tr[u]={l,r,0,0,0};
    22. build(u<<1,l,mid);
    23. build(u<<1|1,mid+1,r);
    24. pushup(u);
    25. }
    26. }
    27. void pushdown(int u){
    28. if(tr[u].lazy ){
    29. tr[u<<1].lazy =tr[u].lazy ;
    30. tr[u<<1].sum =tr[u<<1].s *tr[u].lazy %mod;
    31. tr[u<<1|1].lazy =tr[u].lazy ;
    32. tr[u<<1|1].sum =tr[u<<1|1].s *tr[u].lazy %mod;
    33. tr[u].lazy =0;
    34. }
    35. }
    36. void modify(int u,int l,int r,ll x){
    37. if(l<=tr[u].l &&r>=tr[u].r ){
    38. tr[u].lazy =x;
    39. tr[u].sum =tr[u].s *x%mod;
    40. }else{
    41. pushdown(u);
    42. int mid=tr[u].l +tr[u].r >>1;
    43. if(l<=mid)modify(u<<1,l,r,x);
    44. if(r>mid)modify(u<<1|1,l,r,x);
    45. tr[u].sum =(tr[u<<1].sum +tr[u<<1|1].sum)%mod;
    46. }
    47. }
    48. int main(){
    49. scanf("%d%d",&n,&m);
    50. a[n]=1;
    51. for(int i=n-1;i>=1;i--){
    52. a[i]=a[i+1]*10%mod;
    53. }
    54. build(1,1,n);
    55. while(m--){
    56. int l,r;
    57. ll x;
    58. scanf("%d%d%lld",&l,&r,&x);
    59. modify(1,l,r,x);
    60. printf("%lld\n",tr[1].sum );
    61. }
    62. return 0;
    63. }

  • 相关阅读:
    t-io websocket的聊天功能学习记录(二)
    JVM指令手册
    使用Julia语言和R语言实现K-均值
    RabbitMQ四种交换机类型
    实现旅行售货员问题的回溯算法
    SpringCloud和SpringBoot在调Feign传文件时的异常汇总及解决办法
    HTTP/2是什么?和HTTP/1.1有什么不同?和SPDY有什么不同?
    leetcode 3. 无重复字符的最长子串
    自然语言处理学习笔记(十二)————语言模型
    Postgresql源码(91)POSIX匿名信号量初始化与使用流程总结
  • 原文地址:https://blog.csdn.net/qq_61903556/article/details/127969200