SDUT 2022 Spring Team Contest——14(补题)
今天猛然发现上次补题博客居然是一周前???
(回想起上次补题的时候还是在上次)
这次的训练赛打的是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; }