司马称好

时间限制(普通/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
ADD(3) 
GET 
ADD(1) 
GET 
ADD(-4) 
ADD(2) 
ADD(8) 
ADD(-1000) 
GET 
GET 
ADD(2) 
CHG(6,-500)

样例输出

3
3
1
2

题目来源

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 - 司马称好相关推荐

  1. 1165: 零起点学算法72——首字母变大写

    1165: 零起点学算法72--首字母变大写 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lld Submitted: 705 ...

  2. hdu 1165 坑爹找规律题

    http://acm.hdu.edu.cn/showproblem.php?pid=1165 不看题解,使劲找规律,应该是可以找到的,就是费时间! Problem Description As is ...

  3. 信息学奥赛一本通 1165:Hermite多项式

    [题目链接] ybt 1165:Hermite多项式 默认保留2位小数 [题目考点] 1. 函数 [题解代码] 解法1: #include <bits/stdc++.h> using na ...

  4. 信息学奥赛一本通(1165:Hermite多项式)

    1165:Hermite多项式 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 19861     通过数: 8815 [题目描述] 用递归的方法求Hermite多 ...

  5. 【光学】基于matlab GUI菲涅尔系数计算【含Matlab源码 1165期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[光学]基于matlab GUI菲涅尔系数计算[含Matlab源码 1165期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...

  6. 解题报告:AcWing 1165. 单词环(01分数规划、hash、经验优化)

    本题的关键在于: 建图 01分数规划 本题的数据过大,如果直接spfa判断会TLE,因此我们使用经验优化,就是如果所有的点入队的次数过多,比如大于100000,那么我们直接认为它是存在正环的.(免去T ...

  7. 题目1165:字符串匹配

    题目描述: 读入数据string[ ],然后读入一个短字符串.要求查找string[ ]中和短字符串的所有匹配,输出行号.匹配字符串.匹配时不区分大小写,并且可以有一个用中括号表示的模式匹配.如&qu ...

  8. 算法提高课-图论-负环-AcWing 1165. 单词环:spfa判正环、二分、01分数规划

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 如何建图? 这样建图.以样例举例.起点是前两个字母,终点是末尾两个字母,边权是字符串的长度. 我们求的是什么呢? 题目要求Σ边权Σ1 ...

  9. 洛谷 1165日志分析

    题目描述 M 海运公司最近要对旗下仓库的货物进出情况进行统计.目前他们所拥有的唯一记录就是一个记录集装箱进出情况的日志.该日志记录了两类操作:第一类操作为集装箱入库操作,以及该次入库的集装箱重量:第二 ...

最新文章

  1. 转】R利剑NoSQL系列文章 之 Hive
  2. Zookeeper的特点
  3. j.u.c系列(11)---之并发工具类:Exchanger
  4. 云服务器上mysql数据库环境安装配置
  5. 4-1 AlexNet神经网络
  6. 软件开发的核心问题是什么
  7. Requst Servervariables
  8. java系列2:方法的重载
  9. 【转】简明 Python 教程
  10. hbuilderx的快捷键整理pdf_47个电脑快捷键大全,让你工作提升100倍,一般人我不告诉他...
  11. 计算机考试用户注册,全国计算机等级考试报名系统账号注册和登录
  12. hdmi接口和计算机连接,hdmi接口,教您hdmi接口怎么连接电视
  13. 18. shell当中的until,until语法,无限循环,until示例
  14. c语言编程十进制转八进制算法,C语言十进制如何转八进制?
  15. iphone 如何给cydia添加中文源和威锋源
  16. 尚品汇 09_支付模块
  17. windows10下wordcloud模块成功安装
  18. QGraphicsItem实现动态蝴蝶(QT5开发及实例)
  19. 极化码:基于单项式码的极化码部分序(Partial Order)表示
  20. 防复制防破解小区门禁梯控升级非联网CPU卡脱机写卡门禁梯控一卡通系统92HID623CPU V5.00操作说明之设备与楼栋单元设置

热门文章

  1. Windows OS中关闭445 Port
  2. 【微信小程序】计算器案例
  3. 华为第一个月工作感受
  4. 怎么用计算机弹出再见了刺激战场,如何玩儿刺激战场 具体怎么操作
  5. Vue 基础第二次再次回顾
  6. 银行运用大数据解决小微贷款难
  7. 关于travis scott的网名_新版好听的韩文字名网名带翻译-可爱点
  8. 程序员免费电子书籍下载中心
  9. 漫画算法python篇_有点意思!当漫画遇上算法后(儿童节福利)
  10. commit和emit