[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\n",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 }
时间: 2024-10-11 10:37:02

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

[TS-A1489][2013中国国家集训队第二次作业]抽奖[概率dp]

概率dp第一题,开始根本没搞懂,后来看了09年汤可因论文才基本搞懂,关键就是递推的时候做差比较一下,考虑新加入的情况对期望值的贡献,然后推推公式(好像还是不太会推qaq...) 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 int n,m; 6 long double a[110000]; 7 8 long double POW(const long double t,int b) 9 { 10 long double r=1,

[TS-A1486][2013中国国家集训队第二次作业]树[树的重心,点分治]

首先考虑暴力,可以枚举每两个点求lca进行计算,复杂度O(n^3logn),再考虑如果枚举每个点作为lca去枚举这个点的子树中的点复杂度会大幅下降,如果我们将每个点递归考虑,每次计算过这个点就把这个点删掉,那么如果每次删掉的点是当前子树的重心,枚举点对的复杂度就只有O(logn),对于每次查询答案在trie树中找到时间复杂度基本可视为O(1),最后在分治同时考虑“关键点”即可.总复杂度O(nlogn). 1 #include <iostream> 2 #include <algorith

[tsA1491][2013中国国家集训队第二次作业]家族[并查集]

m方枚举,并查集O(1)维护,傻逼题,,被自己吓死搞成神题了... 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 struct tri { int x,y,z; bool operator<(const tri & temp)const { return z<temp.z; } }; 6 7 int n,m,k,Sum,Ans=0x7fffffff,a[1100],Size[1100],f[1100]; 8

[TS-A1505] [清橙2013中国国家集训队第二次作业] 树 [可持久化线段树,求树上路径第k大]

按Dfs序逐个插入点,建立可持久化线段树,每次查询即可,具体详见代码. 不知道为什么,代码慢的要死,, #include <iostream> #include <algorithm> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <ctime> #include <vector> using

&lt; &lt; &lt; 2013年国家集训队作业 &gt; &gt; &gt;

完成题数/总题数:  1道/37道 1.  A1504. Book(王迪): 数论+贪心   ★★☆

HDU-DuoXiao第二场hdu 6315 Naive Operations 线段树

hdu 6315 题意:对于一个数列a,初始为0,每个a[ i ]对应一个b[i],只有在这个数字上加了b[i]次后,a[i]才会+1. 有q次操作,一种是个区间加1,一种是查询a的区间和. 思路:线段树,一开始没用lazy,TLE了,然后开始想lazy的标记,这棵线段树的特点是,每个节点维护 :一个区间某个a 要增加1所需个数的最小值,一个区间已加上的mx的最大值标记,还有就是区间和sum. (自己一开始没有想到mx标记,一度想把lazy传回去. (思路差一点就多开节点标记. #include

国家集训队2011 happiness

[试题来源] 2011中国国家集训队命题答辩 [问题描述] 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科或者理科,那么他们又将收获一些喜悦值.作为计算机竞赛教练的scp大老板,想知道如何分配可以使得全班的喜悦值总和最大. [输入格式] 第一行两个正整数n,m.接下来是六个矩阵第一个矩阵为n行m列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学

国家集训队2011]happiness(吴确)

1873. [国家集训队2011]happiness(吴确) ★★★   输入文件:nt2011_happiness.in   输出文件:nt2011_happiness.out   简单对比时间限制:1 s   内存限制:512 MB [试题来源] 2011中国国家集训队命题答辩 [问题描述] 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科或者理科,

[国家集训队2011]happiness(吴确) (最小割)

2017-08-09 19:03:49 [试题来源] 2011中国国家集训队命题答辩 [问题描述] 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科或者理科,那么他们又将收获一些喜悦值.作为计算机竞赛教练的scp大老板,想知道如何分配可以使得全班的喜悦值总和最大. [输入格式] 第一行两个正整数n,m.接下来是六个矩阵第一个矩阵为n行m列 此矩阵的第i行