GDUT2020新生賽——解題報告
比賽連結
A題——肥豬的鋼琴床
一道挺不錯的dp+結論題。
首先最終的字串的形式肯定是0...01...10...0這種,分為三個部分,第一部分的全0,中間部分的全1,最後一部分的全0。
我們定義狀態dp[i][1/2/3]表示第i個字元屬於第幾個部分時最少需要刪除的字元數量。
狀態轉移方程:
dp[i][1]=dp[i-1][1]+(s[i]=='1')
當第i個字元屬於第一部分時,第i-1個字元肯定也是第一部分。
dp[i][2]=min(dp[i-1][1],dp[i-1][2])+(s[i]=='0')
當第i個字元屬於第二部分時,第i-1個字元要麼是第一部分,要麼是第二部分。
dp[i][3]=min(dp[i-1][2],dp[i-1][3])+(s[i]=='1')
當第i個字元屬於第三部分時,第i-1個字元要麼是第二部分,要麼是第三部分。
最終的答案就是第n個字元的三種狀態的最小值。
#include <bits/stdc++.h> #define PI atan(1.0)*4 #define rp(i,s,t) for ( int i = (s); i <= (t); i++) #define RP(i,t,s) for ( int i = (t); i >= (s); i--) #define sc(x) scanf("%d",&x) #define scl(x) scanf("%lld",&x) #define ll long long #define ull unsigned long long #define mst(a,b) memset(a,b,sizeof(a)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define pii pair<int,int> #define pll pair<ll,ll> #define pil pair<int,ll> #define m_p make_pair #define p_b push_back #define ins insert #define era erase #define INF 0x3f3f3f3f #define LINF 0x3f3f3f3f3f3f3f3f #define dg if(debug) #define outval(a) cout << "Debuging...|" << #a << ": " << a << "\n"; using namespace std; int debug = 0; ll gcd(ll a,ll b){ return b?gcd(b,a%b):a; } ll lcm(ll a,ll b){ return a/gcd(a,b)*b; } inline int read(){ int s=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ s=s*10+ch-'0'; ch=getchar(); } return s*f; } const int N = 1e6+7; char s[N]; int dp[N][4]; void solve(){ int n=read(); scanf("%s",s+1); rp(i,1,n){ dp[i][1]=dp[i-1][1]+(s[i]=='1'); dp[i][2]=min(dp[i-1][1],dp[i-1][2])+(s[i]=='0'); dp[i][3]=min(dp[i-1][2],dp[i-1][3])+(s[i]=='1'); } cout<<min(dp[n][1],min(dp[n][2],dp[n][3]))<<endl; } int main(){ //ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); #ifdef ONLINE_JUDGE #else freopen("in.txt", "r", stdin); //debug = 1; #endif time_t beg, end; //if(debug) beg = clock(); int T=1; while(T--) solve(); /* if(debug) { end = clock(); printf("time:%.2fs\n", 1.0 * (end - beg) / CLOCKS_PER_SEC); } */ return 0; }
B題——拯救小a
簽到題,簡單的字元處理。
#include <bits/stdc++.h> #define PI atan(1.0)*4 #define rp(i,s,t) for ( int i = (s); i <= (t); i++) #define RP(i,t,s) for ( int i = (t); i >= (s); i--) #define sc(x) scanf("%d",&x) #define scl(x) scanf("%lld",&x) #define ll long long #define ull unsigned long long #define mst(a,b) memset(a,b,sizeof(a)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define pii pair<int,int> #define pll pair<ll,ll> #define pil pair<int,ll> #define m_p make_pair #define p_b push_back #define ins insert #define era erase #define INF 0x3f3f3f3f #define LINF 0x3f3f3f3f3f3f3f3f #define dg if(debug) #define outval(a) cout << "Debuging...|" << #a << ": " << a << "\n"; using namespace std; int debug = 0; ll gcd(ll a,ll b){ return b?gcd(b,a%b):a; } ll lcm(ll a,ll b){ return a/gcd(a,b)*b; } inline int read(){ int s=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ s=s*10+ch-'0'; ch=getchar(); } return s*f; } const int N = 1e5+7; char s[N]; void solve(){ int cnt=0; while(~scanf("%s",s)){ int len=strlen(s); if(len==1&&s[0]=='.') break; rp(i,0,len-1) if(s[i]=='a') cnt++; } cout<<cnt<<endl; } int main(){ //ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); #ifdef ONLINE_JUDGE #else freopen("in.txt", "r", stdin); //debug = 1; #endif time_t beg, end; //if(debug) beg = clock(); solve(); /* if(debug) { end = clock(); printf("time:%.2fs\n", 1.0 * (end - beg) / CLOCKS_PER_SEC); } */ return 0; }
C題——母牛的俄羅斯輪盤賭
規律題,手推或者打表出來1-10的答案可以發現,當且僅當n%5==2或者n%5==0是為Cow。
具體解釋:顯然能開出第n-1槍的是勝者,易證得開出第k槍的玩家一定能開出第k+5槍,算出n<=5的答案即可。
#include <bits/stdc++.h> #define PI atan(1.0)*4 #define rp(i,s,t) for (register int i = (s); i <= (t); i++) #define RP(i,t,s) for (register int i = (t); i >= (s); i--) #define sc(x) scanf("%d",&x) #define scl(x) scanf("%lld",&x) #define ll long long #define ull unsigned long long #define mst(a,b) memset(a,b,sizeof(a)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define pii pair<int,int> #define pll pair<ll,ll> #define pil pair<int,ll> #define m_p make_pair #define p_b push_back #define ins insert #define era erase #define INF 0x3f3f3f3f #define LINF 0x3f3f3f3f3f3f3f3f #define dg if(debug) #define outval(a) cout << "Debuging...|" << #a << ": " << a << "\n"; using namespace std; int debug = 0; ll gcd(ll a,ll b){ return b?gcd(b,a%b):a; } ll lcm(ll a,ll b){ return a/gcd(a,b)*b; } inline int read(){ int s=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ s=s*10+ch-'0'; ch=getchar(); } return s*f; } void solve(){ int n=read(); if(n%5==0||n%5==2) puts("Cow"); else puts("Pig"); } int main(){ //ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); #ifdef ONLINE_JUDGE #else freopen("in.txt", "r", stdin); //debug = 1; #endif time_t beg, end; //if(debug) beg = clock(); int T=read(); while(T--) solve(); /* if(debug) { end = clock(); printf("time:%.2fs\n", 1.0 * (end - beg) / CLOCKS_PER_SEC); } */ return 0; }
D題——中學數學題
答案就是列舉1~n中每個數,對每個數進行唯一分解定理後,該數能夠整除k的最大次方的和。
#include <bits/stdc++.h> #define PI atan(1.0)*4 #define rp(i,s,t) for ( int i = (s); i <= (t); i++) #define RP(i,t,s) for ( int i = (t); i >= (s); i--) #define sc(x) scanf("%d",&x) #define scl(x) scanf("%lld",&x) #define ll long long #define ull unsigned long long #define mst(a,b) memset(a,b,sizeof(a)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define pii pair<int,int> #define pll pair<ll,ll> #define pil pair<int,ll> #define m_p make_pair #define p_b push_back #define ins insert #define era erase #define INF 0x3f3f3f3f #define LINF 0x3f3f3f3f3f3f3f3f #define dg if(debug) #define outval(a) cout << "Debuging...|" << #a << ": " << a << "\n"; using namespace std; int debug = 0; ll gcd(ll a,ll b){ return b?gcd(b,a%b):a; } ll lcm(ll a,ll b){ return a/gcd(a,b)*b; } inline int read(){ int s=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ s=s*10+ch-'0'; ch=getchar(); } return s*f; } const int N = 1e5+7; char s[N]; void solve(){ int n=read(),k=read(); int cnt=0; rp(i,k,n){ int j=i; if(i%k==0){ while(i%k==0) i/=k,cnt++; } i=j; } cout<<cnt<<endl; } int main(){ //ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); #ifdef ONLINE_JUDGE #else freopen("in.txt", "r", stdin); //debug = 1; #endif time_t beg, end; //if(debug) beg = clock(); int T=read(); while(T--)solve(); /* if(debug) { end = clock(); printf("time:%.2fs\n", 1.0 * (end - beg) / CLOCKS_PER_SEC); } */ return 0; }
E題——列舉求和
這個公式在莫比烏斯反演題型裡面經常出現,算是比較經典。
答案就是(n/k)*(m/k),也比較好理解。
#include <bits/stdc++.h> #define PI atan(1.0)*4 #define rp(i,s,t) for ( int i = (s); i <= (t); i++) #define RP(i,t,s) for ( int i = (t); i >= (s); i--) #define sc(x) scanf("%d",&x) #define scl(x) scanf("%lld",&x) #define ll long long #define ull unsigned long long #define mst(a,b) memset(a,b,sizeof(a)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define pii pair<int,int> #define pll pair<ll,ll> #define pil pair<int,ll> #define m_p make_pair #define p_b push_back #define ins insert #define era erase #define INF 0x3f3f3f3f #define LINF 0x3f3f3f3f3f3f3f3f #define dg if(debug) #define outval(a) cout << "Debuging...|" << #a << ": " << a << "\n"; using namespace std; int debug = 0; ll gcd(ll a,ll b){ return b?gcd(b,a%b):a; } ll lcm(ll a,ll b){ return a/gcd(a,b)*b; } inline int read(){ int s=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ s=s*10+ch-'0'; ch=getchar(); } return s*f; } const int N = 1e5+7; char s[N]; void solve(){ int n=read(),m=read(),k=read(); cout<<1ll*(m/k)*(n/k)<<endl; } int main(){ //ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); #ifdef ONLINE_JUDGE #else freopen("in.txt", "r", stdin); //debug = 1; #endif time_t beg, end; //if(debug) beg = clock(); int T=read(); while(T--)solve(); /* if(debug) { end = clock(); printf("time:%.2fs\n", 1.0 * (end - beg) / CLOCKS_PER_SEC); } */ return 0; }
F題——合併石子
比較有意思的一道題,也比較巧妙,解題的方法也很多。
介紹一個比較巧妙的方法:利用期望計算。
消耗的體力總和=合併的所有情況數*第i次合併時任選兩堆石子的期望和。
n堆石子合併的情況總數為(n-1)!,第i次合併任選兩堆石子的期望和是2*n/(n-i+1)
故最終的答案就是。
這個思路比較巧妙,不是特別好想。
#include <bits/stdc++.h> #define PI atan(1.0)*4 #define rp(i,s,t) for ( int i = (s); i <= (t); i++) #define RP(i,t,s) for ( int i = (t); i >= (s); i--) #define sc(x) scanf("%d",&x) #define scl(x) scanf("%lld",&x) #define ll long long #define ull unsigned long long #define mst(a,b) memset(a,b,sizeof(a)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define pii pair<int,int> #define pll pair<ll,ll> #define pil pair<int,ll> #define m_p make_pair #define p_b push_back #define ins insert #define era erase #define INF 0x3f3f3f3f #define LINF 0x3f3f3f3f3f3f3f3f #define dg if(debug) #define outval(a) cout << "Debuging...|" << #a << ": " << a << "\n"; using namespace std; int debug = 0; ll gcd(ll a,ll b){ return b?gcd(b,a%b):a; } ll lcm(ll a,ll b){ return a/gcd(a,b)*b; } inline int read(){ int s=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ s=s*10+ch-'0'; ch=getchar(); } return s*f; } const ll mod = 1e9+7; ll quickPow(ll a, ll b, ll mod) { ll ans = 1; while(b) { if(b&1) ans=(ans*a)%mod; a=(a*a)%mod; b>>=1; } return ans; } void solve(){ int n=read(); if(n==1){ puts("0"); return ; } ll res=1; rp(i,1,n-1) res=(res*i)%mod; ll ans=0; rp(i,2,n) ans=(ans+1ll*2*n%mod*quickPow(i,mod-2,mod)%mod)%mod; cout<<res*ans%mod<<endl; } int main(){ //ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); #ifdef ONLINE_JUDGE #else // freopen("in.txt", "r", stdin); //debug = 1; #endif time_t beg, end; //if(debug) beg = clock(); int T=1; while(T--) solve(); /* if(debug) { end = clock(); printf("time:%.2fs\n", 1.0 * (end - beg) / CLOCKS_PER_SEC); } */ return 0; }
G題——排解憂傷
無論入場順序怎麼安排最終的怒氣和都是一樣的(
有點類似於2020年ccpcWannaflyDay7的石子合併那一題),所以就從前往後安排就行了。#include <bits/stdc++.h> #define PI 3.1415926535 #define rp(i,s,t) for ( int i = (s); i <= (t); i++) #define RP(i,t,s) for ( int i = (t); i >= (s); i--) #define sc(x) scanf("%d",&x) #define scl(x) scanf("%lld",&x) #define ll long long #define ull unsigned long long #define mst(a,b) memset(a,b,sizeof(a)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define pii pair<int,int> #define pll pair<ll,ll> #define pil pair<int,ll> #define m_p make_pair #define p_b push_back #define ins insert #define era erase #define INF 0x3f3f3f3f #define LINF 0x3f3f3f3f3f3f3f3f #define dg if(debug) #define outval(a) cout << "Debuging...|" << #a << ": " << a << "\n"; using namespace std; int debug = 0; ll gcd(ll a,ll b){ return b?gcd(b,a%b):a; } ll lcm(ll a,ll b){ return a/gcd(a,b)*b; } inline int read(){ int s=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ s=s*10+ch-'0'; ch=getchar(); } return s*f; } const int N = 1e5+7; int a[N]; void solve(){ int n=read(),m=read(); rp(i,1,m) a[i]=read(); sort(a+1,a+1+m); ll ans=0; int cur; rp(i,1,m){ if(i==1) cur=a[i]; else{ cur++; if(cur<a[i]) cur=a[i]; else ans+=cur-a[i]; } } if(cur>n) cout<<-1<<endl; else cout<<ans<<endl; } int main(){ //ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); #ifdef ONLINE_JUDGE #else freopen("in.txt", "r", stdin); //debug = 1; #endif time_t beg, end; //if(debug) beg = clock(); solve(); /* if(debug) { end = clock(); printf("time:%.2fs\n", 1.0 * (end - beg) / CLOCKS_PER_SEC); } */ return 0; }
I題——歷史
簽到題,不多說。
#include <bits/stdc++.h> #define PI atan(1.0)*4 #define rp(i,s,t) for ( int i = (s); i <= (t); i++) #define RP(i,t,s) for ( int i = (t); i >= (s); i--) #define sc(x) scanf("%d",&x) #define scl(x) scanf("%lld",&x) #define ll long long #define ull unsigned long long #define mst(a,b) memset(a,b,sizeof(a)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define pii pair<int,int> #define pll pair<ll,ll> #define pil pair<int,ll> #define m_p make_pair #define p_b push_back #define ins insert #define era erase #define INF 0x3f3f3f3f #define LINF 0x3f3f3f3f3f3f3f3f #define dg if(debug) #define outval(a) cout << "Debuging...|" << #a << ": " << a << "\n"; using namespace std; int debug = 0; ll gcd(ll a,ll b){ return b?gcd(b,a%b):a; } ll lcm(ll a,ll b){ return a/gcd(a,b)*b; } inline int read(){ int s=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ s=s*10+ch-'0'; ch=getchar(); } return s*f; } const int N = 1e5+7; char s[N]; void solve(){ printf("The Chinese teams has won %d championships\n",4); } int main(){ //ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); #ifdef ONLINE_JUDGE #else freopen("in.txt", "r", stdin); //debug = 1; #endif time_t beg, end; //if(debug) beg = clock(); solve(); /* if(debug) { end = clock(); printf("time:%.2fs\n", 1.0 * (end - beg) / CLOCKS_PER_SEC); } */ return 0; }
K題——很基礎的模擬題
看範圍直接vector模擬就行了,如果資料範圍到1e5的話就需要用無旋treap或者splay維護了。
#include <bits/stdc++.h> #define PI atan(1.0)*4 #define rp(i,s,t) for ( int i = (s); i <= (t); i++) #define RP(i,t,s) for ( int i = (t); i >= (s); i--) #define sc(x) scanf("%d",&x) #define scl(x) scanf("%lld",&x) #define ll long long #define ull unsigned long long #define mst(a,b) memset(a,b,sizeof(a)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define pii pair<int,int> #define pll pair<ll,ll> #define pil pair<int,ll> #define m_p make_pair #define p_b push_back #define ins insert #define era erase #define INF 0x3f3f3f3f #define LINF 0x3f3f3f3f3f3f3f3f #define dg if(debug) #define outval(a) cout << "Debuging...|" << #a << ": " << a << "\n"; using namespace std; int debug = 0; ll gcd(ll a,ll b){ return b?gcd(b,a%b):a; } ll lcm(ll a,ll b){ return a/gcd(a,b)*b; } inline int read(){ int s=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ s=s*10+ch-'0'; ch=getchar(); } return s*f; } const int N = 1e5+7; char s[N]; void solve(){ int n=read(),q=read(); vector<int> v;v.clear(); rp(i,1,n){ int x=read(); v.p_b(x); } while(q--){ int op=read(),x=read(); x--; if(op==1){ vector<int> vv;vv.clear(); int len=v.size(); rp(i,0,x-1) vv.p_b(v[i]); rp(i,x+1,len-1) vv.p_b(v[i]); v.clear(); int L=vv.size(); rp(i,0,L-1) v.p_b(vv[i]); } else if(op==2){ int y=read(); vector<int> vv;vv.clear(); int len=v.size(); rp(i,0,x-1) vv.p_b(v[i]); vv.p_b(y); rp(i,x,len-1) vv.p_b(v[i]); v.clear(); int L=vv.size(); rp(i,0,L-1) v.p_b(vv[i]); } else{ vector<int> vv;vv.clear(); int len=v.size(); rp(i,0,x-1) vv.p_b(v[i]); int cur=v[x]; int id=-1; rp(i,x+1,len-1){ if(v[i]==v[x]) cur+=v[x]; else{ id=i; break; } } vv.p_b(cur); if(id<=len-1&&id!=-1) rp(i,id,len-1) vv.p_b(v[i]); v.clear(); int L=vv.size(); rp(i,0,L-1) v.p_b(vv[i]); } int len=v.size(); rp(i,0,len-1) printf("%d%s",v[i],i==len-1?"\n":" "); } } int main(){ //ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); #ifdef ONLINE_JUDGE #else freopen("in.txt", "r", stdin); //debug = 1; #endif time_t beg, end; //if(debug) beg = clock(); solve(); /* if(debug) { end = clock(); printf("time:%.2fs\n", 1.0 * (end - beg) / CLOCKS_PER_SEC); } */ return 0; }#include <bits/stdc++.h> #define PI atan(1.0)*4 #define rp(i,s,t) for ( int i = (s); i <= (t); i++) #define RP(i,t,s) for ( int i = (t); i >= (s); i--) #define sc(x) scanf("%d",&x) #define scl(x) scanf("%lld",&x) #define ll long long #define ull unsigned long long #define mst(a,b) memset(a,b,sizeof(a)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define pii pair<int,int> #define pll pair<ll,ll> #define pil pair<int,ll> #define m_p make_pair #define p_b push_back #define ins insert #define era erase #define INF 0x3f3f3f3f #define LINF 0x3f3f3f3f3f3f3f3f #define dg if(debug) #define outval(a) cout << "Debuging...|" << #a << ": " << a << "\n"; using namespace std; int debug = 0; ll gcd(ll a,ll b){ return b?gcd(b,a%b):a; } ll lcm(ll a,ll b){ return a/gcd(a,b)*b; } inline int read(){ int s=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ s=s*10+ch-'0'; ch=getchar(); } return s*f; } const int N = 1e5+7; char s[N]; void solve(){ int n=read(),q=read(); vector<int> v;v.clear(); rp(i,1,n){ int x=read(); v.p_b(x); } while(q--){ int op=read(),x=read(); x--; if(op==1){ vector<int> vv;vv.clear(); int len=v.size(); rp(i,0,x-1) vv.p_b(v[i]); rp(i,x+1,len-1) vv.p_b(v[i]); v.clear(); int L=vv.size(); rp(i,0,L-1) v.p_b(vv[i]); } else if(op==2){ int y=read(); vector<int> vv;vv.clear(); int len=v.size(); rp(i,0,x-1) vv.p_b(v[i]); vv.p_b(y); rp(i,x,len-1) vv.p_b(v[i]); v.clear(); int L=vv.size(); rp(i,0,L-1) v.p_b(vv[i]); } else{ vector<int> vv;vv.clear(); int len=v.size(); rp(i,0,x-1) vv.p_b(v[i]); int cur=v[x]; int id=-1; rp(i,x+1,len-1){ if(v[i]==v[x]) cur+=v[x]; else{ id=i; break; } } vv.p_b(cur); if(id<=len-1&&id!=-1) rp(i,id,len-1) vv.p_b(v[i]); v.clear(); int L=vv.size(); rp(i,0,L-1) v.p_b(vv[i]); } int len=v.size(); rp(i,0,len-1) printf("%d%s",v[i],i==len-1?"\n":" "); } } int main(){ //ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); #ifdef ONLINE_JUDGE #else freopen("in.txt", "r", stdin); //debug = 1; #endif time_t beg, end; //if(debug) beg = clock(); solve(); /* if(debug) { end = clock(); printf("time:%.2fs\n", 1.0 * (end - beg) / CLOCKS_PER_SEC); } */ return 0; }
L題——母牛上柱
比較經典的計算幾何題,注意兩種路徑取最小值就行。
#include <bits/stdc++.h> #define PI 3.1415926535 #define rp(i,s,t) for ( int i = (s); i <= (t); i++) #define RP(i,t,s) for ( int i = (t); i >= (s); i--) #define sc(x) scanf("%d",&x) #define scl(x) scanf("%lld",&x) #define ll long long #define ull unsigned long long #define mst(a,b) memset(a,b,sizeof(a)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define pii pair<int,int> #define pll pair<ll,ll> #define pil pair<int,ll> #define m_p make_pair #define p_b push_back #define ins insert #define era erase #define INF 0x3f3f3f3f #define LINF 0x3f3f3f3f3f3f3f3f #define dg if(debug) #define outval(a) cout << "Debuging...|" << #a << ": " << a << "\n"; using namespace std; int debug = 0; ll gcd(ll a,ll b){ return b?gcd(b,a%b):a; } ll lcm(ll a,ll b){ return a/gcd(a,b)*b; } inline int read(){ int s=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ s=s*10+ch-'0'; ch=getchar(); } return s*f; } const int N = 1e5+7; void solve(){ int alp=read(),belt=read(),R=read(),H=read(); double ans=min(2.0*PI*R*((1.0*abs(alp-belt))/360.0),2.0*PI*R*(1.0*(360-abs(alp-belt))/360.0)); double res=H*H+ans*ans; printf("%.2f\n",res); } int main(){ //ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); #ifdef ONLINE_JUDGE #else freopen("in.txt", "r", stdin); //debug = 1; #endif time_t beg, end; //if(debug) beg = clock(); int T=read(); while(T--) solve(); /* if(debug) { end = clock(); printf("time:%.2fs\n", 1.0 * (end - beg) / CLOCKS_PER_SEC); } */ return 0; }