• 2017 CCPC 杭州 HDU6273J 区间修改(线段树&差分数组)


    http://acm.hdu.edu.cn/downloads/CCPC2018-Hangzhou-ProblemSet.pdf

    解析 线段树区间延迟更新 或 差分数组 两个数   统计2和3的最少的个数  乘一下

    差分数组https://blog.csdn.net/yao166164474/article/details/52675613

    AC代码

      1 #include<iostream>
      2 #include<cstring>
      3 #include<cstdio>
      4 #include<map>
      5 #include<algorithm>
      6 #include<cmath>
      7 #define ll long long
      8 #define PI acos(-1.0)
      9 const int inf = 0x3f3f3f3f,mod=998244353;
     10 using namespace std;
     11 struct node
     12 {
     13     ll l,r;
     14     ll add;
     15     ll sum;
     16 } tree1[600005],tree2[600005];
     17 void pushup(ll root,node tree[])
     18 {
     19     tree[root].sum=min(tree[root<<1].sum,tree[root<<1|1].sum);
     20 }
     21 void  buildtree(ll root,ll left,ll right,node tree[])
     22 {
     23     tree[root].l=left;
     24     tree[root].r=right;
     25     tree[root].add=0;//wa点 所有的延迟标记都要初始化
     26     if(left==right)//不能放到下面的if中
     27     {
     28         tree[root].sum=0;
     29         return ;
     30     }
     31     ll mid=(left+right)>>1;
     32     buildtree(root<<1,left,mid,tree);
     33     buildtree(root<<1|1,mid+1,right,tree);
     34     pushup(root,tree);
     35 }
     36 void pushdown(ll root,node tree[])
     37 {
     38     if(tree[root].add==0) return ;
     39     tree[root<<1].add+=tree[root].add;//wa点 这里是增加而不是赋值
     40     tree[root<<1|1].add+=tree[root].add;
     41     tree[root<<1].sum+=tree[root].add;
     42     tree[root<<1|1].sum+=tree[root].add;
     43     tree[root].add=0;
     44 }
     45 void updata(ll root,ll left,ll right,ll c,node tree[])
     46 {
     47     if(tree[root].l==left&&tree[root].r==right)
     48     {
     49         tree[root].add+=c;//wa点 这里是增加而不是赋值
     50         tree[root].sum+=c;
     51         return ;
     52     }
     53      pushdown(root,tree);
     54     ll mid=(tree[root].l+tree[root].r)>>1;
     55     if(right<=mid)
     56         updata(root<<1,left,right,c,tree);
     57     else
     58     {
     59         if(left>mid)
     60             updata(root<<1|1,left,right,c,tree);
     61         else
     62         {
     63             updata(root<<1,left,mid,c,tree);
     64             updata(root<<1|1,mid+1,right,c,tree);
     65         }
     66     }
     67     pushup(root,tree);
     68 }
     69 ll poww(ll n,ll m)
     70 {
     71     ll ans = 1;
     72     while(m > 0)
     73     {
     74         if(m & 1)ans = (ans * n) % mod;
     75         m = m >> 1;
     76         n = (n * n) % mod;
     77     }
     78     return ans%mod;
     79 }
     80 ll n,q;
     81 char what;
     82 ll l1,r1,ad;
     83 int main()
     84 {
     85     int t;
     86     cin>>t;
     87     while(t--)
     88     {
     89         scanf("%lld %lld",&n,&q);
     90         buildtree(1,1,n,tree1);
     91         buildtree(1,1,n,tree2);
     92         while(q--)
     93         {
     94             scanf("%lld %lld %lld",&l1,&r1,&ad);
     95             if(ad==2)
     96             {
     97                 updata(1,l1,r1,1,tree1);
     98             }
     99             else if(ad==3)
    100             {
    101                 updata(1,l1,r1,1,tree2);
    102             }
    103         }
    104         cout<<poww(2,tree1[1].sum)*poww(3,tree2[1].sum)%mod<<endl;
    105     }
    106     return 0;
    107 }
  • 相关阅读:
    04_Windows平台Spark开发环境构建
    Hadoop Streaming 使用及参数设置
    Kafka 及 PyKafka 的使用
    Database Subquery
    Miscellaneous
    Emacs
    算法归纳
    逆元求组合数
    Elasticsearch 原理
    Linux的内存分页管理【转】
  • 原文地址:https://www.cnblogs.com/stranger-/p/8922333.html
Copyright © 2020-2023  润新知