- 1、本文档共14页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Noip2013提高组Day2解题报告
Noip 2013 Day2 解题报告 --By GreenCloudS
第一题:积木大赛?#include
#define MAXN 100010
int h[MAXN],ans 0,n;
int main h[0] 0; scanf %d,n ; for int i 0;i++ n; scanf %d,h[i] ; if h[i] h[i-1] ans+ h[i]-h[i-1]; printf %d\n,ans ; return 0; 代码2(先对高度进行基数排序,然后逐行计算区间数,复杂度也是O n ) Cpp :
#include
#include
using namespace std;
#define MAXH 10010
#define MAXN 100010
struct node node *next;
int t;
node next NULL; *head[MAXH];
int maxh 0;
void Insert int h,int t maxh max maxh,h ;
node *p new node ;
p- t t,p- next head[h];
head[h] p; int n,h,delta 1,ans 0;
bool f[MAXN];
int main memset f,true,sizeof f ,memset head,0,sizeof head ;
cin n;
f[0] f[n+1] false;
for int i 0;i++ n; cin h,Insert h,i ;
for int i 0;i maxh;i++ if i ans+ delta;
for node *p head[i];p;p p- next if f[p- t-1]f[p- t+1] delta++; if !f[p- t-1] !f[p- t+1] delta--; f[p- t] false; cout ans endl;
return 0; 第二题:花匠
方程:
f i,0 max f j,1 +1 0 j i且h[j] h[i]
f i,1 max f j,0 +1 0 j i且h[j] h[i]
边界:f 0,0 f 0,1 0
如果直接DP毫无疑问复杂度是O n^2 ,会TLE,但是,考虑到我们每次取最值时候取得都是一个区间里的数,如f i,0 max f j,1 +1 0 j i且h[j] h[i]取得就是区间[0,h[i]-1]里的最值,所以可以使用线段树或者是BIT(树状数组)来优化,这样复杂度就是O n log n ,可以过全部数据。
这道题还有一个解法,直接求拐点数目,然后就可以神奇的做到O n 了,由于我找不到满意的证明,就不发上来了。
代码 DP+BIT Cpp :
#include
#include
#include
using namespace std;
#define MAXN 100010
#define lowbit x ~ x +1 x
#define MAXH 1000010
#define For i,x for int i x;i;i- lowbit i
#define rep i,x for int i x;i maxh;i+ lowbit i
int t0[MAXH],t1[MAXH];
int h[MAXN],n,maxh 0;
int f[MAXN][2],ans 0;
void Add0 int x,int y rep i,x t0[i] max t0[i],y ; void Add1 int x,int y rep i,x t1[i] max t1[i],y ; int Max0 int x int rec 0; For i,x rec max rec,t0[i] ; return rec; int Max1 int x int rec 0; For i,x rec max rec,t1[i] ; return rec; int main scanf %d,n ; for int i 0;i++ n; scanf %d,h[i] ; maxh max maxh,++h[i] ; f[i][0] f[i][1] 1; maxh++; memset t0,0,sizeof t0 ,memset t1,0,sizeof t1 ; for int i 0;i++ n; f[i][0] max Max0 h[i]-1 +1,f[i][0] ; f[i][1] max Max1 maxh-h[i]-
文档评论(0)