Problem 1 楼房(build.cpp/c/pas)

【题目描述】

地平线(x轴)上有n个矩(lou)形(fang),用三个整数h[i],l[i],r[i]来表示第i个矩形:矩形左下角为(l[i],0),右上角为(r[i],h[i])。地平线高度为0。在轮廓线长度最小的前提下,从左到右输出轮廓线。

下图为样例2。

【输入格式】

第一行一个整数n,表示矩形个数。

以下n行,每行3个整数h[i],l[i],r[i]表示第i个矩形。

【输出格式】

第一行一个整数m,表示节点个数。

以下m行,每行一个坐标表示轮廓线上的节点。从左到右遍历轮廓线并顺序输出节点。第一个和最后一个节点的y坐标必然为0。

【样例输入】

2
3 0 2
4 1 3

【样例输出】

6
0 0
0 3
1 3
1 4
3 4
3 0

【样例输入2】

5
3 -3 0
2 -1 1
4 2 4
2 3 7
3 6 8

【样例输出2】

14
-3 0
-3 3
0 3
0 2
1 2
1 0
2 0
2 4
4 4
4 2
6 2
6 3
8 3
8 0

【数据范围】

对于30%的数据,n<=100

对于另外30%的数据,n<=100000,1<=h[i],l[i],r[i]<=1000

对于100%的数据,1<=n<=100000,1<=h[i]<=10^9,-10^9<=l[i]<r[i]<=10^9

题解

扫描线+堆维护

推荐使用multset和pair 很方便

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std; pair<int,int> a[],ans[];
multiset<int> q;
int n,cnt,maxh,num; int main()
{
int i,j,h,x,y;
scanf("%d",&n);
for(i=;i<=n;i++)
{
scanf("%d%d%d",&h,&x,&y);
a[++cnt]=make_pair(x,h);
a[++cnt]=make_pair(y,-h);
}
sort(a+,a++cnt);
q.insert();
maxh=;
for(i=;i<=cnt;)
{
for(j=i;j<=cnt;j++)
{
if(a[i].first<a[j].first) break;
else
if(a[j].second>) q.insert(a[j].second);
else q.erase(q.find(-a[j].second));
}
h=*q.rbegin();
if(h!=maxh)
{
ans[++num]=make_pair(a[i].first,maxh);
ans[++num]=make_pair(a[i].first,h);
maxh=h;
}
i=j;
}
printf("%d\n",num);
for(i=;i<=num;i++) printf("%d %d\n",ans[i].first,ans[i].second);
return ;
}

Problem 2 单词背诵(word.cpp/c/pas)

【题目描述】

灵梦有n个单词想要背,但她想通过一篇文章中的一段来记住这些单词。

文章由m个单词构成,她想在文章中找出连续的一段,其中包含最多的她想要背的单词(重复的只算一个)。并且在背诵的单词量尽量多的情况下,还要使选出的文章段落尽量短,这样她就可以用尽量短的时间学习尽可能多的单词了。

【输入格式】

第一行一个数n,表示想要背的单词数。

接下来n行每行是一个长度不超过10的字符串,表示一个要背的单词。

接着是一个数m,表示文章中的单词数

然后是m行长度不超过10的字符串,每个表示文章中的一个单词。

【输出格式】

输出文件共2行。第1行为文章中最多包含的要背的单词数,第2行表示在文章中包含最多要背单词的最短的连续段的长度。

【样例输入】

3

hot

dog

milk

5

hot

dog

dog

milk

hot

【样例输出】

3

3

【数据范围】

对于30%的数据 n<=50,m<=500;

对于60%的数据 n<=300,m<=5000;

对于100%的数据 n<=1000,m<=100000;

题解

哈希+双指针扫描

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define mod 233327
using namespace std; int n,m,anscnt,ans,cnt;
char s[],str[][];
struct hh
{
char v[];
int next;
};
hh e[];
int last[],hash[],vis[];
bool h[];
void insert(int x)
{
++cnt;
strcpy(e[cnt].v,s);
e[cnt].next=last[x];
last[x]=cnt;
} bool query(int x,int k)
{
int i;
for(i=last[x];i;i=e[i].next)
if(!strcmp(e[i].v,str[k])) return true;
return false;
} int main()
{
int i,j,len,thash,head,tail,now,tlen;
scanf("%d",&n);
for(i=;i<=n;i++)
{
scanf("\n%s",&s);
len=strlen(s);thash=;
for(j=;j<=len-;j++)
thash=(thash*+s[j])%mod;
insert(thash);
}
scanf("%d",&m);
for(i=;i<=m;i++)
{
scanf("\n%s",&str[i]);
len=strlen(str[i]);thash=;
for(j=;j<=len-;j++)
thash=(thash*+str[i][j])%mod;
hash[i]=thash;
}
for(i=;i<=m;i++)
if(query(hash[i],i)&&!h[hash[i]])
{
anscnt++;
h[hash[i]]=true;
}
printf("%d\n",anscnt); if(!anscnt) goto hhh;
head=;tail=;now=tlen=;
ans=;
if(query(hash[],))
{
vis[hash[]]=;
now++;
}
while((head<=tail&&tail<m)||now==anscnt)
{
if(now==anscnt)
{
ans=min(ans,tail-head+);
thash=hash[head++];
if(query(thash,head-))
{
vis[thash]--;
if(!vis[thash]) now--;
}
}
else
{
thash=hash[++tail];
if(query(thash,tail))
{
if(!vis[thash]) now++;
vis[thash]++;
}
}
}
hhh:;
printf("%d",ans);
return ;
}

Problem 3 矩阵(matrix.cpp/c/pas)

【题目描述】

给定一个N行M列的非负整数矩阵,求一个最大的正方形子矩阵,该矩阵满足:

矩阵中每一个元素权值都大于0;

在满足上述条件的前提下,矩阵面积最大;

在满足上述条件的前提下,选择元素和最小的。

【输入格式】

第一行两个整数N, M

接下来N行,每行M个整数。

【输出格式】

两个数,用空格隔开,第一个数为满足条件的矩阵的面积,第二个数为该矩阵各元素之和。

【样例输入】

3 7

1 1 1 0 2 1 1

1 1 1 0 1 1 1

1 1 1 0 1 1 1

【样例输出】

9 9

【数据范围】

对于30%的数据,R,C<=10;

对于60%的数据,R,C<=100;

对于100%的数据,R,C<=1000。

0 <= 输入的其他整数 <= 10^9

题解

一开始预处理前缀和,然后二分正方形边长,枚举正方形的位置即可。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std; int n,m,a[][],ans1;
long long sum[][],sum0[][],ans2=1LL<<;
bool checkzero(int x,int y,int len)
{
int newx,newy;
newx=x+len-,newy=y+len-;
return sum0[newx][newy]-sum0[x-][newy]-sum0[newx][y-]+sum0[x-][y-]==;
} bool check(int len)
{
int i,j;
for(i=;i+len-<=n;i++)
for(j=;j+len-<=m;j++)
if(checkzero(i,j,len)) return true;
return false;
}
int main()
{
int i,j,nowsum0,l,r,mid,nowi,nowj;
long long nowsum;
scanf("%d%d",&n,&m);
for(i=;i<=n;i++)
for(j=;j<=m;j++)
scanf("%d",&a[i][j]);
for(i=;i<=n;i++)
{
nowsum=0LL;
nowsum0=;
for(j=;j<=m;j++)
{
nowsum+=a[i][j];
nowsum0+=a[i][j]==;
sum[i][j]=sum[i-][j]+nowsum;
sum0[i][j]=sum0[i-][j]+nowsum0;
}
}
l=;
r=n<m?n:m;
while(l<=r)
{
mid=(l+r)>>;
if(check(mid))
{
ans1=mid;
l=mid+;
}
else r=mid-;
}
printf("%d ",ans1*ans1); for(i=;i+ans1-<=n;i++)
for(j=;j+ans1-<=m;j++)
if(checkzero(i,j,ans1))
{
nowi=i+ans1-;
nowj=j+ans1-;
ans2=min(ans2,sum[nowi][nowj]-sum[i-][nowj]-sum[nowi][j-]+sum[i-][j-]);
}
printf("%lld",ans2);
return ;
}

【2016福建省夏令营Day1】数据结构的更多相关文章

  1. 2019暑期金华集训 Day1 数据结构

    自闭集训 Day1 数据结构 CF643G 用类似于下面的方法,搬到线段树上. 如何合并两个集合?先全部放在一起,每次删掉最小的\(cnt_i\),然后把其他所有的\(cnt\)都减去\(cnt_i\ ...

  2. 【2016常州一中夏令营Day1】

    Problem 1. suffix给定一个单词,如果该单词以 er. ly 或者 ing 后缀结尾,则删除该后缀(题目保证删除后缀后的单词长度不为 0),否则不进行任何操作.Input输入一行,包含一 ...

  3. Day1数据结构和算法

    2019-02-27 程序设计=数据结构+算法 数据结构就是关系,是数据元素相互之间存在的关系集合 逻辑结构:数据对象中数据元素的相互关系 集合结构:集合里的数据元素除了同属于一个集合外没有其他关系 ...

  4. [日常训练]FJ省夏令营day1

    T1 Description 给出n个矩形的顶点坐标(每个矩形的底边都在x轴上),求这n个矩形所组成图形的轮廓线的顶点. Input 第一行一个整数n,表示矩形个数. 以下n行,每行3个整数,分别表示 ...

  5. 2015北大夏令营day1 B:An Idea of Mr. A

    题意:给定一个范围l,r计算i,j(i<j)属于这个范围内的gcd(2^(2^i)+1,2^(2^j)+1)的总和. 思路:费马数的应用,让我惊呆的是当年居然有123个人会做,我tm毛都不会.. ...

  6. 清北学堂学习总结 day1 数据结构 练习

    1.二叉搜索树 STL set直接做就可以了 2.树状数组+差分数列: codevs 1081 线段树练习 2  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Maste ...

  7. 2019中山纪念中学夏令营-Day1[JZOJ]

    T1 题目描述: 1999. Wexley接苹果(apple) (File IO): input:apple.in output:apple.out 时间限制: 1000 ms  空间限制: 1280 ...

  8. 小爬虫。爬取网站多页的通知标题并存取在txt文档里。

    爬取网页中通知标题的内容展示: this is  1  page!<精算学综合>科目考试参考大纲2016年上半年研究生开题报告评议审核结果公示[答辩]2016下半年研究生论文答辩及学位评定 ...

  9. Github Coding Developer Book For LiuGuiLinAndroid

    Github Coding Developer Book For LiuGuiLinAndroid 收集了这么多开源的PDF,也许会帮到一些人,现在里面的书籍还不是很多,我也在一点点的上传,才上传不到 ...

随机推荐

  1. rqnoj86 智捅马蜂窝

    题目描述 背景 为了统计小球的方案数,平平已经累坏了.于是,他摘掉了他那800度的眼镜,躺在树下休息. 后来,平平发现树上有一个特别不一样的水果,又累又饿的平平打算去把它摘下来. 题目描述 现在,将大 ...

  2. MVC设计之从零打造到实际操作(总汇)

    我们为什么要自己搭建一个MVC架构的框架? 1.为了更快的开发效率 2.为了更高的运行效率 3.为了更好的证明自己 在别的框架中,有些方法我们使用起来可能会比较麻烦,我们可以在自己的框架中写一些自己想 ...

  3. iOS:学习runtime的理解和心得

    http://www.cocoachina.com/ios/20150901/13173.html 作者:兴宇是谁 授权本站转载. Runtime是想要做好iOS开发,或者说是真正的深刻的掌握OC这门 ...

  4. python 逗号分隔值文件的操作

  5. Mysterious Antiques in Sackler Museum(判断长方形)

    题目链接 参考博客Ritchie丶的博客 - UVALive 7267 Mysterious Antiques in Sackler Museum (判断长方形) 题意:大概意思就是判断四个矩形能不能 ...

  6. JavaScript 验证API

    约束验证 DOM 方法 Property Description checkValidity() 如果 input 元素中的数据是合法的返回 true,否则返回 false. setCustomVal ...

  7. ORACLE学习笔记-ORACLE(基本命令)

    --查看VGA信息: show sga; select * from v$sgastat;--可以通过以下几个动态性能视图查看信息: V$sysstat                系统统计信息 V ...

  8. UIImageView xib里面拉伸图片技巧

    拉伸图片的时候代码里和xib里面的图片名字去掉@2x,但是原始图片文件得要xxx@2x.png The X and Y values seem to be the positions for the ...

  9. selenium webdriver学习(八)------------如何操作select下拉框(转)

    selenium webdriver学习(八)------------如何操作select下拉框 博客分类: Selenium-webdriver   下面我们来看一下selenium webdriv ...

  10. EC Round 33 F. Subtree Minimum Query 主席树/线段树合并

    这题非常好!!! 主席树版本 很简单的题目,给一个按照指定节点的树,树上有点权,你需要回答给定节点的子树中,和其距离不超过k的节点中,权值最小的. 肯定首先一想,按照dfs序列建树,然后按照深度为下标 ...