zoukankan      html  css  js  c++  java
  • [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 }
  • 相关阅读:
    用ElasticSearch和Protovis实现数据可视化
    分布式搜索elasticsearch配置文件详解
    PHP ElasticSearch的使用
    在Windows .NET平台下使用Memcached
    升級 Centos 6.5 的 php 版本
    elasticsearch-查询基础篇
    Elasticsearch 权威指南
    [转] Mongoose初使用总结
    [转] 深入浅出mongoose-----包括mongoose基本所有操作,非常实用!!!!!
    [转] mongodb下载、安装、配置与使用
  • 原文地址:https://www.cnblogs.com/Gster/p/5090529.html
Copyright © 2011-2022 走看看