1. 程式人生 > 其它 >SDUT 2022 Spring Team Contest——14(補題)

SDUT 2022 Spring Team Contest——14(補題)

今天猛然發現上次補題部落格居然是一週前???

(回想起上次補題的時候還是在上次)


 這次的訓練賽打的是CCPC的題,說實話非常的坐牢(菜)


題目連結:

Problem - C - Codeforces

概述:對於每個1i<jn,輸出所有的直線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; }

題目連結:Problem - G - Codeforces

題目概述:給定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;
        
}