2017 ZSTU寒假排位赛 #3
题目链接:https://vjudge.net/contest/147974#overview。
A题,费用流,不会。。跳过了。
B题,给一个图,问至少添加几条边能成为强连通图。显然缩点,要使得成为一个scc,任意一个点都要至少一个入度和出度,而一条边可以提供一个入度和出度,因为答案为max(入度为0的点,出度为0的点)。如果要求最多能添加几条使得还不是scc,则参照:最多添加几条使得还不是scc。如果是无向图问至少添加几条使得是边双联通,则参照:至少添加几条使得边双联通。
C题,线段树区间合并,貌似暑假的时候写过类似的,但是忘记了。。代码如下:
//#include <bits/stdc++.h>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#define t_mid (l+r>>1)
#define ls (o<<1)
#define rs (o<<1|1)
#define lson ls,l,t_mid
#define rson rs,t_mid+1,r
using namespace std;
const int N = + ; int a[N];
// sub表示节点o的lcis的最长长度,l_val和r_val分别表示这个节点最左边和最右边的值分别是多少
// l_sub表示这个节点从最左边开始的最长的lcis的长度,r_sub同
int sub[N<<],l_val[N<<],r_val[N<<],l_sub[N<<],r_sub[N<<];
int T,n,q;
void up(int o,int l,int r)
{
int len = r - l + ;
l_val[o] = l_val[ls], r_val[o] = r_val[rs]; // 更新l_val,r_val
// 更新sub的值
sub[o] = max(sub[ls], sub[rs]);
if(r_val[ls] < l_val[rs]) sub[o] = max(sub[o], r_sub[ls]+l_sub[rs]); // 更新l_sub,r_sub
l_sub[o] = l_sub[ls];
if(l_sub[o] == len-len/ && r_val[ls] < l_val[rs]) l_sub[o] += l_sub[rs]; r_sub[o] = r_sub[rs];
if(r_sub[o] == len/ && r_val[ls] < l_val[rs]) r_sub[o] += r_sub[ls];
}
void build(int o,int l,int r)
{
if(l == r)
{
sub[o] = l_sub[o] = r_sub[o] = ;
l_val[o] = r_val[o] = a[l];
return ;
}
build(lson);
build(rson);
up(o,l,r);
}
void update(int o,int l,int r,int pos,int x)
{
if(l == r)
{
l_val[o] = r_val[o] = x;
return ;
}
if(pos <= t_mid) update(lson,pos,x);
else update(rson,pos,x);
up(o,l,r);
}
int query(int o,int l,int r,int ql,int qr)
{
if(l == ql && r == qr) return sub[o];
int ans = ;
if(qr <= t_mid) ans = query(lson,ql,qr);
else if(ql > t_mid) ans = query(rson,ql,qr);
else
{
ans = max(query(lson,ql,t_mid), query(rson,t_mid+,qr));
// 注意下面一行的两个min
if(r_val[ls] < l_val[rs]) ans = max(ans, min(r_sub[ls], t_mid-ql+) + min(l_sub[rs], qr-t_mid));
}
return ans;
} int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&q);
for(int i=;i<=n;i++) scanf("%d",a+i);
build(,,n);
while(q--)
{
char s[];
int x,y;
scanf("%s%d%d",s,&x,&y);
if(s[] == 'U') update(,,n,x+,y);
else printf("%d\n",query(,,n,x+,y+));
}
}
return ;
}
线段树区间合并
D题,分组背包,每组中,先选择一个,然后该组中其他的有三个选择,不选,或者从之前一组中转移(也就是放弃了这组中第一个选的而选这组中的这个),或者从这组中的转移(这组中的第一个要选)。代码如下:
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <iostream>
#include <stdlib.h>
#include <string>
#include <stack>
using namespace std;
const int inf = 0x3f3f3f3f;
typedef long long ll;
typedef pair<int,int> pii;
const int N = + ; int n,m,k;
vector<pii> v[];
int dp[][+]; int main()
{
while(scanf("%d%d%d",&n,&m,&k) == )
{
for(int i=;i<=k;i++) v[i].clear();
for(int i=;i<=n;i++)
{
int pos,mo,val;
scanf("%d%d%d",&pos,&mo,&val);
v[pos].push_back(pii(mo,val));
}
int sum = ;
int flag = ;
for(int i=;i<=k;i++)
{
if(v[i].size() == )
{
flag = ;
break;
}
sort(v[i].begin(), v[i].end());
sum += v[i][].first;
}
if(sum > m || flag == )
{
printf("Impossible\n");
continue;
}
memset(dp,,sizeof dp);
for(int i=;i<=k;i++)
{
for(int j=;j<v[i].size();j++)
{
int w = v[i][j].first, val = v[i][j].second;
for(int mask=m;mask>=w;mask--)
{
if(j == ) dp[i][mask] = dp[i-][mask-w] + val;
else dp[i][mask] = max({dp[i][mask], dp[i-][mask-w]+val, dp[i][mask-w]+val});
}
}
}
printf("%d\n",dp[k][m]);
}
}
分组背包
E题,直接暴力枚举即可。完全背包也行。第一次wa是因为认为贪心先拿最小的最优,其实不然。例如:53--10,11,23。显然11的拿3个再拿10的两个比较好。
2017 ZSTU寒假排位赛 #3的更多相关文章
- 2017 ZSTU寒假排位赛 #7
题目链接:https://vjudge.net/contest/149498#overview. A题,水题,直接按照题意模拟一下即可. B题,我用的是线段树.大力用的差分标记(上次听zy说过,下次再 ...
- 2017 ZSTU寒假排位赛 #1
题目链接:https://vjudge.net/contest/147102#overview. A题:给出一堆的点,要找出两条垂直的直线,一条与x轴呈45度.-->使得所有的点到任意一条直线的 ...
- 2017 ZSTU寒假排位赛 #2
题目链接:https://vjudge.net/contest/147632#overview. A题,状态压缩一下然后暴力即可. B题,水题,略过. C题,有负数,前缀和不是单调的,因此不能用尺取法 ...
- 2017 ZSTU寒假排位赛 #8
题目链接:https://vjudge.net/contest/149845#overview. A题,水题. B题,给出 p个 第一个人的区间 和 q个第二个人的区间,问[l,r]中有多少个整数满足 ...
- 2017 ZSTU寒假排位赛 #6
题目链接:https://vjudge.net/contest/149212#overview. A题,水题,略过. B题,水题,读清题意即可. C题,数学题,如果把x表示成x=nb+m,则k=n/m ...
- 2017 ZSTU寒假排位赛 #5
题目链接:https://vjudge.net/contest/148901#overview. A题,排序以后xjbg即可. B题,弄个数组记录当前列是不是删除以及当前行是不是已经大于下一行然后乱搞 ...
- 2017 ZSTU寒假排位赛 #4
题目链接:https://vjudge.net/contest/148543#overview. A题:n个罪犯,每个人有一个犯罪值,现在要从里面选出连续的c个人,每个人的犯罪值都不能超过t,问选法的 ...
- Codeforces Round #341 (Div. 2)
在家都变的懒惰了,好久没写题解了,补补CF 模拟 A - Wet Shark and Odd and Even #include <bits/stdc++.h> typedef long ...
- 2017杭电ACM集训队单人排位赛 - 6
2017杭电ACM集训队单人排位赛 - 6 排名 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 59 1 X X 1 1 X X 0 1 ...
随机推荐
- Spring、SpringMVC版本及配置
一.Spring版本 Spring的最新版本是Spring 5.x,Spring 4.x的最后版本是Spring 4.3.x,会维护到2020年(Spring的GitHub主页对此有说明). 二.Sp ...
- Spring实战(二)Spring容器和bean的生命周期
引入问题: 在XML配置文件中配置bean后,这些文件又是如何被加载的?它们被加载到哪里去了? Spring容器——框架核心 1.什么是Spring容器?它的功能是什么? 在基于Spring的应用中, ...
- .Net C# Dictionary 和参数字符串互转
#region Parse #region Dictionary Parse To String /// <summary> /// Dictionary Parse To String ...
- fish redux 个人理解
fish redux 理解 fish redux是什么 Fish Redux 是一个基于 Redux 数据管理的组装式 flutter 应用框架, 它特别适用于构建中大型的复杂应用. 它的特点是配置式 ...
- javaIO——AutoCloseable 小试
前面在 IO 概述篇提到过,AutoCloseable 接口类会自动调用 close() 方法,那究竟具体怎么写呢?以及发生异常情况下或者多个资源是不是都能自动调用呢?我们来写一个简单的类测试一下就知 ...
- Flask框架入门
Flask-基本入门 简介 flask被称为微型框架,只提供了一个强健的核心,其他功能全部通过扩展库来实现:也就是说可以根据项目需要量身打造.他适合入门学习以及高手研究. 组成:WSGI.模板引擎(J ...
- Django 之form简单应用
form组件 参考链接:https://www.cnblogs.com/maple-shaw/articles/9537309.html form组件的作用: 1.自动生成input框 2.可以对数据 ...
- 14.SpringMVC核心技术-类型转换器
类型转换器 在前面的程序中,表单提交的无论是 int 还是 double 类型的请求参数,用于处理该请求 的处理器方法的形参, 均可直接接收到相应类型的相应数据,而非接收到 String 再手工转换. ...
- shell菜单选择
我们会遇到很多进入后台系统的时候,会根据选择,进入不同的系统,下面是一个简单的例子: #!/bin/sh function menu (){ cat << EOF------------- ...
- Jmeter服务器压力测试使用说明
Jmeter服务器压力测试使用说明 Apache JMeter是Apache组织开发的基于Java的压力测试工具. 官方地址:http://jmeter.apache.org/download_jme ...