我太菜了

T2

给定一张有向图,每个点有点权。试找到一条路径,使得该路径上的点权最
大值减去点权最小值最大,问这个差最大是多少。
 
话说这个题第一个想到的思路是tarjan缩点+拓扑排序来着。。。
这个思路是对的,可惜太难写。。。
我自己的错误思路就不放上了,
 
这个题正解竟然是bfs

只需要找出从最大点走到最小点或者从最小点走到最大点就行了

考虑从每个点出发能走到的所有点当中最小的点是多少以及从这个点向回走的的最小值

枚举每一个点作为起点或者终点

答案只有两种情况:min->max    max->min

直接枚举max是哪个点

对于每个点正着bfs并且反着bfs就好了

优化:对于每个点算他正着走和反着走的答案,每次都bfs是算法慢的原因。我们发现先算1号点再算2号点和倒过来是一样的

所以我们直接把点权从小到大排序,然后一个点一个点去处理所有的答案

如果最小的点能到这个点那这个点一定是从自己开始向前走最小的点。

直接标记一下这个点向前走最小的点是多少

也就是bfs的过程只需要bfs到没有算过答案的点就好了,同理这个点能到达的所有点都不用被算了。在这种方法下每个点只会被bfs一次

代码:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue> using namespace std; const int maxn=;
const int maxm=; int n,m,en,result[maxn],z[maxn],y[maxn]; struct edge
{
int s,e;
bool rev;
edge *next;
}*v[maxn],ed[maxm<<]; void add_edge(int s,int e)
{
en++;
ed[en].next=v[s];v[s]=ed+en;v[s]->e=e;v[s]->rev=false;
en++;
ed[en].next=v[e];v[e]=ed+en;v[e]->e=s;v[s]->rev=true;
} //直接双向建边,因为bfs要两边跑。不过要注意标记哪一条真实存在 bool cmp(int a,int b)
{
return z[a]<z[b];
} void bfs(int p)
{
queue<int> q;
if (!result[p]) result[p]=z[p];//表示已经有答案了
q.push(p);
while (q.size())
{
int now=q.front();
q.pop();
for (edge *e=v[now];e;e=e->next)
if (!e->rev && !result[e->e])//遍历真实存在的边
{
result[e->e]=z[p];
q.push(e->e);
}
}
q.push(p);
while (q.size())
{
int now=q.front();
q.pop();
for (edge *e=v[now];e;e=e->next)
if (e->rev && !result[e->e])//遍历反着的边
{
result[e->e]=z[p];
q.push(e->e);
}
}
} int main()
{
scanf("%d%d",&n,&m);
for (int a=;a<=n;a++)
scanf("%d",&z[a]);
for (int a=;a<=m;a++)
{
int s,e;
scanf("%d%d",&s,&e);
add_edge(s,e);
}
for (int a=;a<=n;a++)
y[a]=a;
sort(y+,y+n+,cmp);
for (int a=;a<=n;a++)
bfs(y[a]);
int ans=;
for (int a=;a<=n;a++)
ans=max(ans,z[a]-result[a]);
printf("%d\n",ans); return ;
}

T3

有N个人,每个人都有两把刷子,每个刷子都有一个属性值。如果说一个人拿着的两把刷子的属性值之差的绝对值超过了N,则这个人无法使用他的两把刷 子。现在你可以选择交换不同人的某把刷子,使得每个人都能够使用他们的刷子问最小所需要的交换次数。

这是个很有思维难度的题。看数据范围很容易想到状压

f[s]表示s所对应的这些人之间能不能通过交换变的合法

把这些人排一个序,只需要检查能否两两组成一对就可以了

设排序之后数组为c[1],c[2],....c[2n-1],c[2n]

答案最大不超过人的个数-1,也就是n-1

每次交换至少搞定一个人

设g[s]为我要让s这些人都合法所需要的最少交换次数

如果s的二进制位上有k个1,那么答案<=k-1

初始化g[s]=k-1,代表总有一种方法是k-1,现在需要找比k-1更小的数

怎么找?N<=16告诉我们,现在应该枚举子集了。

枚举s’,剩下的部分是s^s’

如果这两个部分都能自己解决的话,答案就缩小到了n-2

那么问题就变成了:最多能把n个人分成多少个部分,使得每一个部分都能自己解决

所以g[s]也就表示最多能把s分成多少个部分使得每个部分都能自己解决

g[s]=max(g[s],g[s’]+g[s^s’]) (s’∈s)

Ans=n-g[2^n-1]

qbzt day6 下午 模拟赛的更多相关文章

  1. PKUSC 模拟赛 day1 下午总结

    下午到了机房之后又困又饿,还要被强行摁着看英文题,简直差评 第一题是NOIP模拟赛的原题,随便模拟就好啦 本人模拟功力太渣不小心打错了个变量,居然调了40多分钟QAQ #include<cstd ...

  2. NOIP2020 模拟赛 B 组 Day6

    非常巧妙的一场模拟赛,比较偏向于 Atcoder 的风格,考场上做出了 A .C 两题. A. 礼物购买 排完序后一个个礼物地枚举时间复杂度是\(\Theta(nm)\)的,不能接受.但是注意到,若当 ...

  3. [NOIP2018模拟赛10.16]手残报告

    [NOIP2018模拟赛10.16]手残报告 闲扯 炉石乱斗模式美滋滋啊,又颓到好晚... 上来T2先敲了树剖,看T1发现是个思博DP,然后没过大样例,写个暴力发现还是没过大样例!?才发现理解错题意了 ...

  4. 模拟赛小结:2017 China Collegiate Programming Contest Final (CCPC-Final 2017)

    比赛链接:传送门 前期大顺风,2:30金区中游.后期开题乏力,掉到银尾.4:59绝杀I,但罚时太高卡在银首. Problem A - Dogs and Cages 00:09:45 (+) Solve ...

  5. 冲刺$\mathfrak{CSP-S}$集训模拟赛总结

    开坑.手懒并不想继续一场考试一篇文. 既没必要也没时间侧边栏的最新随笔题解反思相间也丑 而且最近越来越懒了竟然都不写题解了……开坑也是为了督促自己写题解. 并不想长篇大论.简要题解也得写啊QAQ. 目 ...

  6. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  7. NOI模拟赛 Day1

    [考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...

  8. NOIP第7场模拟赛题解

    NOIP模拟赛第7场题解: 题解见:http://www.cqoi.net:2012/JudgeOnline/problemset.php?page=13 题号为2221-2224. 1.car 边界 ...

  9. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

随机推荐

  1. Highways POJ-1751 最小生成树 Prim算法

    Highways POJ-1751 最小生成树 Prim算法 题意 有一个N个城市M条路的无向图,给你N个城市的坐标,然后现在该无向图已经有M条边了,问你还需要添加总长为多少的边能使得该无向图连通.输 ...

  2. Yii2.0 limit(1)与one()

    ActiveRecord中的limit(1)与one()的区别 (new \yii\db\Query())->from('user')->limit(1)->one() public ...

  3. electron实现qq快捷登录!

    之前本来想不写这个功能的,结果客户死活要qq登录! 实在没办法就写了,顺便写个文章!在写之前有两个问题:1: 打开qq授权页面点击页面中的链接会又打开一个页面! .....2: 授权之后是否成功很难去 ...

  4. RMQ 模板

    RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为 n的数列A,回答若干次询问RMQ(i,j),返回数列A中下标在区间[i,j]中的最小/大 ...

  5. 虚拟机的linux(CentOS)系统安装

    一.安装虚拟机:VirtualBox  1.软件下载:https://www.virtualbox.org/  2.一路点击下一步完成安装 二.安装linux:CentOS6.8  1.官方网站:ht ...

  6. k3 cloud的单据存储在业务对象表中

    k3 cloud的单据存储在业务对象表中,表名为T_META_OBJECTTYPE,查询表名和对应的表: select FNAME,FBASEOBJECTID from T_META_OBJECTTY ...

  7. 数据库管理利器——Navicat Premium v12.1.25 下载和安装

    目录 1. 按 2. 新功能 3. 安装 4. 激活 5. 下载地址 1. 按 Navicat Premium 是一套数据库管理工具,让你以单一程序同時连接到 MySQL.MariaDB.SQL Se ...

  8. Vim 系列笔记一

    Vim 系列笔记一 Vim 简介 什么是VIM ? Vim 是从 Vi 发展出来的一个编辑器,是 Vi 的升级版.而 vi 则是 Unix .类Unix(Linux)系统中自带的编辑器. Vim/Vi ...

  9. flask框架上下文

    上下文 上下文:相当于一个容器,保存了 Flask 程序运行过程中的一些信息. Flask中有两种上下文,请求上下文和应用上下文 请求上下文(request context) 在 flask 中,可以 ...

  10. hashcode 和 equals

    https://www.cnblogs.com/Qian123/p/5703507.html#_label0 hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值 详细了解 ...