codeforces 1037E-Trips 【构造】

题目:戳这里

题意:n个点,每天早上会在这n个点中加一条边,每天晚上最大的子图满足子图中每个点都有k条或以上的边。

解题思路:看了官方题解,先把所有的点都连上,再从最后一天往前减边,用set维护最大的子图,注意每减去一条边时,更新该边两端点的状态。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn = 2e5 + 10;
 5 int ans[maxn];
 6 struct edge
 7 {
 8     int u;
 9     int v;
10 }eg[maxn];
11 int cnt[maxn];
12 int n, m, k;
13 set<int>st;
14 set<int>nu[maxn];
15 void del(int x)//更新点的状态
16 {
17     if(nu[x].size() < k && st.erase(x))
18     {
19         for(auto &i:nu[x])
20         {
21            // printf("%d %d\n", x, i);
22             nu[i].erase(x);
23             del(i);
24         }
25     }
26 }
27 int main()
28 {
29     scanf("%d %d %d", &n, &m, &k);
30     for(int i = 1; i <= m; ++i)
31     {
32         scanf("%d %d", &eg[i].u, &eg[i].v);
33         nu[eg[i].u].insert(eg[i].v);
34         nu[eg[i].v].insert(eg[i].u);
35     }
36 //    for(auto &i: nu[4])
37 //    {
38 //        printf("%d\n", i);
39 //    }
40     for(int i = 1; i <= n; ++i)
41     {
42         st.insert(i);
43     }
44     for(int i = 1; i <= n; ++i)//更新出最后一天的最大子图
45     {
46         del(i);
47     }
48     for(int i = m; i >= 1; -- i)//更新之前的
49     {
50         ans[i] = st.size();
51         if(st.empty()) break;
52         nu[eg[i].u].erase(eg[i].v);
53         nu[eg[i].v].erase(eg[i].u);
54         del(eg[i].u);
55         del(eg[i].v);
56     }
57     for(int i = 1; i <= m; ++i)
58     {
59         printf("%d\n",ans[i]);
60     }
61 }

原文地址:https://www.cnblogs.com/zmin/p/9586084.html

时间: 2024-11-06 09:48:18

codeforces 1037E-Trips 【构造】的相关文章

Codeforces 1037E Trips

原题 题目大意: 有\(n\)个人,起初他们都不是朋友.总共有\(m\)天,每天会有两个人成为朋友.他们计划在晚上出去旅游,对于一个人,有如下两种情况: 1.要么他不出去旅游 2.要么有至少\(k\)个朋友跟他一起出去 其中\(n,m,k\)都会给出 (注意,友谊是非传递性的,比如\(a\)和\(b\)是朋友,\(b\)和\(c\)是朋友,但\(a\)和\(c\)不一定是朋友) 你的任务是,对于\(1\)到\(m\)天,输出每天晚上最多可以出去玩的人数 首先,我们将题目抽象为一张无向图,问题转化

CodeForces 26C Parquet 构造题

题目链接:点击打开链接 #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <math.h> #include <set> using namespace std; #define N 105 int n,m,a,b,c; char s[N][N]; set<char>myset; bool inm

codeforces #306D Polygon 构造

题目大意:给定n,要求构造一个凸n边形,使得每个内角都相同,每条边长度都不同 膜拜题解 其实我一开始想的是构造一个正n边形然后把每条边微移一下--不过似乎不是很好写的样子= = #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 110 #define PI 3.14159265358979

Codeforces 1030D 【构造】

LINK 题目大意:给你n,m,k,让你在一个n*m的点阵里构造出一个面积为\(\frac{n*m}{k}\)的三角形 思路 首先要有一个结论是整点三角形的面积分母最多为2,然后就可以判断不存在的情况了 接下来就直接进行构造就可以了 #include<bits/stdc++.h> using namespace std; #define LL long long #define IL inline #define fu(a,b,c) for(LL a=b;a<=c;++a) #defin

New Roads CodeForces - 746G (树,构造)

大意:构造n结点树, 高度$i$的结点有$a_i$个, 且叶子有k个. 先确定主链, 然后贪心放其余节点. #include <iostream> #include <algorithm> #include <cstdio> #include <math.h> #include <set> #include <map> #include <queue> #include <string> #include &l

CodeForces 520C 水构造

//520C - DNA Alignment 1 #include "iostream" 2 #include "cstdio" 3 using namespace std; 4 const __int64 mod = 1e9 + 7; 5 int n; 6 char str[100010]; 7 int Count[5]; 8 9 __int64 bin(__int64 n, __int64 k) 10 { 11 __int64 res = 1; 12 while

codeforces 589a(构造的字符串后,最后要加终止符,,,)

模拟注意细节,没什么好说的#include <cstdio> #include <cstring> #include <vector> #include <algorithm> #include <iostream> #include <map> #include <queue> #include <stack> #include <cmath> //#pragma comment(linker,

Codeforces 534D Handshakes 构造 模拟 贪心

题意:人们依次进大厅,后进来的人会和里面所有的人都握手, 大厅里面有三个人就 其中丧二恩就可以结伴走出大厅.给你每个人进大厅时候握手的次数.让你求一个进场顺序. 解题思路:比赛的时候是用的从后往前推.比较难,发现从前往后直接模拟就行了 . 解题代码: 1 // File Name: d.cpp 2 // Author: darkdream 3 // Created Time: 2015年04月13日 星期一 01时30分17秒 4 5 #include<vector> 6 #include&l

Codeforces 922F Divisibility 构造

Divisibility 我们考虑删数字 首先我们可以发现有一类数很特殊就是大于 n / 2的素数, 因为这些素数的贡献只有1, 并且在n大的时候, 这些素数的个数不是很少, 我们可以最后用这些数去调整, 并且删掉一个数的时候删掉的是它的因子个数, 所以可以用素数去控制最后的数量.当n小的时候直接状压枚举. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk mak