Codeforces 1082 毛毛虫图构造&最大权闭合子图
A
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const int MAXN = , MAXM = ;
- //int to[MAXM << 1], nxt[MAXM << 1], Head[MAXN], ed = 1;
- //int cost[MAXM << 1];
- //inline void addedge(int u, int v, int c)
- //{
- // to[++ed] = v;
- // nxt[ed] = Head[u];
- // cost[ed] = c;
- // Head[u] = ed;
- //}
- inline void read(ll &v)
- {
- v = ;
- char c = ;
- int p = ;
- while (c < '' || c > '') {
- if (c == '-') {
- p = -;
- }
- c = getchar();
- }
- while (c >= '' && c <= '') {
- v = (v << ) + (v << ) + c - '';
- c = getchar();
- }
- v *= p;
- }
- int main()
- {
- ll T;
- read(T);
- while (T--) {
- ll n, x, y, d;
- read(n), read(x), read(y), read(d);
- ll cha = abs(x - y);
- if (cha % d == ) {
- ll ans = cha / d;
- printf("%I64d\n", ans);
- continue;
- } else {
- ll anser = LLONG_MAX;
- ll ans1, ans2;
- ans1 = ans2 = LLONG_MAX;
- if ((y - ) % d == ) {
- ans1 = (x - ) / d;
- if ((x - ) % d) {
- ans1++;
- }
- ans1 += (y - ) / d;
- }
- if ((n - y) % d == ) {
- ans2 = (n - x) / d;
- if ((n - x) % d) {
- ans2++;
- }
- ans2 += (n - y) / d;
- }
- anser = min(anser, min(ans1, ans2));
- if (anser == LLONG_MAX) {
- printf("-1\n");
- } else {
- printf("%I64d\n", anser);
- }
- }
- }
- }
B
注意一下坑点即可
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const int MAXN = , MAXM = ;
- //int to[MAXM << 1], nxt[MAXM << 1], Head[MAXN], ed = 1;
- //int cost[MAXM << 1];
- //inline void addedge(int u, int v, int c)
- //{
- // to[++ed] = v;
- // nxt[ed] = Head[u];
- // cost[ed] = c;
- // Head[u] = ed;
- //}
- inline void read(int &v)
- {
- v = ;
- char c = ;
- int p = ;
- while (c < '' || c > '') {
- if (c == '-') {
- p = -;
- }
- c = getchar();
- }
- while (c >= '' && c <= '') {
- v = (v << ) + (v << ) + c - '';
- c = getchar();
- }
- v *= p;
- }
- vector<pair<int, char> > anss;
- queue<pair<int, char> > que;
- int main()
- {
- ios_base::sync_with_stdio();
- cin.tie();
- int n;
- cin >> n;
- string a;
- cin >> a;
- pair<int, char> cnt, zz;
- cnt.first = cnt.second = ;
- int sum = ;
- for (int i = ; i <= n; i++) {
- if (i == n) {
- anss.push_back(cnt);
- break;
- }
- if (a[i] != cnt.second) {
- if (cnt.first != ) {
- anss.push_back(cnt);
- }
- cnt.first = ;
- cnt.second = a[i];
- } else {
- cnt.first++;
- }
- }
- int sz = anss.size();
- for (int i = ; i < sz; i++) {
- if (anss[i].second == 'G') {
- sum += anss[i].first;
- }
- }
- int ans = ;
- for (int i = ; i < sz; i++) {
- cnt = anss[i];
- if (cnt.second == 'G') {
- if (cnt.first == sum) {
- ans = max(ans, cnt.first);
- } else {
- ans = max(ans, cnt.first + );
- }
- } else {
- if (cnt.first == ) {
- if (i > && i < sz - ) {
- ans = max(ans, anss[i - ].first + anss[i + ].first);
- if (anss[i - ].first + anss[i + ].first != sum) {
- ans = max(ans, anss[i - ].first + anss[i + ].first + );
- }
- }
- }
- }
- }
- cout << ans << endl;
- }
C
sort一下算下贡献即可
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const int MAXN = , MAXM = ;
- //int to[MAXM << 1], nxt[MAXM << 1], Head[MAXN], ed = 1;
- //int cost[MAXM << 1];
- //inline void addedge(int u, int v, int c)
- //{
- // to[++ed] = v;
- // nxt[ed] = Head[u];
- // cost[ed] = c;
- // Head[u] = ed;
- //}
- inline void read(int &v)
- {
- v = ;
- char c = ;
- int p = ;
- while (c < '' || c > '') {
- if (c == '-') {
- p = -;
- }
- c = getchar();
- }
- while (c >= '' && c <= '') {
- v = (v << ) + (v << ) + c - '';
- c = getchar();
- }
- v *= p;
- }
- int pre[];
- vector<int> num[];
- int main()
- {
- ios_base::sync_with_stdio();
- cin.tie();
- int n, m;
- cin >> n >> m;
- int u, v;
- for (int i = ; i <= n; i++) {
- cin >> u >> v;
- num[u].push_back(v);
- }
- for (int i = ; i <= m; i++) {
- if (num[i].size()) {
- sort(num[i].begin(), num[i].end());
- }
- }
- int ans = ;
- for (int i = ; i <= m; i++) {
- int len = num[i].size();
- if (len) {
- int sum = ;
- for (int j = ; j < len; j++) {
- sum += num[i][len - j - ];
- //cout<<i<<" "<<j<<" "<<sum<<endl;
- if (sum > ) {
- pre[j + ] += sum;
- } else {
- break;
- }
- }
- }
- }
- for (int i = ; i <= ; i++) {
- ans = max(ans, pre[i]);
- }
- cout << ans << endl;
- }
D
构造题 毛毛虫图
- #include<bits/stdc++.h>
- using namespace std;
- const int MAXN = ;
- inline void read(int &v) {
- v = ;
- char c = ;
- int p = ;
- while (c < '' || c > '') {
- if (c == '-') {
- p = -;
- }
- c = getchar();
- }
- while (c >= '' && c <= '') {
- v = (v << ) + (v << ) + c - '';
- c = getchar();
- }
- v *= p;
- }
- int n, m, a[MAXN], b[MAXN], f[MAXN], s[MAXN], t[MAXN], an, sm, T, z;
- int main() {
- int i, j = , a1, a2, e = ;
- read(n);
- for (int i = ; i <= n; i++) {
- read(a[i]);
- sm += a[i];
- }
- if (sm < n * - ) {
- cout << "NO" << endl;
- return ;
- }
- for (int i = ; i <= n; i++) {
- if (a[i] >= ) {
- f[i] = ;
- b[++z] = i;
- if (z >= ) {
- s[z] = b[z - ];
- t[z] = i;
- }
- }
- }
- for (int i = ; i <= z; i++) {
- a[b[i]] -= (i != ) + (i != z);
- }
- cout << "YES " << min(z + , n - ) << endl << n - << endl;
- for (int i = ; i <= n; i++) {
- if (a[i] == && !f[i]) {
- if (!e) {
- e = ;
- a[b[z]]--;
- s[++z] = i;
- t[z] = b[z - ];
- } else {
- for (; !a[b[j]]; j++);
- a[b[j]]--;
- s[++z] = i;
- t[z] = b[j];
- }
- }
- }
- for (int i = ; i <= n; i++) {
- cout << s[i] << " " << t[i] << endl;
- }
- }
G
把每条边当做一个点 搞最大权闭合子图即可
- //Netflow dumpling
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const int MAXN = ;
- const int MAXM = ;
- const ll INF = ;
- ll Head[MAXN], cur[MAXN], lev[MAXN], to[MAXM << ], nxt[MAXM << ], ed, S, T;
- ll f[MAXM << ];
- inline void addedge(int u, int v, ll cap)
- {
- to[++ed] = v;
- nxt[ed] = Head[u];
- Head[u] = ed;
- f[ed] = cap;
- to[++ed] = u;
- nxt[ed] = Head[v];
- Head[v] = ed;
- f[ed] = ;
- return;
- }
- inline bool BFS()
- {
- int u;
- memset(lev, -, sizeof(lev));
- queue<int>q;
- lev[S] = ;
- q.push(S);
- while (q.size()) {
- u = q.front();
- q.pop();
- for (int i = Head[u]; i; i = nxt[i])
- if (f[i] && lev[to[i]] == -) {
- lev[to[i]] = lev[u] + ;
- q.push(to[i]);
- /*
- if (to[i] == T)
- {
- return 1;
- }
- magic one way optimize
- */
- }
- }
- memcpy(cur, Head, sizeof Head);
- return lev[T] != -;
- }
- inline ll DFS(int u, ll maxf)
- {
- if (u == T || !maxf) {
- return maxf;
- }
- ll cnt = ;
- for (ll &i = cur[u], tem; i; i = nxt[i])
- if (f[i] && lev[to[i]] == lev[u] + ) {
- tem = DFS(to[i], min(maxf, f[i]));
- maxf -= tem;
- f[i] -= tem;
- f[i ^ ] += tem;
- cnt += tem;
- if (!maxf) {
- break;
- }
- }
- if (!cnt) {
- lev[u] = -;
- }
- return cnt;
- }
- ll Dinic()
- {
- ll ans = ;
- while (BFS()) {
- ans += DFS(S, INF);
- }
- return ans;
- }
- void init(int SS, int TT)
- {
- memset(Head, , sizeof(Head));
- ed = ;
- S = SS;
- T = TT;
- return;
- }
- int main()
- {
- ios_base::sync_with_stdio();
- cin.tie();
- int n, m;
- ll u, v, c;
- cin >> n >> m;
- init(, n + m + );
- for (int i = ; i <= n; i++) {
- cin >> c;
- addedge(m + i, T, c);
- }
- ll summ = ;
- for (int i = ; i <= m; i++) {
- cin >> u >> v >> c;
- summ += c;
- addedge(S, i, c);
- addedge(i, m + u, INF);
- addedge(i, m + v, INF);
- }
- cout << summ - Dinic() << endl;
- return ;
- }
Codeforces 1082 毛毛虫图构造&最大权闭合子图的更多相关文章
- codeforces 1082G - Petya and Graph 最大权闭合子图 网络流
题意: 让你选一些边,选边的前提是端点都被选了,求所有的边集中,边权和-点权和最大的一个. 题解: 对于每个边建一个点,然后就是裸的最大权闭合子图, 结果比赛的时候我的板子太丑,一直T,(不会当前弧优 ...
- 【洛谷P3410】拍照题解(最大权闭合子图总结)
题目描述 小B有n个下属,现小B要带着一些下属让别人拍照. 有m个人,每个人都愿意付给小B一定钱让n个人中的一些人进行合影.如果这一些人没带齐那么就不能拍照,小B也不会得到钱. 注意:带下属不是白带的 ...
- hdu 3879 hdu 3917 构造最大权闭合图 俩经典题
hdu3879 base station : 各一个无向图,点的权是负的,边的权是正的.自己建一个子图,使得获利最大. 一看,就感觉按最大密度子图的构想:选了边那么连接的俩端点必需选,于是就以边做点 ...
- CodeForces 1082 G Petya and Graph 最大权闭合子图。
题目传送门 题意:现在有一个图,选择一条边,会把边的2个顶点也选起来,最后会的到一个边的集合 和一个点的集合 , 求边的集合 - 点的集合最大是多少. 题解:裸的最大权闭合子图. 代码: #inclu ...
- bzoj 3232 圈地游戏 —— 01分数规划+最小割建图(最大权闭合子图)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 心烦意乱的时候调这道题真是...越调越气,就这样过了一晚上... 今天再认真看看,找出 ...
- 洛谷 P4174 [NOI2006]最大获利 && 洛谷 P2762 太空飞行计划问题 (最大权闭合子图 && 最小割输出任意一组方案)
https://www.luogu.org/problemnew/show/P4174 最大权闭合子图的模板 每个通讯站建一个点,点权为-Pi:每个用户建一个点,点权为Ci,分别向Ai和Bi对应的点连 ...
- CF 103E Buying Sets 最大权闭合子图,匹配 难度:4
http://codeforces.com/problemset/problem/103/E 这道题首先一看就很像是最大权闭合子图,但是我们可以认为现在有两种点,数字和集合点,我们需要消除数字点的影响 ...
- 【POJ 2987】Firing (最小割-最大权闭合子图)
裁员 [问题描述] 在一个公司里,老板发现,手下的员工很多都不务正业,真正干事员工的没几个,于是老板决定大裁员,每开除一个人,同时要将其下属一并开除,如果该下属还有下属,照斩不误.给出每个人的贡献值和 ...
- Petya and Graph(最小割,最大权闭合子图)
Petya and Graph http://codeforces.com/contest/1082/problem/G time limit per test 2 seconds memory li ...
随机推荐
- DRF视图-基类
2个视图基类 REST framework 提供了众多的通用视图基类与扩展类,以简化视图的编写. 为了区分上面请求和响应的代码,我们再次创建一个新的子应用: python manage.py star ...
- PJzhang:如何缓解Mimikatz从Windows2008 R2内存中读取域控密码?
猫宁!!! 参考: https://xz.aliyun.com/t/4180 https://www.anquanke.com/post/id/156299 https://www.cnblogs.c ...
- D3 GEO应用专题(一):绘制旋转的3D地球
https://gallery.echartsjs.com/explore.html#sort=rank~timeframe=all~author=all 雷达图 https://blog.csdn. ...
- PYTHON 100days学习笔记005:总结和练习
目录 day005:总结和练习 1.寻找水仙花数 2.寻找"完美数" 3."百鸡百钱"问题 4.生成"斐波那契数列" 5.Craps赌博游戏 ...
- poj3122 Pie (二分)
题目链接:https://vjudge.net/problem/POJ-3122 题意:有n块饼,m+1个人,将饼均分成m+1块,求每块最大的大小. 思路:水二分,显然每块的大小与可以给多少人吃具有单 ...
- [ZJOI2010]数字计数 题解
题面 这道题是一道数位DP的模板题: 因为窝太蒟蒻了,所以不会递推,只会记忆化搜索: 首先,咋暴力咋来: 将一个数分解成一个数组,这样以后方便调用: 数位DP的技巧:(用1~b的答案)-(1~a的答案 ...
- PAT A1046 Shortest Distance (20 分)
题目提交一直出现段错误,经过在网上搜索得知是数组溢出,故将数组设置的大一点 AC代码 #include <cstdio> #include <algorithm> #defin ...
- django CBV装饰器 自定义django中间件 csrf跨站请求伪造 auth认证模块
CBV加装饰器 第一种 @method_decorator(装饰器) 加在get上 第二种 @method_decorator(login_auth,name='get') 加在类上 第三种 @met ...
- Ruby Rails学习中:有点内容的静态页面
续上篇: 一. 有点内容的静态页面 rails new 命令创建了一个布局文件, 不过现在最好不用.我们重命名这个文件: $ mv app/views/layouts/application.html ...
- Django初步完成:登录、注册、退出
python环境:python2.7 开发工具:pycharm 项目名称:mysite5 app名称:online settings:映射app路径 INSTALLED_APPS = [ 'djang ...