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;
        
}

 

posted @ 2022-05-18 20:54  MrSugarT  阅读(58)  评论(0编辑  收藏  举报