• [tsA1490][2013中国国家集训队第二次作业]osu![概率dp+线段树+矩阵乘法]


    这样的题解只能舔题解了,,,qaq

    清橙资料里有。。

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstdlib>
      4 #include <cstring>
      5 #include <cmath>
      6 #include <ctime>
      7 #include <algorithm>
      8 
      9 using namespace std;
     10 
     11 struct Matrix
     12 {
     13     double    a,b,c,d;
     14 };
     15 
     16 struct node
     17 {
     18     double    S0,S1;
     19     Matrix    S2;
     20 }tree[2100000];
     21 
     22 double    a[510000];
     23 
     24 void    push_up(const int num,const int pos)
     25 {
     26     node &temp1=tree[num<<1],&temp2=tree[num<<1|1];
     27     tree[num].S0=temp1.S0+temp2.S0-a[pos]*a[pos+1];
     28     tree[num].S1=temp1.S1+temp2.S1;
     29     Matrix t1=temp1.S2,t2=temp2.S2;
     30     tree[num].S2=(Matrix){t1.a*t2.a,t1.a*t2.b+t1.b,t1.c*t2.a+t2.c,t1.c*t2.b+t1.d+t2.d};
     31     return ;
     32 }
     33 
     34 void    Change(const int l,const int r,const int num,const int s,const node d)
     35 {
     36     if(l==r)
     37     {
     38         a[l]=d.S0;
     39         tree[num]=d;
     40         return ;
     41     }
     42 
     43     int    mid=l+((r-l)>>1);
     44 
     45     if(s<=mid)Change(l,mid,num<<1,s,d);
     46     else      Change(mid+1,r,num<<1|1,s,d);
     47 
     48     push_up(num,mid);
     49     return ;
     50 }
     51 
     52 node    Calc(const node temp1,const node temp2,const int pos)
     53 {
     54     node A;
     55 
     56     A.S0=temp1.S0+temp2.S0-a[pos]*a[pos+1];
     57     A.S1=temp1.S1+temp2.S1;
     58 
     59     Matrix t1=temp1.S2,t2=temp2.S2;
     60     A.S2=(Matrix){t1.a*t2.a,t1.a*t2.b+t1.b,t1.c*t2.a+t2.c,t1.c*t2.b+t1.d+t2.d};
     61 
     62     return A;
     63 }
     64 
     65 node    Query(const int l,const int r,const int num,const int s,const int t)
     66 {
     67     if(s<=l && r<=t)
     68         return tree[num];
     69 
     70     int    mid=l+((r-l)>>1);
     71 
     72     if(t<=mid)return Query(l,mid,num<<1,s,t);
     73     if(s>mid) return Query(mid+1,r,num<<1|1,s,t);
     74     return Calc(Query(l,mid,num<<1,s,t),Query(mid+1,r,num<<1|1,s,t),mid);
     75 }
     76 
     77 int main()
     78 {
     79     int    n,m,i,op;
     80 
     81     scanf("%d%d",&n,&m);
     82 
     83     for(i=1;i<=n;++i)
     84         scanf("%lf",&a[i]);
     85     for(i=1;i<=n;++i)
     86         Change(1,n,1,i,(node){a[i],a[i],(Matrix){a[i],a[i]*2,a[i],a[i]}});
     87 
     88     for(i=1;i<=m;++i)
     89     {
     90         scanf("%d",&op);
     91         
     92         if(op==0)
     93         {
     94             int x,y;
     95             scanf("%d%d",&x,&y);
     96 
     97             node temp=Query(1,n,1,x,y);
     98             printf("%.2f
    ",temp.S0+temp.S1+temp.S2.d);
     99         }
    100 
    101         if(op==1)
    102         {
    103             int x;
    104             double y;
    105 
    106             scanf("%d%lf",&x,&y);
    107             Change(1,n,1,x,(node){y,y,(Matrix){y,y*2,y,y}});
    108         }
    109     }
    110     return 0;
    111 }
  • 相关阅读:
    关于文件路径的生成
    re模块小结
    logging模块知识点及应用小结
    微信小程序上传图片
    小程序图表插件
    小程序实现多图上传、预览
    微信小程序实现验证码倒计时效果
    微信小程序上传图片,视频及预览
    小程序实现星级打分
    小程序获取系统日期时间
  • 原文地址:https://www.cnblogs.com/Gster/p/5090529.html
Copyright © 2020-2023  润新知