HDU 5596(更新,两种方法)
更新:
这是中文题目的链接:
http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=659&pid=1001
这道题还可以用优先队列来做,优先队列的特性可以很好的返回两个队列中b最小的值。
下面说过了,c[i] += c[i-1]是来获得前缀和。前面的节点没发功增加一次,就相当于b[i]-1,b[i]-c[i-1]的值,就是到达第i时间是,b[i]相对的减少量。我们设置两个队列,根据需要,将b[i]-c[i-1]的值分别放入不同的队列中,例如,当取到0组的数时,将该b[i]-c[i-1]放入0组队列,同时和1组队列的最小值比较,若1组较小,则去掉该元素,直到存在大的为止。
#include<stdio.h>
#include<queue>
#include<string.h>
#define maxn 50005
using namespace std;
struct node1{
int num;
friend bool operator<(node1 a,node1 b){
return b.num < a.num;
}
};
struct node2{
int group;
int b;
};
node2 a[maxn];
int c[maxn];
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,m;
memset(c,,sizeof(c));
priority_queue<node1>q[];
scanf("%d%d",&n,&m);
for(int i = ;i<=n;i++){
scanf("%d%d",&a[i].group,&a[i].b);
}
for(int i = ;i<m;i++){
int time;
scanf("%d",&time);
c[time]++;
}
int ans = n;
node1 cur;
for(int i = ;i<=n;i++){
c[i] += c[i-];
if(a[i].group){
cur.num = a[i].b-c[i-];
q[].push(cur);
while(!q[].empty()&&q[].top().num<cur.num){
q[].pop();
ans--;
}
}else{
cur.num = a[i].b-c[i-];
q[].push(cur);
while(!q[].empty()&&q[].top().num<cur.num){
q[].pop();
ans--;
}
}
}
printf("%d\n",ans);
}
return ;
}
——————————————————我是分割线————————————————————————————————
题目:
http://acm.hdu.edu.cn/showproblem.php?pid=5596
这道题可以很巧妙的用O(n)的时间复杂度做出来的。首先,当我们用一个数组c存储gt发功的时间时,以该时间为下标之前的b值都会加1,所以可以用c[i] += c[i-1],以获得当前节点之前,已累计法功多少次了,然后c[y]-c[x](y>x)就是以x为下标的gt,到y时间时,通过发功增加的量。
至于为什么要倒着处理呢,因为我们是要去掉小的元素,这样,我们只要从后往前,保存最大的元素,只要存在小于最大元素的,该元素就可以去掉了。
还有,max0、max1分别是1组的最大值和0组的最大值,以gt[i].b-c[i-1]-max0这个式子为例,我们这里假设x<y,max0 = gt[y].b-c[y-1],所以前面那个式子就可以化成gt[x].b-c[x-1]-gt[y].b-c[y-1] = gt[x].b-gt[y].b+c[y-1]-c[x-1],由我们前面的推导,c[y-1]-c[x-1]就是gt[x].b增加的量,这个值加上gt[x].b,如果减去gt[y].b小于0的话,说明该gt是要去掉的,同时要更新max1的值,以为此时处理的是0组的情况,保存最大的。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define maxn 50005
#define inf 0x3f3f3f3f
using namespace std;
struct node{
int group;
int b;
};
node gt[maxn];
int c[maxn];
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,m;
memset(c,,sizeof(c));
scanf("%d%d",&n,&m);
for(int i = ;i<=n;i++){
scanf("%d%d",>[i].group,>[i].b);
}
for(int i = ;i<=m;i++){
int temp;
scanf("%d",&temp);
c[temp]++;
}
for(int i = ;i<=n;i++){
c[i] += c[i-];
}
int ans = n;
int max0 = -inf,max1 = -inf;
for(int i = n;i>;i--){
if(gt[i].group){
if(gt[i].b-c[i-]-max0<)
ans--;
max1 = max(max1,gt[i].b-c[i-]);
}else{
if(gt[i].b-c[i-]-max1<)
ans--;
max0 = max(max0,gt[i].b-c[i-]);
}
}
printf("%d\n",ans);
}
return ;
}
---恢复内容结束---
题目:
http://acm.hdu.edu.cn/showproblem.php?pid=5596
这道题可以很巧妙的用O(n)的时间复杂度做出来的。首先,当我们用一个数组c存储gt发功的时间时,以该时间为下标之前的b值都会加1,所以可以用c[i] += c[i-1],以获得当前节点之前,已累计法功多少次了,然后c[y]-c[x](y>x)就是以x为下标的gt,到y时间时,通过发功增加的量。
至于为什么要倒着处理呢,因为我们是要去掉小的元素,这样,我们只要从后往前,保存最大的元素,只要存在小于最大元素的,该元素就可以去掉了。
还有,max0、max1分别是1组的最大值和0组的最大值,以gt[i].b-c[i-1]-max0这个式子为例,我们这里假设x<y,max0 = gt[y].b-c[y-1],所以前面那个式子就可以化成gt[x].b-c[x-1]-gt[y].b-c[y-1] = gt[x].b-gt[y].b+c[y-1]-c[x-1],由我们前面的推导,c[y-1]-c[x-1]就是gt[x].b增加的量,这个值加上gt[x].b,如果减去gt[y].b小于0的话,说明该gt是要去掉的,同时要更新max1的值,以为此时处理的是0组的情况,保存最大的。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define maxn 50005
#define inf 0x3f3f3f3f
using namespace std;
struct node{
int group;
int b;
};
node gt[maxn];
int c[maxn];
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,m;
memset(c,,sizeof(c));
scanf("%d%d",&n,&m);
for(int i = ;i<=n;i++){
scanf("%d%d",>[i].group,>[i].b);
}
for(int i = ;i<=m;i++){
int temp;
scanf("%d",&temp);
c[temp]++;
}
for(int i = ;i<=n;i++){
c[i] += c[i-];
}
int ans = n;
int max0 = -inf,max1 = -inf;
for(int i = n;i>;i--){
if(gt[i].group){
if(gt[i].b-c[i-]-max0<)
ans--;
max1 = max(max1,gt[i].b-c[i-]);
}else{
if(gt[i].b-c[i-]-max1<)
ans--;
max0 = max(max0,gt[i].b-c[i-]);
}
}
printf("%d\n",ans);
}
return ;
}
HDU 5596(更新,两种方法)的更多相关文章
- WPF多线程UI更新——两种方法
WPF多线程UI更新——两种方法 前言 在WPF中,在使用多线程在后台进行计算限制的异步操作的时候,如果在后台线程中对UI进行了修改,则会出现一个错误:(调用线程无法访问此对象,因为另一个线程拥有该对 ...
- 代码操作Word时,目录自动更新的两种方法
最近的项目中有一个功能点为:根据分析数据库并生成报告.不过不是大数据.数据挖掘之类,报告的内容.组织方式都是事先固定下来的.实现的方式为,在普通word文档中插入书签制成模板,然后程序使用OpenXM ...
- mybatis学习之路----批量更新数据两种方法效率对比
原文:https://blog.csdn.net/xu1916659422/article/details/77971696/ 上节探讨了批量新增数据,这节探讨批量更新数据两种写法的效率问题. 实现方 ...
- HDU 1160 排序或者通过最短路两种方法解决
题目大意: 给定一堆点,具有x,y两个值 找到一组最多的序列,保证点由前到后,x严格上升,y严格下降,并把最大的数目和这一组根据点的编号输出来 这里用两种方法来求解: 1. 我们可以一开始就将数组根据 ...
- Linux 下操作GPIO(两种方法,驱动和mmap)(转载)
目前我所知道的在Linux下操作GPIO有两种方法: 1.编写驱动,这当然要熟悉Linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据io ...
- Response.Redirect 打开新窗体的两种方法
普通情况下,Response.Redirect 方法是在server端进行转向,因此,除非使用 Response.Write("<script>window.location=' ...
- HibernateTemplate、HibernateDaoSupport两种方法实现增删改查Good(转)
Spring+Hibernate两种方法实现增删改查 首先,定义一个Customer的bean类,设置好Customer.hbm.xml文件.再定义好一个Dao接口.准备好一个jdbc.propert ...
- Linux 下操作gpio(两种方法,驱动和mmap)
目前我所知道的在linux下操作GPIO有两种方法: 1. 编写驱动,这当然要熟悉linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据 ...
- Response.Redirect 打开这两种方法的一种新形式
在一般情况下.Response.Redirect 该方法是在server年底转向,因此,除非 Response.Write("<script>window.location='h ...
- 合并BIN文件的两种方法(转)
源:http://blog.chinaunix.net/uid-20745340-id-1878803.html 合并BIN文件的两种方法 在单片机的开发过程中,经常需要将两个单独的BIN文件合并成一 ...
随机推荐
- HTML5学习总结-11 IOS 控件WebView显示网页
一 加载外部网页 1.使用UIWebView加载网页 运行XCode 新建一个Single View Application . 2 添加安全消息 添加以下消息到项目的 Info.plist &l ...
- UVALive 3989Ladies' Choice(稳定婚姻问题)
题目链接 题意:n个男生和女生,先是n行n个数,表示每一个女生对男生的好感值排序,然后是n行n列式每一个男生的好感值排序,输出N行,即每个女生在最好情况下的男生的编号 分析:如果是求女生的最好情况下, ...
- Vector & ArrayList 的主要区别
1) 同步性:Vector是线程安全的,也就是说是同步的 ,而ArrayList 是线程序不安全的,不是同步的 数2. 2)数据增长:当需要增长时,Vector默认增长为原来一倍 ,而ArrayLis ...
- JS-百钱买百鸡案例-for循环制作
<html> <head> <meta charset="utf-8"/> <title></title> <sc ...
- mybatis int 类型判断<if>
如果数据类型是integer或者int,也就是数据类型的,在用<if>标签做动态语句的时候 不用判断是否为"''" <if test="sex != n ...
- js005-引用类型
js005-引用类型 数据类型分为基本类型和引用类型:基本类型值如下:Undefined.Null.Bollean.Number.String 本章内容: 1.使用对象 2.创建并操作数组 3.理解基 ...
- 获取字符串中每个字符出现的次数(利用TreeMap)
案例:"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1)分析1:定义一个字符串(可以改进为键盘录入)2:定义一个 ...
- base64 json
javascript将base64编码的图片数据转换为file并提交 直接提交base64编码图片数据,过大的话后台会出现转发错误问题. 一个不错的解决方式就是将base64编码的图片数据转换为Blo ...
- 深入浅出MyBatis
参考文献:深入浅出MyBatis MyBatis功能架构图: MyBatis内部原理流程图: 详情见:深入浅出MyBatis
- zencart分类页产品页去掉url中的id号
最近公司新上的网站被seo指出要修改url,去掉url中产品id.由于我们用的是zencart框架,装了 Ultimate SEO URLs 插件,所以在网上应该有这方面的资料,本文主要参考资料: 原 ...