ma18e Trips

题面

题意

  • 给定 n n n 个点, m m m 个时刻, k k k,每个时刻都会新加入一条边,对于每个时刻,求此时的最大点集大小,满足点集的点构成的子图中的点的度数都不小于 k k k
  • 2 ≤ n ≤ 2 × 1 0 5 , 2 ≤ m ≤ 1 × 1 0 5 , 1 ≤ k ≤ n 2\le n \le 2\times10^5,2\le m \le 1\times10^5,1\le k \le n 2n2×105,2m1×105,1kn

思路

  1. 考虑如何求一张图满足题意的点集:拓扑思想,连锁反应,一个点度数 < k 了,这个点就不合法了,就要删除该点,将其加入队列,遍历出边,如果 i n [ v ] = = k − 1 in[v]==k-1 in[v]==k1,将 v v v 加入队列。因为每个点只加入一次队列,故当一个点度数 < k - 1 时,此时不需要再考虑该点。最后不在队列中的点便是答案。
  2. 如果正序做,每次加一条边,可能让本来 i n [ v ] < k − 1 in[v]<k-1 in[v]<k1 的点,即不需要再考虑的点重复进队,复杂度卡成了 O ( n m ) O(nm) O(nm)
  3. 正难则反,我们考虑倒序删边。此时发现一个点的度数只减不增,不会让点重复进队,答案有单调性。复杂度降为 O ( n + m ) O(n+m) O(n+m)
  4. 注意:无向图,删边的时候用 map 要把两条有向边都删掉。如果遍历到当前边已经被删,直接继承上一次的答案。

代码

const int N = 2e5 + 5;

struct node {
    int u, v;
    friend bool operator < (node a, node b) {
        return a.u == b.u ? a.v < b.v : a.u < b.u;
    }
};

struct edge {int u, v;} ed[N];

int n, m, k, ans, in[N], a[N];
vi e[N];
queue<int> q;
map<node, bool> vis;

void inp() {
    cin >> n >> m >> k;
    rep(i, 1, m) {
        int u = rd, v = rd;
        ed[i] = {u, v};
        e[u].pb(v), e[v].pb(u);
        ++in[u], ++in[v];
    }
}

void solve() {
    while(!q.empty()) {
        int u = q.front(); q.pop();
        --ans;
        for(int v : e[u]) {
            if(vis[{u, v}]) continue;
            vis[{u, v}] = vis[{v, u}] = true;
            --in[v];
            if(in[v] == k - 1) q.push(v);
        }
    }
}

int main() {
    inp();
    ans = n;
    rep(i, 1, n) if(in[i] < k) q.push(i);
    solve();
    a[m] = ans;
    per(i, m, 2) {
        int u = ed[i].u, v = ed[i].v;
        if(vis[{u, v}]) {a[i - 1] = a[i]; continue;}
        vis[{u, v}] = vis[{v, u}] = true;
        --in[u], --in[v];
        if(in[u] < k) q.push(u);
        if(in[v] < k) q.push(v);
        solve();
        a[i - 1] = ans;
    }
    rep(i, 1, m) cout << a[i] << endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
牙科就诊管理系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线查看数据。管理员管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等功能。牙科就诊管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 管理员在后台主要管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等。 牙医列表页面,此页面提供给管理员的功能有:查看牙医、新增牙医、修改牙医、删除牙医等。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。药品管理页面,此页面提供给管理员的功能有:新增药品,修改药品,删除药品。药品类型管理页面,此页面提供给管理员的功能有:新增药品类型,修改药品类型,删除药品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值