SDUT 2022 Spring Team Contest——14(補題)
阿新 • • 發佈:2022-05-18
今天猛然發現上次補題部落格居然是一週前???
(回想起上次補題的時候還是在上次)
這次的訓練賽打的是CCPC的題,說實話非常的坐牢(菜)
題目連結:
概述:對於每個1≤i<j≤n,輸出所有的直線l和直線j相交的總數(重合算做相交)
思路分析:分析可知,對於每條直線,只有與其平行且不重合的直線不會算作總數裡面
所以我們的答案就是(前面直線的總數-與其斜率相等的直線+重合的直線的數量)即為答案
用兩個map分別儲存與其斜率相等的直線的個數和重合的直線的個數即可。
兩條直線平行——>可以用他們x,y的最簡形式表示
(ps:2y=3x+7 == 6y=9x+21 都可化成 2y=3x+7 這樣最簡的形式)
#include <bits/stdc++.h> #define endl '\n' #define x first #define y second #define int long long #define SugarT ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); using namespace std; const int N=1e5+10; const int INF=0x3f3f3f3f; const int mod=1e9+7; const double eps = 1e-6; typedef pair<int, int> PII; map<PII,int> mp; map<pair<PII,int>,int> q; void solve() { int n; cin >> n; int ans=0; mp.clear(); q.clear(); for(int i=0;i<n;i++) { int x1,y1,x2,y2; cin >> x1 >> y1 >> x2 >> y2;int k1=x1-x2; int k2=y1-y2; int k3=x1*y2-x2*y1; int k=__gcd(k1,k2); k1/=k,k2/=k,k3/=k; mp[{k1,k2}]++; q[{{k1,k2},k3}]++; ans+=i-mp[{k1,k2}]+q[{{k1,k2},k3}]; } cout << ans << endl; } signed main() { SugarT int T=1; cin >> T; while(T--) solve(); return 0; }
題目概述:給定n個可移動矩陣,求如何移動最小步數使得所有矩陣能夠都涵蓋相同一個正方形
思路:對於二維的矩陣,在x軸上和y軸上的移動軌跡是互不影響的——我們能夠轉化為一維問題進行考慮
之前在ACwing看到過一道板子題,做題時有印象104. 貨倉選址 - AcWing題庫
對於點來說:總體移動距離最小的點是按大小排序後的中點
對於線段來說:將所有線段的l,r放進排序取中點
#include <bits/stdc++.h> #define endl '\n' #define x first #define y second #define int long long #define SugarT ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); using namespace std; const int N=2e5+10; const int INF=0x3f3f3f3f; const int mod=1e9+7; const double eps = 1e-6; struct node { int a,b,c,d; }q[N]; int aa[N],bb[N]; void solve() { int n; cin >> n; memset(q,0,sizeof q); memset(aa,0,sizeof aa); memset(bb,0,sizeof bb); int c1=0,c2=0; for(int i=0;i<n;i++) { cin >> q[i].a >> q[i].b >> q[i].c >> q[i].d; aa[c1++]=q[i].a; aa[c1++]=q[i].c; bb[c2++]=q[i].b; bb[c2++]=q[i].d; } sort(aa,aa+c1); sort(bb,bb+c2); int x=aa[n-1]; int y=bb[n-1]; int ans=0; for(int i=0;i<n;i++) { if(q[i].a>x||q[i].c<x) ans+=min(abs(q[i].a-x),abs(q[i].c-x)); if(q[i].b>y||q[i].d<y) ans+=min(abs(q[i].b-y),abs(q[i].d-y)); } cout << ans << endl; } signed main() { SugarT int T=1; cin >> T; while(T--) solve(); return 0; }