cf(div1+div2)构造题:D. Bouncing Boomerangs

链接:https://codeforces.com/contest/1428/problem/D
(每列最多放2个,注意读题~)
从右边向左考虑,先说结论:
a[i]=0, 不放
a[i]=1,放在(i,i)
a[i]=2,(i,i)放一个点,然后后面找一个a[j]=1(j>i)的点(且之前没被其他a[i]=2的点使用过),然后把此时在(j,j)的点上升到(i,j)
a[i]=3,(i,i)放一个点,然后后面找一个没有没有放满的列(a[j]=1的话要求没有被a[i]=2的使用过),然后在(i,j)放一个点。

口胡一波为什么这样是对的:
我们看到回旋镖的轨迹,发现a[i]=3的其实是不好考虑的,因为可能跟我之前安插的点碰撞到,那么我们让a[i]=3的最后从(i,i)走,因为(i,i)是从右下到左上不断上升的,因此可以避免。
代码:

#include<bits/stdc++.h>
#define pii pair<int, int>
#define fi first
#define se second
#define mp make_pair
using namespace std;
const int maxn = 1e5+7;

int a[maxn];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin >> n;
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    int res = 0;
    vector<pii > vec;
    stack<pii > st;    //a[i]=1 
    stack<int> st2;    //没放满 
    bool flag = 1;
    for(int i = n; i >= 1; i--) {
        if(a[i] == 0) continue;
        if(a[i] == 1) {
            st.push(mp(i, i));
        }
        if(a[i] == 2) {
            vec.push_back(mp(i, i));
            st2.push(i);
            res++;
            if(!st.empty())  {
                pii pp = st.top();
                st.pop();
                res++;
                vec.push_back(mp(i, pp.fi));
            }
            else {
                flag = 0; break;
            }
        }
        if(a[i] == 3) {
            vec.push_back(mp(i, i));
            res++;
            if(!st2.empty()) {
                int tp = st2.top();
                st2.pop();
                vec.push_back(mp(i, tp));
                res++;
                st2.push(i);
                continue;
            }
            if(!st.empty()) {
                pii tp = st.top();
                st.pop();
                vec.push_back(mp(i, tp.fi));
                vec.push_back(mp(tp.fi,tp.fi)); 
                res+=2;
                st2.push(i);
                continue;
            }
            flag = 0;
            break;
        }
    }

    if(flag) {
        while(!st.empty())  {
            pii tmp = st.top();
            st.pop();
            vec.push_back(tmp);
            res++;
        }
        cout << res << '\n';
        for(auto it : vec) {
            cout << it.fi << " " << it.se << '\n';
        }
    }
    else {
        cout << -1 << '\n';
    }
}
全部评论

相关推荐

书海为家:实习是成为大厂正式员工很好的敲门砖,看您的简历中有一段实习经历,挺好的。我来给一点点小建议,因为毕竟还在学校不像工作几年的老鸟有丰富的项目经验,面试官在面试在校生的时候更关注咱们同学的做事逻辑和思路,所以最好在简历中描述下自己实习时做过项目的完整过程,比如需求怎么来的,你对需求的解读,你想到的解决办法,遇到困难如何找人求助,最终项目做成了什么程度,你从中收获了哪些技能,你有什么感悟。
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
8223次浏览 76人参与
# 你的实习产出是真实的还是包装的? #
1501次浏览 38人参与
# MiniMax求职进展汇总 #
23541次浏览 305人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7278次浏览 40人参与
# 简历第一个项目做什么 #
31437次浏览 320人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
186703次浏览 1118人参与
# 巨人网络春招 #
11266次浏览 223人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152182次浏览 887人参与
# 研究所笔面经互助 #
118827次浏览 577人参与
# 重来一次,我还会选择这个专业吗 #
433224次浏览 3924人参与
# 简历中的项目经历要怎么写? #
309826次浏览 4177人参与
# 面试紧张时你会有什么表现? #
30455次浏览 188人参与
# 你今年的平均薪资是多少? #
212894次浏览 1039人参与
# AI时代,哪些岗位最容易被淘汰 #
63129次浏览 779人参与
# 我的求职精神状态 #
447914次浏览 3128人参与
# 你最满意的offer薪资是哪家公司? #
76332次浏览 374人参与
# 正在春招的你,也参与了去年秋招吗? #
363014次浏览 2635人参与
# 你怎么看待AI面试 #
179678次浏览 1213人参与
# 牛客AI文生图 #
21390次浏览 237人参与
# 职能管理面试记录 #
10770次浏览 59人参与
# 网易游戏笔试 #
6421次浏览 83人参与
# 腾讯音乐求职进展汇总 #
160519次浏览 1108人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务