首页 > 其他分享 >L - Session in BSU

L - Session in BSU

时间:2022-10-16 16:33:07浏览次数:72  
标签:begin num Session BSU ll firmx tag ans

传送门

题意:
有n场考试,给出每场考试的\(a_i, b_i\)值, \(a_i < b_i\), \(a_i, b_i\)代表这场考试可以考的时间,问最少需要多少天来考完n场考试,如果不能考完就输出-1


思路:
先介绍一下整体思路,将\(a_i, b_i\)连边,连通块里面的边和点的情况可以分为3中情况

  • 边 == 点数,对于这种情况,取里面的最大值
  • 边 == 点数 + 1,对于这种情况,取次大值
  • 边 > 点数,对于这种情况是不可能的,直接输出-1

对于这种两个两个联动,考虑下并查集,就用并查集来实现一个连边的操作, 这里用到了连通块的思想,连通块图论可以处理,并查集也可以处理, 然后边 == 点数,可以用一个tag标记来实现,边数 > 点数,那就是在已经有环的基础上,又有一个环,还是用tag来标记实现,求每个点的最大值和最小值,可以利用类似dp的思想,先赋初值,然后在在求解, 最后ans再取最大值即可


总结:
并查集判断实现边点关系,求一个连通块中的最大值和次大值

点击查看代码
#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);
#define endl '\n'
using namespace std;

typedef long long ll;
const ll MAXN = 1e6 + 10;
ll n;
ll fa[MAXN << 1], firmx[MAXN << 1], secmx[MAXN << 1], tag[MAXN << 1];
struct Node
{
    ll a, b;
} w[MAXN];

ll find(ll x)
{
    return x == fa[x] ? x : fa[x] = find(fa[x]);
}

int main()
{
    IOS; cin.tie(0), cout.tie(0);
    cin >> n;
    vector<ll> num;
    for (int i = 0, a, b; i < n; ++i)
    {
        cin >> w[i].a >> w[i].b;
        num.emplace_back(w[i].a);
        num.emplace_back(w[i].b);
    }
    sort(num.begin(), num.end());
    auto newend = unique(num.begin(), num.end());
    num.erase(newend, num.end());
    for (int i = 0; i < n; ++i)
    {
        w[i].a = lower_bound(num.begin(), num.end(), w[i].a) - num.begin();
        w[i].b = lower_bound(num.begin(), num.end(), w[i].b) - num.begin();
    }
    for (int i = 0; i < num.size(); ++i)
        fa[i] = i, firmx[i] = num[i];
    for (int i = 0; i < n; ++i)
    {
        ll u = find(w[i].a), v = find(w[i].b);
        if (u != v)
        {
            fa[v] = u, tag[u] |= tag[v];
            if (firmx[v] > firmx[u])
                secmx[u] = max(secmx[v], firmx[u]), firmx[u] = firmx[v];
            else
                secmx[u] = max(secmx[u], firmx[v]);     
        }
        else if (tag[u])
            puts("-1"), exit(0);
        else
            tag[u] = 1;
        
    }    
    ll ans = 0;
    for (int i = 0; i < num.size(); ++i)
        {
            if (i == find(i))
            {
                if (tag[i])
                    ans = max(ans, firmx[i]);
                else
                    ans = max(ans, secmx[i]);    
            }
        }        
        cout << ans << endl;
    return 0;
}

标签:begin,num,Session,BSU,ll,firmx,tag,ans
From: https://www.cnblogs.com/jumo-xiao/p/16796466.html

相关文章

  • Session共享实现
    Session共享实现为什么要实现session共享呢随着互联网公司的项目在微服务和分布式的环境下进行的搭建,导致一个项目可能分别部署在几个甚至很多的服务器集群下,此时就会......
  • 基于session和redis两种方式的短信登录业务流程及代码实现
    短信登录业务短信登录的业务流程基于session实现短信登录的业务流程流程说明:发送短信:从前端获取到手机号,校验手机号,生成验证码,将验证码保存到session,并将验证码发......
  • cookie、session、token
    为什么要用Session和Cookie?因为Session和Cookie可以记录用户状态信息其实说到底,cookie、session、token都围绕了一个点:身份认证。 为什么要认证一个需要登录......
  • php 中 session存储
    转载网址:https://blog.csdn.net/miliu123456/article/details/107048378/php中session更换存储方式(file,redis,mysql)在当前php的配置文件中修改 查看当前......
  • Session用法案例 -->实现简单购物车功能(实际项目可能不会这么使用)
    071201709091、session是在cookie的基础之上,利用cookie返回JSESSIONID(key[服务器随机生成])存在客户端实现,正真的数据存在服务端[key-value]。2、se......
  • cookie,session,token介绍,jwt原理介绍,base64编码和解码,drf-jwt快速使用,drf-jwt修改返
    1.cookie,session,token介绍这三者之间是有联系的,在互联网发展初期先有了cookie,在发展的过程中,因为出现了登录,还有购物车等功能,这是http的请求是无状态的,这是要解决这个问......
  • 【已解决】Navicat 进入 MySQL 提示错误:Table 'performance_schema.session_variables
    一、问题原因二、试错以为是MySQL服务启动有问题,重新启动了下服务,仍然没有解决。三、解决找到MySQL安装目录,进入bin文件夹下,在bin文件夹下运行命令行窗口,输入以下命令......
  • HttpSession对象 的学习
    HttpSession对象学习链接:https://www.bilibili.com/video/BV1BK4y1P7Li/?spm_id_from=333.999.0.01.session作用:表示一次会话或者是确认一个用户,并且在一次会话中,一个......
  • Cookie And Session
    在网络连接中,http请求是无状态的。那么就需要一种会话跟踪技术,用来跟踪用户的整个会话。保证服务器可以确定用户的身份。常用的技术就是Cookie和Session。一、 Cookie ......
  • cookie session token 对比
    http是无状态,也就是说每次的http请求都是独立的。请求和响应无法维护,都是一次性的,比说在blog上留言发布都需要用户信息的,我们要存储登录用户的状态,**存储方式**1.......