【codeforces 738E】Subordinates
2024-08-26 03:43:34
【题目链接】:http://codeforces.com/problemset/problem/738/E
【题意】
给你一个类似树形的关系;
然后告诉你某个人头顶上有多少个上司numi;
只有father的father才算是它的上司,father的兄弟不算;
然后告诉你所有的人里面最大boss的标号;
问你最少有多少个numi是错误的;
【题解】
会发现;
这里的numi实际上和这个人在树中的深度对应;
则我们把最后的numi数组升序排一下;
如果相邻两个数字它们的差的绝对值不超过1;
且第一个数字为0,且0只出现一次;
那么这个num数组就是合法的;
因为这就表明这棵树是没有断层的;
你总有办法安排它.
那如果中间有断层怎么办?
(这就说明原问题等价于,要改变最少的人的数字,使得最后的升序序列符合上面的要求);
比如如果最后的排序结果为
0 1 1 2 4 5 6 8
我们每次找,最小的,还没被覆盖到的数字;
比如,这里有一个3没被填充到;
这个时候;
我们的策略就是,找最大的,已经被填充过的数字;
(这里是8)
然后把它变成3
->0 1 1 2 3 4 5 6
更一般的;
我们把一开始多余的0(就是不在s位置上的0),设置成INF(因为要求只能有一个0);
则策略就是;
每次找最小的还未被填充的数字,然后用最大的已经填充的数字替换成那个数字;
直到最小的还未被填充的数字已经大于最大的已经填充的数字为止;
或者没有还未被填充的数字了;
【Number Of WA】
1
【完整代码】
#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
#define Open() freopen("F:\\rush.txt","r",stdin)
#define Close() ios::sync_with_stdio(0),cin.tie(0)
typedef pair<int,int> pii;
typedef pair<LL,LL> pll;
const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 2e5+100;
const int INF = 2e5+1;
int n,s,a[N],bo[N],ma = 0,ans = 0;
priority_queue<int,vector<int>,greater<int> > xiaogen;
priority_queue<int,vector<int>,less <int> > dagen;
int main()
{
//Open();
Close();//scanf,puts,printf not use
//init??????
cin >> n >> s;
rep1(i,1,n)
{
cin >> a[i];
if (i==s)
{
if (a[i]!=0)
{
ans++;
a[i] = 0;
}
}
else
{
if (a[i]==0)
a[i] = INF;
bo[a[i]]++;
ma = max(ma,a[i]);
}
}
rep1(i,1,ma)
if (bo[i])
{
//有的数字,最大的那个
while (bo[i]--) dagen.push(i);
}
else
{//没有的数字,最小的那个
xiaogen.push(i);
}
while ( int(xiaogen.size()) && xiaogen.top()<dagen.top())
{
int x = xiaogen.top();
xiaogen.pop();dagen.pop();
dagen.push(x);
//把有的数字最大的那个换成最小的没有的那个数字
ans++;
}
cout << ans << endl;
return 0;
}
最新文章
- 【OS】分页和分段
- 可伸缩性最佳实践:来自eBay的经验
- struts2学习笔记之十一:struts2的类型转换器
- Android开发之时间日期1
- CentOS7安装图形界面和修改运行级别
- android 屏幕截取,pull到pc端
- mvn使用问题
- 网络设备模拟器 GNS3
- pomelo windows 环境
- Asp.Net 之 使用Form认证实现用户登录 (LoginView的使用)
- Linux基础1之磁盘与分区
- Ali RocketMQ与Kafka对照
- 关于mybatis-generator的问题
- socket.io诡异的问题
- b2b
- php中$this->;的用法简单介绍
- cocos2d-x JS 四人麻将中的服务器位置与客户端位置转换相关
- golang之切片
- soap,socket
- 微服务学习一:idea中springboot集成mybatis
热门文章
- spring data JPA 中的多属性排序
- Elasticsearch 7.0 发布都有哪些新特性
- SQL优化的思路及基本原则(mysql)
- 1003. 我要通过!(20) (ZJUPAT 模拟)
- 2014秋C++ 第7周项目 数据类型和表达式
- 菜鸟nginx源代码剖析数据结构篇(九) 内存池ngx_pool_t
- Linux下配置httpd服务
- centos + nodejs + egg2.x 开发微信分享功能
- js前台编码,asp.net后台解码 防止前台传值到后台为乱码
- Java高级——交通灯管理系统