BZOJ4817 SDOI2017 相關分析
阿新 • • 發佈:2017-09-09
mes getchar() 觀測 tac 記得 clu simple 為我 練習
表示這些觀測數據中y的平均數,即
xx=Σx_i/(R-L+1)(L<=i<=R)
yy=Σy_i/(R-L+1)(L<=i<=R)
如果直線方程是y=ax+b,那麽a應當這樣計算:
a=(Σ(x_i-xx)(y_i-yy))/(Σ(x_i-xx)(x_i-xx)) (L<=i<=R)
你需要幫助Frank計算a。
2 L,R,S,T:
Frank發現測量數據第L組到底R組數據有誤差,對每個i滿足L <= i <= R,x_i需要加上S,y_i需要加上T。
3 L,R,S,T:
Frank發現第L組到第R組數據需要修改,對於每個i滿足L <= i <= R,x_i需要修改為(S+i),y_i需要修改為(T+i)。
1 2 3
1 2 3
1 1 3
2 2 3 -3 2
1 1 2
3 1 2 2 1
1 1 3
-1.5000000000
-0.6153846154 本來我是不會想起這道題的。但是有這麽一個故事:
開學,學科,數學課,變量的相關性。 下課後,同學們聚在一起搞事。 QT:“你記不記得SDOI2017 D2T3 相關分析?” 我:“……蛤?” QT:“題目沒給你化簡,數學書上化簡了。” 我:“……蛤?” QT:“拆開式子之後有4個東西要維護,我不會(想)寫。” 我:“……蛤?” ………… 在機房寫作業。 QT:“不行這個數學作業太難算了,我要編程計算。” Anson:“你可以打一波SDOI2017 相關分析。” QT(虛偽地):“我不會打。” 然而因為我早已從Jesse那裏蒯了一個calc.cpp,作業已經寫完了。 然後我就只是想看看傳說中的SDOI2017D2T3是什麽題,我是不是忘的一幹二凈。
然後發現果然忘得一幹二凈。 然後就有了下面的事情。 題解就是顯而易見的線段樹。 把式子拆開看,你就會得到: 上下的後面那一截可以再化簡一下。 然後就只要維護4個東西: 這個就很simple了吧,線段樹嘛。
對於操作2,3,把前後的式子拆一下,維護一下就好了。 可以先做codevs的 線段樹練習5 思路都是差不多的。
思維難度:高中數學。
代碼難度:MDZZ。 PS:這道題就別再codevs交了,它沒有SPJ。
4821: [Sdoi2017]相關分析
Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeDescription
Frank對天文學非常感興趣,他經常用望遠鏡看星星,同時記錄下它們的信息,比如亮度、顏色等等,進而估算出 星星的距離,半徑等等。Frank不僅喜歡觀測,還喜歡分析觀測到的數據。他經常分析兩個參數之間(比如亮度和 半徑)是否存在某種關系。現在Frank要分析參數X與Y之間的關系。他有n組觀測數據,第i組觀測數據記錄了x_i和 y_i。他需要一下幾種操作1 L,R:用直線擬合第L組到底R組觀測數據。用xx表示這些觀測數據中x的平均數,用yyInput
第一行兩個數n,m,表示觀測數據組數和操作次數。 接下來一行n個數,第i個數是x_i。 接下來一行n個數,第i個數是y_i。 接下來m行,表示操作,格式見題目描述。 1<=n,m<=10^5,0<=|S|,|T|,|x_i|,|y_i|<=10^5 保證1操作不會出現分母為0的情況。Output
對於每個1操作,輸出一行,表示直線斜率a。 選手輸出與標準輸出的絕對誤差不超過10^-5即為正確。Sample Input
3 51 2 3
1 2 3
1 1 3
2 2 3 -3 2
1 1 2
3 1 2 2 1
Sample Output
1.0000000000-1.5000000000
-0.6153846154 本來我是不會想起這道題的。但是有這麽一個故事:
開學,學科,數學課,變量的相關性。 下課後,同學們聚在一起搞事。 QT:“你記不記得SDOI2017 D2T3 相關分析?” 我:“……蛤?” QT:“題目沒給你化簡,數學書上化簡了。” 我:“……蛤?” QT:“拆開式子之後有4個東西要維護,我不會(想)寫。” 我:“……蛤?” ………… 在機房寫作業。 QT:“不行這個數學作業太難算了,我要編程計算。” Anson:“你可以打一波SDOI2017 相關分析。” QT(虛偽地):“我不會打。” 然而因為我早已從Jesse那裏蒯了一個calc.cpp,作業已經寫完了。 然後我就只是想看看傳說中的SDOI2017D2T3是什麽題,我是不是忘的一幹二凈。
然後發現果然忘得一幹二凈。 然後就有了下面的事情。 題解就是顯而易見的線段樹。 把式子拆開看,你就會得到: 上下的後面那一截可以再化簡一下。 然後就只要維護4個東西: 這個就很simple了吧,線段樹嘛。
對於操作2,3,把前後的式子拆一下,維護一下就好了。 可以先做codevs的 線段樹練習5 思路都是差不多的。
思維難度:高中數學。
代碼難度:MDZZ。 PS:這道題就別再codevs交了,它沒有SPJ。
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <vector> #include <cstring> #include <queue> #include <complex> #include <stack> #define LL long long int #define dob long double #define ls (x<<1) #define rs (x<<1|1) using namespace std; const int N = 400010; struct Tree{ dob x,y,xx,xy; Tree operator +(const Tree &t){ return (Tree){x+t.x,y+t.y,xx+t.xx,xy+t.xy}; } }Tr[N*4]; int n,m,lazy_vis[N]; dob X[N/4],Y[N/4],lazy_add1[N],lazy_add2[N],lazy_set1[N],lazy_set2[N]; inline int gi(){ int x=0,res=1;char ch=getchar(); while(ch>‘9‘||ch<‘0‘){if(ch==‘-‘)res*=-1;ch=getchar();} while(ch<=‘9‘&&ch>=‘0‘)x=x*10+ch-48,ch=getchar(); return x*res; } inline void build(int x,int l,int r){ if(l==r){ Tr[x]=(Tree){X[l],Y[l],1.0*X[l]*X[l],1.0*X[l]*Y[l]}; return; } int mid=(l+r)>>1; build(ls,l,mid);build(rs,mid+1,r); Tr[x]=Tr[ls]+Tr[rs]; } inline dob calc(dob l,dob r){ return 0.5*(l+r)*(r-l+1); } inline dob calcpow(dob l,dob r){ l-=1; dob p1=1.0*(r)*(r+1)*(2*r+1)/6.0; dob p2=1.0*(l)*(l+1)*(2*l+1)/6.0; return p1-p2; } inline void down(int x,int l,int r){ int mid=(l+r)>>1,sl=mid-l+1,sr=r-mid; if(lazy_vis[x]){ lazy_add1[ls]=lazy_add1[rs]=lazy_add2[ls]=lazy_add2[rs]=0; lazy_vis[ls]=lazy_vis[rs]=1; dob S=lazy_set1[x],T=lazy_set2[x]; lazy_set1[ls]=lazy_set1[rs]=lazy_set1[x]; lazy_set2[ls]=lazy_set2[rs]=lazy_set2[x]; Tr[ls].xx=1.0*sl*S*S+2.0*S*calc(l,mid)+calcpow(l,mid); Tr[rs].xx=1.0*sr*S*S+2.0*S*calc(mid+1,r)+calcpow(mid+1,r); Tr[ls].xy=1.0*sl*S*T+1.0*(S+T)*calc(l,mid)+calcpow(l,mid); Tr[rs].xy=1.0*sr*S*T+1.0*(S+T)*calc(mid+1,r)+calcpow(mid+1,r); Tr[ls].x=1.0*sl*S+calc(l,mid);Tr[rs].x=1.0*sr*S+calc(mid+1,r); Tr[ls].y=1.0*sl*T+calc(l,mid);Tr[rs].y=1.0*sr*T+calc(mid+1,r); lazy_vis[x]=0; } if(lazy_add1[x] || lazy_add2[x]){ dob S=lazy_add1[x],T=lazy_add2[x]; lazy_add1[ls]+=S;lazy_add1[rs]+=S; lazy_add2[ls]+=T;lazy_add2[rs]+=T; Tr[ls].xx+=2.0*Tr[ls].x*S+1.0*sl*S*S; Tr[rs].xx+=2.0*Tr[rs].x*S+1.0*sr*S*S; Tr[ls].xy+=1.0*Tr[ls].x*T+1.0*Tr[ls].y*S+1.0*sl*S*T; Tr[rs].xy+=1.0*Tr[rs].x*T+1.0*Tr[rs].y*S+1.0*sr*S*T; Tr[ls].x+=1.0*sl*S;Tr[rs].x+=1.0*sr*S; Tr[ls].y+=1.0*sl*T;Tr[rs].y+=1.0*sr*T; lazy_add1[x]=lazy_add2[x]=0; } } inline Tree query_1(int x,int l,int r,int xl,int xr){ if(xl<=l && r<=xr)return Tr[x]; down(x,l,r);int mid=(l+r)>>1; if(xr<=mid)return query_1(ls,l,mid,xl,xr); else if(xl>mid)return query_1(rs,mid+1,r,xl,xr); return query_1(ls,l,mid,xl,mid)+query_1(rs,mid+1,r,mid+1,xr); } inline void update_2(int x,int l,int r,int xl,int xr,dob S,dob T){ if(xl<=l && r<=xr){ lazy_add1[x]+=S;lazy_add2[x]+=T; Tr[x].xx+=2.0*Tr[x].x*S+1.0*(r-l+1)*S*S; Tr[x].xy+=1.0*Tr[x].x*T+1.0*Tr[x].y*S+1.0*(r-l+1)*S*T; Tr[x].x+=1.0*(r-l+1)*S;Tr[x].y+=1.0*(r-l+1)*T; return; } down(x,l,r);int mid=(l+r)>>1; if(xr<=mid)update_2(ls,l,mid,xl,xr,S,T); else if(xl>mid)update_2(rs,mid+1,r,xl,xr,S,T); else update_2(ls,l,mid,xl,mid,S,T),update_2(rs,mid+1,r,mid+1,xr,S,T); Tr[x]=Tr[ls]+Tr[rs]; } inline void update_3(int x,int l,int r,int xl,int xr,dob S,dob T){ if(xl<=l && r<=xr){ lazy_add1[x]=lazy_add2[x]=0; lazy_vis[x]=1;lazy_set1[x]=S;lazy_set2[x]=T; Tr[x].xx=1.0*(r-l+1)*S*S+2.0*S*calc(1.0*l,1.0*r)+calcpow(1.0*l,1.0*r); Tr[x].xy=1.0*(r-l+1)*S*T+1.0*(S+T)*calc(l,r)+calcpow(l,r); Tr[x].x=1.0*(r-l+1)*S+calc(l,r);Tr[x].y=1.0*(r-l+1)*T+calc(l,r); return; } down(x,l,r);int mid=(l+r)>>1; if(xr<=mid)update_3(ls,l,mid,xl,xr,S,T); else if(xl>mid)update_3(rs,mid+1,r,xl,xr,S,T); else update_3(ls,l,mid,xl,mid,S,T),update_3(rs,mid+1,r,mid+1,xr,S,T); Tr[x]=Tr[ls]+Tr[rs]; } int main() { /*freopen(".in","r",stdin); freopen(".out","w",stdout);*/ n=gi();m=gi(); for(int i=1;i<=n;++i)X[i]=gi(); for(int i=1;i<=n;++i)Y[i]=gi(); build(1,1,n); for(int i=1;i<=m;++i){ int type=gi(); if(type==1){ int l=gi(),r=gi(); Tree ans=query_1(1,1,n,l,r); dob fz=ans.xy-ans.x*ans.y/(r-l+1); dob fm=ans.xx-ans.x*ans.x/(r-l+1); printf("%.10Lf\n",fz/fm); } if(type==2){ int l=gi(),r=gi(),S=gi(),T=gi(); update_2(1,1,n,l,r,1.0*S,1.0*T); } if(type==3){ int l=gi(),r=gi(),S=gi(),T=gi(); update_3(1,1,n,l,r,1.0*S,1.0*T); } } /*fclose(stdin); fclose(stdout);*/ return 0; }相關分析
BZOJ4817 SDOI2017 相關分析