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文件合并成一 ...
随机推荐
- BZOJ2599 [IOI2011]Race
传送门 点分治,黄学长的选根方法会T掉,换了这个人的选根方法就可以了. 当然,你也可以选择黄学长的奇淫优化 //BZOJ 2599 //by Cydiater //2016.9.23 #include ...
- POJ 3678 Katu Puzzle(强连通 法)
题目链接 题意:给出a, b, c 和操作类型 (与或异或),问是否满足所有的式子 主要是建图: 对于 and , c == 1: 说明 a 和 b都是1,那么 0 就不能取, a' -> a ...
- javamail实践
public static void main(String[] args) throws Exception, Exception { MimeMessage message=new MimeMes ...
- BZOJ3678: wangxz与OJ
splay缩点. #include<bits/stdc++.h> #define L(t) (t)->c[0] #define R(t) (t)->c[1] #define F ...
- 异步-学习笔记3 Task
1. 通过Task启动多线程 2. 解决多线程的几大应用场景 private void btnTask_Click(object sender, EventArgs e) { Console.Writ ...
- String类中的一些函数使用方法
最常用的就是Length()函数了,求字符串的长度 String s="";int i=s.length();i结果为0. 如果是String s=null;int i=s.len ...
- JavaWeb学习笔记——jsp:setproperty和getproperty
- coreos安装
cloud-config-bootstrap.sh #!/bin/bash cat > "cloud-config.yaml" <<EOF #cloud-conf ...
- webform中使用webapi,并且使用autofac
private void AutofacIoCRegister() { HttpConfiguration config = GlobalConfiguration.Configuration; if ...
- 【转】SPDY协议
SPDY协议 - v3 原文:SPDY Protocol - Draft 3 翻译:邱鹏滔(QQ: 95350530,主页:www.fireflysource.com) 1 概述 HTTP协议的瓶颈在 ...