【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,也许会帮到一些人,现在里面的书籍还不是很多,我也在一点点的上传,才上传不到 ...
随机推荐
- bzoj1060 时态同步
Description 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3….进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板 ...
- asp.net ajax客户端框架如何调用Page Method
asp.net ajax客户端框架如何调用Page Method 1:欲调用的页面方法必须声明为公有(Public)2:该方法必须为静态方法(static)3:该方法必须添加[System.Web.S ...
- python中Sting字符串
字符串连接 方法1: 用字符串的join方法 a = ['a','b','c','d'] content = '' content = ''.join(a) print content 方法2: 用字 ...
- poj 2385【动态规划】
poj 2385 Apple Catching Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14007 Accepte ...
- poj 2184 01背包变形【背包dp】
POJ 2184 Cow Exhibition Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14657 Accepte ...
- odoo 内置协议说明列表
odoo 内置协议说明列表 在以下目录. /odoo/odoo/addons/base/models/ir_module.py license = fields.Selection([ ('GPL-2 ...
- Effective C++: 03资源管理
所谓资源,就是一旦用了它,将来必须还给系统.C++中的资源有:内存.文件描述符.互斥锁.数据库连接.网络socket等. 13:以对象管理资源 1:像下面这个函数: void f() { Invest ...
- VirtualBox使用随笔
1.virtualbox配置Android手机USB热点 host:Windows10;guest:windows XP/10 右击我的电脑 - 管理 - 设备管理器 - 网卡适配器,若手机正确vb连 ...
- LeetcCode102 Binary Tree Level Order Traversal
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...
- PHP中__FUNCTION__与__METHOD__的区别
你知道php中__FUNCTION__与__METHOD__的区别吗?本文通过一个小例子,为大家介绍下二者的区别,有兴趣的朋友可以参考下. PHP中__FUNCTION__与__METHOD__的 ...