题目链接: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的更多相关文章

  1. 2017 ZSTU寒假排位赛 #7

    题目链接:https://vjudge.net/contest/149498#overview. A题,水题,直接按照题意模拟一下即可. B题,我用的是线段树.大力用的差分标记(上次听zy说过,下次再 ...

  2. 2017 ZSTU寒假排位赛 #1

    题目链接:https://vjudge.net/contest/147102#overview. A题:给出一堆的点,要找出两条垂直的直线,一条与x轴呈45度.-->使得所有的点到任意一条直线的 ...

  3. 2017 ZSTU寒假排位赛 #2

    题目链接:https://vjudge.net/contest/147632#overview. A题,状态压缩一下然后暴力即可. B题,水题,略过. C题,有负数,前缀和不是单调的,因此不能用尺取法 ...

  4. 2017 ZSTU寒假排位赛 #8

    题目链接:https://vjudge.net/contest/149845#overview. A题,水题. B题,给出 p个 第一个人的区间 和 q个第二个人的区间,问[l,r]中有多少个整数满足 ...

  5. 2017 ZSTU寒假排位赛 #6

    题目链接:https://vjudge.net/contest/149212#overview. A题,水题,略过. B题,水题,读清题意即可. C题,数学题,如果把x表示成x=nb+m,则k=n/m ...

  6. 2017 ZSTU寒假排位赛 #5

    题目链接:https://vjudge.net/contest/148901#overview. A题,排序以后xjbg即可. B题,弄个数组记录当前列是不是删除以及当前行是不是已经大于下一行然后乱搞 ...

  7. 2017 ZSTU寒假排位赛 #4

    题目链接:https://vjudge.net/contest/148543#overview. A题:n个罪犯,每个人有一个犯罪值,现在要从里面选出连续的c个人,每个人的犯罪值都不能超过t,问选法的 ...

  8. Codeforces Round #341 (Div. 2)

    在家都变的懒惰了,好久没写题解了,补补CF 模拟 A - Wet Shark and Odd and Even #include <bits/stdc++.h> typedef long ...

  9. 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 ...

随机推荐

  1. Java多线程(十一):线程组

    线程组 线程组可以批量管理线程和线程组对象. 一级关联 例子如下,建立一级关联. public class MyThread43 implements Runnable{ public void ru ...

  2. JVM描述符标识字符含义

    标识字符 含义 B byte C char D double F float I int J long S short Z boolean V void L 对象类型,如Ljava/lang/Obje ...

  3. 关于小程序去除view/navigator 点击后默认阴影效果

    hover:class  :定义容器在被触发时的样式 通常无用,但若不去除则影响用户体验: 为避免被覆盖,约定在wxss底部添加class,比如: <!-- wxml --> <na ...

  4. Python应用范围seo

    Python有许多OOP概念,包括类.对象.数据和方法.抽象.封装.继承和多态性等原则也可以使用Python实现和表示.python有几个高级函数,包括迭代器.生成器.列表分析器.lambda表达式和 ...

  5. 【Distributed】CDN

    一.概述 1.1 Web前端优化 1.2 DNS域名解析过程 1.3 传统方式请求静态资源 二.CDN内容分发 2.1 什么是CDN 2.2 CDN内容分发原理 2.3 阿里云环境实战搭建CDN内容分 ...

  6. 【Git】四、本地Git的工作原理

    一.工作区 第一篇创建版本库讲的有些笼统,这里详细区分一下各个概念 在第一篇我们创建了一个文件夹GitRepo,但其实这个文件夹本身并不是版本库,只是我们的工作区.我们所有的文件创建和修改都在这里执行 ...

  7. shell脚本编写之Hello World

    Linux下编写第一个Shell脚本 //创建一个.sh文件 vi demo1.sh //按i进入编辑模式 echo "Hello World !" //按esc→shift+:→ ...

  8. Oracle笔记(十) 约束

    表虽然建立完成了,但是表中的数据是否合法并不能有所检查,而如果要想针对于表中的数据做一些过滤的话,则可以通过约束完成,约束的主要功能是保证表中的数据合法性,按照约束的分类,一共有五种约束:非空约束.唯 ...

  9. CentOS7 - Package does not match intended download 问题解决

    yum 安装软件,有时会出现 Error: Package does not match intended download,这时需要彻底清除已有的下载,然后重新安装即可. $ sudo yum cl ...

  10. java线程基础巩固---策略模式在Thread和Runnable中的应用分析

    在上篇[http://www.cnblogs.com/webor2006/p/7709647.html]中已经学习了Runnable出现的好处,其实这种设计是采用的一种策略模式,所以为了进一步理解Ru ...