ACM中的几个小技巧

离散化

使用STL算法离散化:

思路:先排序,再删除重复元素,然后就是索引元素离散化后对应的值。

假定待离散化的序列为a[n],b[n]是序列a[n]的一个副本,则对应以上三步为:

sort(sub_a,sub_a+n);
int size=unique(sub_a,sub_a+n)-sub_a;//size为离散化后元素个数
for(i=0;i<n;i++)
a[i]=lower_bound(sub_a,sub_a+size,a[i])-sub_a + 1;//k为b[i];
    ```
    经离散化后对应的值
对于第3步,若离散化后序列为0, 1, 2, ..., size - 1则用lower_bound,从1, 2, 3, ..., size则用upper_bound,其中lower_bound返回第1个不小于b[i]的值的指针,而upper_bound返回第1个大于b[i]的值的指针,当然在这个题中也可以用lower_bound然后再加1得到与upper_bound相同结果,两者都是针对以排好序列。使用STL离散化大大减少了代码量且结构相当清晰。

**尺取法**
给定长度为n的数列整数a0,a1,a2,a3 ..... an-1以及整数S。求出综合不小于S的连续子序列的长度的最小值。如果解不存在,则输出0。
  10 < n< 10 ^ 50 < a i < 10^4 S<10^8
这里我们拿第一组测试数据举例子,即 n=10, S = 15, a = {5,1,3,5,10,7,4,9,2,8}
![](http://images.cnitblog.com/blog/597004/201408/291224259702079.jpg)
1.初始化左右端点
2.不断扩大右端点,直到满足条件
3.如果第二步中无法满足条件,则终止,否则更新结果
4.将左端点扩大1,然后回到第二步

例题:poj 3320 尺取法+Map

``
#include <map>
#include <queue>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define  maxn 100005
#define  MOD 1000000007
#define  inf  0x3f3f3f3f
typedef long long ll;
using namespace std;
int n,m,k;
int a[maxn];

int main(){

    while(~scanf("%d",&n)){
        map<int,int>Hash,cnt;
        for(int i = 0;i<n;i++){
            scanf("%d",a+i);
            Hash[a[i]]++;
        }
        int tot = Hash.size();
        int tag = 1;
        int s = 0,e = 0;
        int ans = inf;
        while(tag){
            while(cnt.size()<tot && e<n) cnt[a[e++]]++;
            if(cnt.size()<tot) {tag=0;break;}
            ans = min(ans,e-s);
            cnt[a[s]]--;
            if(cnt[a[s]]==0) cnt.erase(a[s]);
            s++;
        }
        printf("%d\n",ans);

    }
    return 0;
}
时间: 2024-11-12 21:36:38

ACM中的几个小技巧的相关文章

IDEA Intellij中vim插件使用小技巧

在 IDEA Intellij小技巧和插件 一文中简单介绍了一下IdeaVim插件.在这里详细总结一下这个插件在日常编程中的一些常用小技巧.供有兴趣使用这个插件,但对Vim还不十分熟悉的朋友参考.当然基本的hjkl移动光标和几种常见模式等等基本概念就略过不提了. 为了确保只包含常用操作,这里提到的技巧都没有从现成文档里抄,而是凭记忆列出(不常用自然就不记得了).估计会有所遗漏,慢慢再补充. 1. 切换Vim模拟器状态 这个插件允许设置一个快捷键一键开启或关闭,在切换模式时会同时自动切换keyma

使用裁剪工具拉直Lightroom CC中的照片的小技巧

怎样用裁剪工具拉直Lightroom CC中的照片?这个问题看似很简单,但是如果我们不能掌握其中的小技巧,就会花费我们双倍甚至更多的时间.所以,今天给大家带来使用裁剪工具拉直Lightroom CC中的照片的小技巧,希望对大家有所帮助!一.首先打开lr cc 2019 mac这里,单击"添加照片"打开图库,在图库中选择照片,然后点击图库页面右下角"导入".如下图所示:二.选择照片后,单击右侧列中的" 裁剪"工具.如下图所示:三.在裁剪面板中,单击

我在编写《微软System Center 2012 R2私有云部署实战》中应用的一些小技巧

相信很多同学在处理超大文件,比如几万字.几十万字的文章中,需要图文混排.而图文混排可能会涉及到对图片编号和描述.比如我在<微软System Center 2012 R2私有云部署实战>中,就需要频繁的对章节.图片进行编号.更悲剧的是,有时候写了很多章,一个章节几百张图,需要在某一个位置插一张图,这个时候就需要对后面的图片编号全部重新排列. 这酸爽,干一次绝对不想干第二次.老实说,我在一开始其实也是没把这个当回事的,所以每一字都是自己打出来的,没有在处理word文档的时候 用到一些自动化的手段,

iOS开发中的总结的小技巧,分享给大家!!(待续未完)

这是我在写项目或者学习知识点或者请教人家的时候总结的小技巧 原来是写在笔记本上面的,还是分享给大家了.可能会很乱,觉得对自己有用的就拿走吧,有错漏的地方也求大家指点修正.废话不多说直接来. 1. 监听控件的三种方法 1) addTarget 2)代理 3)通知 2. UITextfiled(文本框)中有一个属性:clearButtonMode 选择 UITextFieldViewModeAlways 就可以在输入多个字符后,右边有个x号点一下全部清除,用户体验会好一点. UITextField

iOS 开发中使用到的小技巧汇总

国庆即将来到,一个小项目也即将完成,把自己在项目中用的一些小技巧写出来,方便查找. 1,去掉分割线--动画设置透明度alpha //去掉tableView的分隔线: self.tableView.separatorStyle=UITableViewCellSeparatorStyleNone; self.tableView.showsVerticalScrollIndicator=NO; 2. 解决cell分割线左边短20px的问题 -(void)viewDidLayoutSubviews{ i

CMD命令提示符窗口中的快捷键、小技巧和常用命令

快捷键: F1:按F1一次,命令提示符向后切换到已经执行过的命令字符.如果已经是最后的一条的命令,则不进行任何切换操作. 例子:之前输入“dir”,按F1一次后自动输入d,按两次自动输入i,三次自动输入r. F2:按下此键后,会提示“输入可复制的字符数量”,此时直接按下上次输入命令中包含的字符(区分大小写)后命令提示符将自动输入到按键字符之前的上次输入的命令字符. 例子:之前输入“dir”,按F2再输入r,则自动输入di. F3:自动输入上次执行过的命令.如已经输入了一些字符,按键后自动输入剩余

java语言中一些使用的小技巧(区别于c++)

正在自学java中...想记录下java和c++在一些小的方面的不同点. java中: class的对象均是引用类型的,如果想把连个同类型的对象相关联起来,只要将一个赋值给另一个就可以了. java中的随机数产生很简单,Math.random()函数即可产生随机数,要想确定随机数的范围只要在()后面成山一个范围即可. java中double型的数字也可以取整,例如15.2%5=0.2. java中==和!=可以用于任何的数据类型. java中有实例运算符(instanceof),不知道干嘛的..

Python+Selenium进行UI自动化测试项目中,常用的小技巧1:读取excel表,转化成字典(dict)输出

从今天开始我将会把在项目中遇到的问题,以及常用的一些技巧来分享出来,以此来促进自己的学习和提升自己:更加方便我以后的查阅. 现在要说的是:用Python来读取excel表的数据,返回字典(dict),在脚本中进行调用 我直接贴出代码: import xlrd data_path = "F:\data" # 存放excel表的路径xlsname = "userinfo.xlsx" # excel表的名字sheetname = "Sheet1" #

工作中总结的编程小技巧

技巧一:int-->bool要注意的!bool a=255; bool b= 254; 理论上应该认为a==b,但是根据编译器的不同,结果可能完全不一样 所以更好的写法是 char ch =1; 或者0bool a = (0 != atoi(ch)); 技巧二:将std::string转int,double先利用c_str()转成C string,再用atoi()与atof() 技巧三:const_cast操作符可以强置去除const指针的const属性 技巧四:CString读取文本的每一行C