SWUN 1165 - 司马称好
司马称好
时间限制(普通/Java) : 2000 MS/ 6000 MS 运行内存限制 : 65536 KByte 总提交 : 36 测试通过 : 6 描述 汉朝时期,司马徽从不说别人的短处,与人说话时,从来不问别人的好恶,都说好话。一个同乡来问他安否,他回答好。有一个说自己的儿子死了,他也说大好。妻子骂他缺德,别人死了儿子为什么还要说好,司马徽说:“你的话也太好了。” ————成语《司马称好》的由来
CH=称好? 对于这个同音问题,霸气侧漏的CH感到无比的愤慨,于是他亲自出马,教导司马微,教他算法,希望他从算法中领悟出做人的道理。
CH的第一堂课是学习黑箱测试法:CH动态的给出若干个操作,操作种类如下,
GET:第一次执行GET时,返回黑箱中第1小的元素,第二次执行GET时,返回黑箱中第2小的元素,第三次执行GET时返回黑箱中第3小的元素,依此类推......
ADD(val):在黑箱中插入数值为val的元素
CHG(i,j):把第i次插入的元素更改为j
下面,展示的便是样例中的操作执行过程 操作 第i小 黑箱中的元素 输出值
1 ADD(3) 0 3 2 GET 1 3 3 3 ADD(1) 1 1, 3 4 GET 2 1, 3 3 5 ADD(-4) 2 -4, 1, 3 6 ADD(2) 2 -4, 1, 2, 3 7 ADD(8) 2 -4, 1, 2, 3, 8 8 ADD(-1000) 2 -1000, -4, 1, 2, 3, 8 9 GET 3 -1000, -4, 1, 2, 3, 8 1 10 GET 4 -1000, -4, 1, 2, 3, 8 2 11 ADD(2) 4 -1000, -4, 1, 2, 2, 3, 8 12 CHG(6,-500) 4 -500, -4, 1, 2, 2, 3, 8 输入 第一行为整数n,表示一共有n个操作, 接下来的n行,每行开头是一个字符串S,表示操作的类型: 若S为GET,则输出当前第i小的元素, 若S为ADD(val),表示黑箱中加入值为val的元素 若S为CHG(i,j),表示把第i次插入的元素更改为j
其中,0 < n <= 500000, val和j为int型,数据保证合法 输出 对于每个GET,输出当前第i小的元素值。 样例输入 12 样例输出 3 题目来源 YB |
题目地址: http://218.194.91.48/acmhome/problemdetail.do?&method=showdetail&id=1165
很久之前做的题目,代码有点搓~~
但确实算是比较经典的题目了~~ 适合刚学堆的童鞋练练手~~
做法很简单,建立两个堆。一个最大堆,一个最小堆。
显然,最大堆存的是前n小的数,最小堆存的是后m-n大的数(假设m是数字总数,n表示询问的次数)。
也就是说,最小堆内所有数都比最大堆内的所有数还要大。
比较麻烦的处理是,更改第i个输入时,需要找到已改变位置的原数新位置,所以需要双向记录路径。
容易错的是,两个堆内的数,有时需要相互传递。即有可能出现最大堆的堆顶比最小堆的堆顶还要大,因此需要两个堆顶互换位置。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int cnt1=0,cnt2=0,cnt=0;
struct Mark{
int gt,f;
}s1[600000],s2[600000],gt[600000];
void add1(int v){
if(v==1) return;
if(s1[v].f>=s1[v>>1].f) return ;
swap(s1[v],s1[v>>1]);
gt[s1[v].gt].gt=v;
gt[s1[v>>1].gt].gt=v>>1;
add1(v>>1);
}
void add2(int v){
if(v==1) return;
if(s2[v].f<=s2[v>>1].f) return ;
swap(s2[v],s2[v>>1]);
gt[s2[v].gt].gt=v;
gt[s2[v>>1].gt].gt=v>>1;
add2(v>>1);
}
void change1(int v){
int l=v<<1;
if(l<cnt1)
if(s1[l].f>s1[l+1].f) l++;
if(l>cnt1) return;
if(s1[l].f>=s1[v].f) return ;
swap(s1[v],s1[l]);
gt[s1[v].gt].gt=v;
gt[s1[l].gt].gt=l;
change1(l);
}
void change2(int v){
int l=v<<1;
if(l<cnt2)
if(s2[l].f<s2[l+1].f) l++;
if(l>cnt2) return;
if(s2[l].f<=s2[v].f) return ;
swap(s2[v],s2[l]);
gt[s2[v].gt].gt=v;
gt[s2[l].gt].gt=l;
change2(l);
}
int main(){
// freopen("01.in","r",stdin);
// freopen("02.out","w",stdout);
int n,i,t,val,flag=0;
char str[40];
scanf("%d",&n);
while(n--){
scanf("%s",str);
// puts(str);
if(str[0]=='A'){
val=0;
if(str[4]=='-') i=5;
else i=4;
for(;str[i]!=')';i++){
val*=10;
val+=str[i]-'0';
}
if(str[4]=='-') val=0-val;
cnt++;
cnt1++;
gt[cnt].gt=cnt1;
gt[cnt].f=1;
s1[cnt1].f=val;
s1[cnt1].gt=cnt;
add1(cnt1);
}
else if(str[0]=='G'){
cnt2++;
s2[cnt2]=s1[1];
gt[s1[1].gt].f=2;
gt[s1[1].gt].gt=cnt2;
if(cnt1>1){
s1[1]=s1[cnt1];
gt[s1[cnt1].gt].gt=1;
change1(1);
}
cnt1--;
add2(cnt2);
if(cnt1 && cnt2)
while(s1[1].f<s2[1].f){
swap(s1[1],s2[1]);
gt[s1[1].gt].f=1;
gt[s2[1].gt].f=2;
change1(1);
change2(1);
}
printf("%d\n",s2[1].f);
}
else {
t=0;
val=0;
for(i=4;str[i]!=',';i++){
t*=10;
t+=str[i]-'0';
}
flag=0;
if(str[++i]=='-'){
i++;
flag=1;
}
for(;str[i]!=')';i++){
val*=10;
val+=str[i]-'0';
}
if(flag) val=0-val;
if(gt[t].f==1){
s1[gt[t].gt].f=val;
change1(gt[t].gt);
add1(gt[t].gt);
}
else{
s2[gt[t].gt].f=val;
change2(gt[t].gt);
add2(gt[t].gt);
}
}
// printf("--add: %d --max: %d\n",cnt,cnt2);
// printf("--s1: ");for(i=1;i<=cnt1;i++)printf("%d ",s1[i].f);printf("\n");
// printf("--s2: ");for(i=1;i<=cnt2;i++)printf("%d ",s2[i].f);printf("\n");
}
return 0;
}
/* 随机
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
using namespace std;
int main(){
// freopen("01.in","w",stdout);
int t,n=10000,cnt=0,now=0;
printf("10000\n");
while(n--){
t=rand()%3;
if(t==0){
if(now<cnt){
now++;
printf("GET\n");
}
else t=1;
}
if(t==1){
if(cnt==0) t=2;
else printf("CHG(%d,%d)\n",rand()%cnt+1,rand()%2000-1000);
}
if(t==2){
cnt++;
printf("ADD(%d)\n",rand()%2000-1000);
}
}
return 0;
}
*/
/* 暴力
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int cnt=0,s[1000000],num=0,s1[1000000];
int main(){
// freopen("01.in","r",stdin);
// freopen("01.out","w",stdout);
int n,i,t,val,flag=0;
char str[40];
scanf("%d",&n);
while(n--){
scanf("%s",str);
if(str[0]=='A'){
val=0;
if(str[4]=='-') i=5;
else i=4;
for(;str[i]!=')';i++){
val*=10;
val+=str[i]-'0';
}
if(str[4]=='-') val=0-val;
s[cnt++]=val;
}
else if(str[0]=='G'){
for(i=0;i<cnt;i++)
s1[i]=s[i];
sort(s1,s1+cnt);
printf("%d\n",s1[num++]);
}
else {
t=0;
val=0;
for(i=4;str[i]!=',';i++){
t*=10;
t+=str[i]-'0';
}
flag=0;
if(str[++i]=='-'){
i++;
flag=1;
}
for(;str[i]!=')';i++){
val*=10;
val+=str[i]-'0';
}
if(flag) val=0-val;
s[t-1]=val;
}
}
return 0;
}
*/
SWUN 1165 - 司马称好相关推荐
- 1165: 零起点学算法72——首字母变大写
1165: 零起点学算法72--首字母变大写 Time Limit: 1 Sec Memory Limit: 64 MB 64bit IO Format: %lld Submitted: 705 ...
- hdu 1165 坑爹找规律题
http://acm.hdu.edu.cn/showproblem.php?pid=1165 不看题解,使劲找规律,应该是可以找到的,就是费时间! Problem Description As is ...
- 信息学奥赛一本通 1165:Hermite多项式
[题目链接] ybt 1165:Hermite多项式 默认保留2位小数 [题目考点] 1. 函数 [题解代码] 解法1: #include <bits/stdc++.h> using na ...
- 信息学奥赛一本通(1165:Hermite多项式)
1165:Hermite多项式 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 19861 通过数: 8815 [题目描述] 用递归的方法求Hermite多 ...
- 【光学】基于matlab GUI菲涅尔系数计算【含Matlab源码 1165期】
⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[光学]基于matlab GUI菲涅尔系数计算[含Matlab源码 1165期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...
- 解题报告:AcWing 1165. 单词环(01分数规划、hash、经验优化)
本题的关键在于: 建图 01分数规划 本题的数据过大,如果直接spfa判断会TLE,因此我们使用经验优化,就是如果所有的点入队的次数过多,比如大于100000,那么我们直接认为它是存在正环的.(免去T ...
- 题目1165:字符串匹配
题目描述: 读入数据string[ ],然后读入一个短字符串.要求查找string[ ]中和短字符串的所有匹配,输出行号.匹配字符串.匹配时不区分大小写,并且可以有一个用中括号表示的模式匹配.如&qu ...
- 算法提高课-图论-负环-AcWing 1165. 单词环:spfa判正环、二分、01分数规划
文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 如何建图? 这样建图.以样例举例.起点是前两个字母,终点是末尾两个字母,边权是字符串的长度. 我们求的是什么呢? 题目要求Σ边权Σ1 ...
- 洛谷 1165日志分析
题目描述 M 海运公司最近要对旗下仓库的货物进出情况进行统计.目前他们所拥有的唯一记录就是一个记录集装箱进出情况的日志.该日志记录了两类操作:第一类操作为集装箱入库操作,以及该次入库的集装箱重量:第二 ...
最新文章
- 转】R利剑NoSQL系列文章 之 Hive
- Zookeeper的特点
- j.u.c系列(11)---之并发工具类:Exchanger
- 云服务器上mysql数据库环境安装配置
- 4-1 AlexNet神经网络
- 软件开发的核心问题是什么
- Requst Servervariables
- java系列2:方法的重载
- 【转】简明 Python 教程
- hbuilderx的快捷键整理pdf_47个电脑快捷键大全,让你工作提升100倍,一般人我不告诉他...
- 计算机考试用户注册,全国计算机等级考试报名系统账号注册和登录
- hdmi接口和计算机连接,hdmi接口,教您hdmi接口怎么连接电视
- 18. shell当中的until,until语法,无限循环,until示例
- c语言编程十进制转八进制算法,C语言十进制如何转八进制?
- iphone 如何给cydia添加中文源和威锋源
- 尚品汇 09_支付模块
- windows10下wordcloud模块成功安装
- QGraphicsItem实现动态蝴蝶(QT5开发及实例)
- 极化码:基于单项式码的极化码部分序(Partial Order)表示
- 防复制防破解小区门禁梯控升级非联网CPU卡脱机写卡门禁梯控一卡通系统92HID623CPU V5.00操作说明之设备与楼栋单元设置