【2016福建省夏令营Day1】数据结构
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】数据结构的更多相关文章
- 2019暑期金华集训 Day1 数据结构
自闭集训 Day1 数据结构 CF643G 用类似于下面的方法,搬到线段树上. 如何合并两个集合?先全部放在一起,每次删掉最小的\(cnt_i\),然后把其他所有的\(cnt\)都减去\(cnt_i\ ...
- 【2016常州一中夏令营Day1】
Problem 1. suffix给定一个单词,如果该单词以 er. ly 或者 ing 后缀结尾,则删除该后缀(题目保证删除后缀后的单词长度不为 0),否则不进行任何操作.Input输入一行,包含一 ...
- Day1数据结构和算法
2019-02-27 程序设计=数据结构+算法 数据结构就是关系,是数据元素相互之间存在的关系集合 逻辑结构:数据对象中数据元素的相互关系 集合结构:集合里的数据元素除了同属于一个集合外没有其他关系 ...
- [日常训练]FJ省夏令营day1
T1 Description 给出n个矩形的顶点坐标(每个矩形的底边都在x轴上),求这n个矩形所组成图形的轮廓线的顶点. Input 第一行一个整数n,表示矩形个数. 以下n行,每行3个整数,分别表示 ...
- 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毛都不会.. ...
- 清北学堂学习总结 day1 数据结构 练习
1.二叉搜索树 STL set直接做就可以了 2.树状数组+差分数列: codevs 1081 线段树练习 2 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Maste ...
- 2019中山纪念中学夏令营-Day1[JZOJ]
T1 题目描述: 1999. Wexley接苹果(apple) (File IO): input:apple.in output:apple.out 时间限制: 1000 ms 空间限制: 1280 ...
- 小爬虫。爬取网站多页的通知标题并存取在txt文档里。
爬取网页中通知标题的内容展示: this is 1 page!<精算学综合>科目考试参考大纲2016年上半年研究生开题报告评议审核结果公示[答辩]2016下半年研究生论文答辩及学位评定 ...
- Github Coding Developer Book For LiuGuiLinAndroid
Github Coding Developer Book For LiuGuiLinAndroid 收集了这么多开源的PDF,也许会帮到一些人,现在里面的书籍还不是很多,我也在一点点的上传,才上传不到 ...
随机推荐
- 阿里巴巴资深技术专家无相:我们能从 InteliJ IDEA 中学到什么?
本文来源于阿里巴巴资深技术专家无相在内网的分享,阿里巴巴中间件受权发布. 最近因为工作的关系,要将 Eclipse 的插件升级为 IDEA 插件.升级过程中,对 IDEA 插件做了些学习和研究,希望通 ...
- 观察者模式(Java实现)
import java.util.ArrayList; import java.util.Iterator; /* 抽象观察者类 */ abstract class Observer { public ...
- Laravel 登录后清空COOKIE 方法
需求 在Laravel 登陆立即清空保存的COOKIE数组 实现 # Http/Controllers/Auth/LoginController.php public function redirec ...
- Servlet Cookies
Cookie是在多个客户端请求之间持久存储的一小段信息. Cookie具有名称,单个值和可选属性,例如注释,路径和域限定符,生存周期和版本号. Cookie工作原理 默认情况下,每个请求都被视为新的请 ...
- Python学习之路2☞数据类型与变量
变量 变量作用:保存状态:说白了,程序运行的状态就是状态的变化,变量是用来保存状态的,变量值的不断变化就产生了运行程序的最终输出结果 一:声明变量 #!/usr/bin/env python # -* ...
- idea列编辑模式
当我们想要选中一列时,在eclipse中alt+shit+a就可以选中一列了, 在网上很多的idea中列编辑的使用,但是对我的电脑却不管用,也不太清楚在哪里设置 最后无奈乱试一通,结果找到了 alt+ ...
- 开窗函数over()中partition by关键字解析
partition by关键字是分析性函数的一部分,它和聚合函数不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录,partition by用于给结果集分组,如果没 ...
- oralce使用INSERT语句向表中插入数据
INSERT INTO table[ (column [, column. . .])] VALUES (value [,value . . .]); v 插入的数据 ...
- Kafka 简易教程
1.初识概念 Apache Kafka是一个分布式消息发布订阅系统. TopicKafka将消息种子(Feed)分门别类, 每一类的消息称之为话题(Topic). Producer发布消息的对象称之为 ...
- Java练习 SDUT-1588_圆的面积
圆的面积 Time Limit: 1000 ms Memory Limit: 32768 KiB Problem Description Give you the radius of a circle ...