360笔试9.9

360笔试第一题: 一个数组,对前m个元素进行一系列升序或者降序排序后求现在数组
我想了半天 怎么优化 实在想不出来 直接摁排序,竟然过了。。。就不写代码了

360笔试第二题: 黑白棋, n个数组,每次反转【l,r】闭区间内的元素,问每次翻转后有多少个黑色
我最开始想用线段树但感觉空间复杂度过高;于是就用的队列+merge的想法,但是情况考虑的话比较复杂,最后没有写完。。。希望大佬们可以一起讨论一下呜呜

    


#include <iostream>
#include <vector>
#include <functional>
#include <algorithm>
#include <queue>
using namespace std;

//代表为白棋子的区间
struct Node
{
    int l, r;
    Node *next;
    Node(int l_, int r_) : l(l_), r(r_) {}
};

int main()
{
    int n, m;
    cin >> n >> m;
    int l, r;
    Node *head = nullptr;
    Node *now = nullptr, *pre = nullptr;
    //白棋的个数
    int count = 0;
    for (int i = 0; i < m; i++)
    {
        cin >> l >> r;
        pre = nullptr;
        now = head;
        while (now && l <= r)
        {
            // () 插入的区间l,r, 【】当遍历的区间 now
            // () []
            if (r < now->l)
            {
                break;
            }
            //(  [  )  ]
            else if (l < now->l && r >= now->l && r <= now->r)
            {
                count -= r - now->l + 1;
                int tmp = now->l;
                now->l = r + 1;
                r = tmp - 1;
                if (now->l > now->r)
                {
                    if (pre)
                        pre->next = now->next;
                    Node *temp = now->next;
                    delete now;
                    now = temp;
                }
                break;
            }
            //[  (  )]
            else if (l >= now->l && r <= now->r)
            {
                count -= r - l + 1;
                int tmp = now->l;
                now->l = r + 1;
                r = l - 1;
                l = tmp;
                if (now->l > now->r)
                {
                    if (pre)
                        pre->next = now->next;
                    Node *temp = now->next;
                    delete now;
                    now = temp;
                }
                break;
            }
            //[ (]  )
            else if (l >= now->l && l <= now->r && r > now->r)
            {
                count -= now->r - l + 1;
                int tmp = now->r;
                now->r = l - 1;
                l = tmp + 1;
                if (now->l > now->r)
                {
                    if (pre)
                        pre->next = now->next;
                    Node *temp = now->next;
                    delete now;
                    now = temp;
                }
                else
                {
                    pre = now;
                    now = now->next;
                }
            }
            //(  []  )
            else if (l < now->l && r > now->r)
            {
                count -= now->r - now->l + 1;
                int tmp_r = now->r;
                now->r = now->l - 1;
                now->l = l;
                l = tmp_r + 1;
                pre = now;
                now = now->next;
            }
            //[] ()
            else if (l > now->r)
            {
                pre = now;
                now = now->next;
            }
        }
        if (l <= r)
        {
            Node *temp = new Node(l, r);
            if (pre == nullptr)
            {
                temp->next = now;
                head = temp;
            }
            else
            {
                pre->next = temp;
                temp->next = now;
            }
            count += r - l + 1;
        }
        cout << n - count << endl;
    }

    while (head)
    {
        Node *temp =head;
        head = head->next;
        delete temp;
    }

    return 0;
}

笔试又要挂喽。。。
#360##笔试##笔试凉经#
全部评论
黑白棋,只过了45%,不会线段树,超时了
1 回复 分享
发布于 2022-09-09 20:00 陕西

相关推荐

SHC2:关键问题是你这三段实习是三个不同的岗位…你这样子秋招就是只有一段实习的本科生..
点赞 评论 收藏
分享
评论
1
3
分享

创作者周榜

更多
牛客网
牛客企业服务