IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 2022牛客多校四_G M -> 正文阅读

[游戏开发]2022牛客多校四_G M

2022牛客多校四

一杯咖啡一道大分讨做一天
谢谢队友帮我一起debug

传送门

G - Wall Builder I

嘿嘿,大分类讨论!

prob.: 造房子,给一个大矩形和若干点,点可看做射线发射器,分割矩形,问最大矩形面积最大是多少

ideas: 转三次,每次分几类讨论,可以见注释

code:

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

vector<ll> vl, vr, vb, vt;
ll ans;
ll n, a, b;

void turnClockwise() {
    vector<ll> tmpvl, tmpvr, tmpvb, tmpvt;
    for (auto x : vb) tmpvl.push_back(x);
    for (auto x : vt) tmpvr.push_back(x);
    for (auto x : vr) tmpvb.push_back(x);
    for (auto x : vl) tmpvt.push_back(x);
    vl.clear(), vr.clear(), vb.clear(), vt.clear();
    for (auto x : tmpvl) vl.push_back(a - x);
    for (auto x : tmpvr) vr.push_back(a - x);
    for (auto x : tmpvb) vb.push_back(x);
    for (auto x : tmpvt) vt.push_back(x);
    sort(vl.begin(), vl.end(), [&](ll x, ll y) { return x < y; });
    sort(vr.begin(), vr.end(), [&](ll x, ll y) { return x < y; });
    sort(vb.begin(), vb.end(), [&](ll x, ll y) { return x < y; });
    sort(vt.begin(), vt.end(), [&](ll x, ll y) { return x < y; });
    swap(a, b);
}

void solve() {
    // zero
    if (n == 0) {
        ll tmp = a * b;
        ans = max(tmp, ans);
    }
    // one
    vector<ll> bothLR;
    for (auto x : vl) bothLR.push_back(x);
    for (auto x : vr) bothLR.push_back(x);
    sort(bothLR.begin(), bothLR.end(), [&](ll x, ll y) { return x < y; });
    if (vb.empty()) {
        if(!bothLR.empty()) {
            ll tmp = a * bothLR[0];
            ans = max(tmp, ans);
        }
    }
    // two
    // - strip
    if (bothLR.size() >= 2) {
        for (ll i = 1; i < bothLR.size(); ++i) {
            ll tmp = (bothLR[i] - bothLR[i - 1]) * a;
            ans = max(tmp, ans);
        }
    }
    vector<ll> bothTB;
    for(auto x : vb) bothTB.push_back(x);
    for(auto x : vt) bothTB.push_back(x);
    sort(bothTB.begin(), bothTB.end(), [&](ll x, ll y){return x< y;});
    if (bothTB.size() >= 2) {
        for (ll i = 1; i < bothTB.size(); ++i) {
            ll tmp = (bothTB[i] - bothTB[i - 1]) * b;
            ans = max(tmp, ans);
        }
    }
    // - left bottom
    // - - left bottom
    if (!vb.empty() && !vl.empty()) {
        ll tmp = vb[0] * vl[0];
        ans = max(tmp, ans);
    }
    // - - top left 1
    if (vb.empty() && !vl.empty() && !vt.empty()) {
        ll tmp = vl[0] * vt[vt.size() - 1];
        ans = max(ans, tmp);
    }
    // - - right bottom
    if(!vb.empty() && vl.empty() && !vr.empty()) {
        ll tmp = vr[vr.size() - 1] * vb[0];
        ans = max(tmp, ans);
    }
    // three
    // - 2 from bottom + bothLR highest
    if (!bothLR.empty()) {
        ll h = bothLR[bothLR.size() - 1];
        if (vb.size() >= 2) {
            for (ll i = 1; i < vb.size(); ++i) {
                ll tmp = (vb[i] - vb[i - 1]) * h;
                ans = max(tmp, ans);
            }
        }
    }
    // -  top_ rightmost + bottom_ rightmost + vl highest
    if (!vl.empty() && !vb.empty() && !vt.empty()) {
        ll h = vl[vl.size() - 1];
        ll w1 = vb[vb.size() - 1];
        ll w2 = vt[vt.size() - 1];
        ll tmp = (w2 - w1) * h;
        ans = max(tmp, ans);
    }
    // - top_ leftmost + bottom_ leftmost +  vr highest
    if (!vr.empty() && !vb.empty() && !vt.empty()) {
        ll h = vr[vr.size() - 1];
        ll w1 = vb[0];
        ll w2 = vt[0];
        ll tmp = (w1 - w2) * h;
        ans = max(tmp, ans);
    }
}

signed main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);

    ll _;
    cin >> _;
    while (_--) {
        vl.clear(), vr.clear(), vb.clear(), vt.clear();
        ans = 0;
        cin >> n >> a >> b;
        for (ll i = 1; i <= n; ++i) {
            ll x, y;
            cin >> x >> y;
            if (x == 0) vl.push_back(y);
            else if (x == a) vr.push_back(y);
            else if (y == 0) vb.push_back(x);
            else if (y == b) vt.push_back(x);
        }
        sort(vl.begin(), vl.end(), [&](ll x, ll y) { return x < y; });
        sort(vr.begin(), vr.end(), [&](ll x, ll y) { return x < y; });
        sort(vb.begin(), vb.end(), [&](ll x, ll y) { return x < y; });
        sort(vt.begin(), vt.end(), [&](ll x, ll y) { return x < y; });

        solve();
        turnClockwise();
        solve();
        turnClockwise();
        solve();
        turnClockwise();
        solve();

        cout << ans << endl;
    }
    return 0;
}

一张草稿纸:(不保正确)
在这里插入图片描述

M - Monotone Chain

prob. : 二维平面,给一堆点 A 1 … A n A_1 \dots A_n A1?An?, 要求两个向量 a ? \vec{a} a , b ? \vec{b} b ,st. ? 1 ≤ i < j ≤ n , ( ( O A i ? ? a ? ) ? b ? ≤ ( O A j ? ? a ? ) ? b ? ) \forall 1 \le i < j \le n , ((\vec{OA_i}-\vec{a}) · \vec{b} \le (\vec{OA_j} - \vec{a})·\vec{b}) ?1i<jn,((OAi? ??a )?b (OAj? ??a )?b )

ideas: a ? \vec{a} a 是可以直接消掉的,然后移项
( ( O A i ? ? a ? ) ? b ? ≤ ( O A j ? ? a ? ) ? b ? ) O A i ? ? b ? ≤ O A j ? ? b ? ( O A i ? ? O A j ? ) ? b ? ≤ 0 A j A i ? ? b ? ≤ 0 A i A j ? ? b ? ≥ 0 \begin{aligned} ((\vec{OA_i}-\vec{a}) · \vec{b} & \le (\vec{OA_j} - \vec{a})·\vec{b}) \\ \vec{OA_i} · \vec{b} & \le \vec{OA_j} · \vec{b} \\ (\vec{OA_i} - \vec{OA_j}) · \vec{b}& \le 0 \\ \vec{A_jA_i} · \vec{b} &\le 0\\ \vec{A_iA_j} · \vec{b} &\ge 0 \end{aligned} ((OAi? ??a )?b OAi? ??b (OAi? ??OAj? ?)?b Aj?Ai? ??b Ai?Aj? ??b ?(OAj? ??a )?b )OAj? ??b 000?

相当于是每个线段在直线上的投影都是正的)

直接做就行,对于每段线段都可以求出一个角度范围,然后求交集

实际实现的时候可以对于每个位置记录一个边界角度,如果n条线段算出来的边界角度范围小于180(pi),则可行,可行解为边界角度+90(

判可行的时候将角度排序然后看有没有相邻角度大于180(pi),若有则直接可行(剩余的会落在小于180的区间内则达成上述条件

code:

(队友写的我直接cv过来//

///
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;

const int inf=0x3f3f3f3f,N=2e5+5;
const double PI=acos(-1),eps=1e-12;

struct P{
    ll x,y;
    double ang;
}p[N];

int main(){
    #ifdef ONLINE_JUDGE
        //std::ios::sync_with_stdio(false);
    #else
        //freopen("in.txt","r",stdin);
        //freopen("out.txt","w",stdout);
    #endif
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%lld%lld",&p[i].x,&p[i].y);
        if(i&&p[i].x==p[i-1].x&&p[i].y==p[i-1].y){
            i--,n--;
        }
    }
    assert(n!=2);
    if(n==1){
        printf("YES\n1 1 1 1");
        return 0;
    }
    n--;
    for(int i=0;i<n;i++){
        p[i]={p[i+1].x-p[i].x,p[i+1].y-p[i].y,0};
        p[i].ang=atan2(p[i].y,p[i].x);
    }
    sort(p,p+n,[](P a,P b){
        return a.ang<b.ang;
    });
    if(n==1){
        printf("YES\n1 1 %lld %lld\n",p[0].y,-p[0].x);
        return 0;
    }
    int pos=-1;
    for(int i=0;i<n;i++){
        double o=p[(i+1)%n].ang-p[i].ang;
        //cout<<o<<endl;
        if(o>PI-eps||(o<-eps&&o>-PI-eps)){
            pos=i;
        }
    }
    if(pos!=-1)printf("YES\n1 1 %lld %lld\n",p[pos].y,-p[pos].x);
    else printf("NO\n");
    return 0;
}

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-08-06 11:13:03  更:2022-08-06 11:14:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 6:07:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码