3. 压强(pascal.c/pascal.cpp/pascal.pas)
【题目背景】
std是一个热爱物理的乖孩子~
这天,他看到了一架时光机,但是他发现有一个人堵在门口······
【题目描述】
这个人告诉std:
“你的面前会出现一堆积木(可以视作均匀的立方体),而你的任务就是统计这堆积木中的某块积木上表面所受的压强。如果你每次都答对了,我就让你上时光机。”
“我会随时把两摞积木并成一摞。”他补充了一句。
刚开始,std感到这个任务似乎很轻松,然而,他渐渐发现,那个人的动作和询问越来越快,std感到一阵阵眩晕。
终于,气喘吁吁的std瘫倒在地上,失去了知觉······
【输入输出格式】
【输入格式】
输入的第1行是两个整数n,q。
第2行~第n+1行是两个实数,分别为第i块积木的棱长li、密度ρi(单位分别为m,*103 kg/m3(即g/cm3))。
第n+2行~第n+q+1行是一个整数opt:
如果opt=1:接下来有一个整数x,请输出此时积木x的上表面所受的压强(设g=9.8m/s2)。
如果opt=2:接下来有两个整数x,y,请将x所在的积木摞整体移动(即不改变积木上下的顺序)到y所在的积木摞上方。假设不会有积木摞因为不平衡而倒下(或者说,任意两块叠在一起的积木的顶面中心和底面中心相互对齐)。
【输出格式】
对每个opt=1,输出一个实数,表示压强(单位:pa)。
格式为a.b*10^c pa
其中,a.b为[1,10)内的3位小数,c为一个非负整数。(即科学计数法,同时保证答案大于1或者等于0)
当答案为0时请输出0.000*10^0 pa。
【输入输出样例】
【输入#1】
3 5
1.000 0.500
2.000 0.500
3.000 0.500
1 2
2 1 2
1 2
2 3 1
1 1
【输出#1】
0.000*10^0 pa
4.900*10^3 pa
1.323*10^5 pa
【提示】
本题共30组测试数据,前20组每组3分,后10组每组4分。
对于前12%的数据,1<=n<=100,1<=q<=100。
对于前21%的数据,1<=n<=1000,1<=q<=1000。
对于前30%的数据,1<=n<=10000,1<=q<=10000。
对于前39%的数据,1<=n<=10000,1<=q<=100000。
对于前51%的数据,1<=n<=100000,1<=q<=100000。
对于前64%的数据,1<=n<=150000,1<=q<=150000。
对于前72%的数据,1<=n<=500000,1<=q<=500000。
对于前84%的数据,1<=n<=800000,1<=q<=800000。
对于前88%的数据,1<=n<=900000,1<=q<=900000。
对于100%的数据,1<=n<=1000000,1<=q<=1000000,0.1<= li<=100,0.1<=ρi<=35。
另有10%的数据,所有积木块的棱长相等。
算法:带权并查集
难度:<<NOIP Day 1 T3 (虽然说考试的时候,由于本蒟蒻策略失误,没有A)
题解:我们记录权值为上面所压的所有方块的重,然后在路径压缩,回溯的时候更新权值就行了
时间复杂度:O(n)
代码:略
逃