2016.10.31.第54套(集训1)

Mushroom的序列
【问题描述】
Mushroom手中有n个数排成一排,现在Mushroom想取一个连续的子序列,使得这个子序列满足:最多只改变一个数,使得这个连续的子序列是严格上升子序列,Mushroom想知道这个序列的最长长度是多少。
【输入格式】
第一行一个整数n,表示有n个数。
第二行为n个数。
【输出格式】
一个数,为最长长度。
【输入样例】
6
7 2 3 1 5 6
【输出样例】
5
【样例解释】
选择第2个数到第6个数,把1改变成4即可。
【数据范围】
对于30%的数据,n<=10
对于60%的数据,n<=1000
对于100%的数据,n<=100000

题解:

这道题其实不是很难,主要在于那个改变的数上,而我们可以确定的是这个数前后必有两个递增区间。所以思路转换过来,就成了找相邻两个递增区间,并且相接处可通过改变一个数的值连接为一个递增区间。这个思路就简化了。另外一种方法就是通过整体记录需不需要改变这个值来使区间最长,简而言之,头一遍dp,尾一遍dp,通过f[1\0][i]表示i这个点修不修改的两种结果。虽然本质差不多,却复杂了很多,因为递增区间整体只有前两个和最后两个是有意义的,中间不用管。当然区间长度为1的时候要特判。我个人在做这道题的时候,考虑的不够全面,当时没有相同前一个区间的最后一个数改变和后一个区间的第一个值改变有啥子区别,于是就GG了,嗨呀,气。当然主要问题还是自己的思维不够严谨,没有意识到问题的本质。

修改后代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#define MN 100005
using namespace std;
int n,ans,a[MN],b[MN],c[MN],tot,r[MN],l[MN],len;
bool con(int x,int y)
{
    if(a[r[x]]<a[l[y]+1]-1) return true;
    if(a[r[x]-1]<a[l[y]]-1) return true;
    if(l[x]==r[x]||l[y]==r[y]) return true;
    return false;
}
void depa()
{
    for(int j=1;j<tot;j++)
    if(con(j,j+1))
    {
        len=r[j+1]-l[j]+1;
        ans=max(ans,len);
    }
}
int main()
{
    freopen("seq.in","r",stdin);
    freopen("seq.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++) {scanf("%d",&a[i]); b[i]=a[i];}
    c[1]=1;
    for(int i=2;i<=n;i++)
    if(a[i]>a[i-1]) c[i]=c[i-1]+1,ans=max(ans,c[i]+1);
    else c[i]=1;
    for(int i=1;i<=n;i++)
    if(c[i]==1) tot++,l[tot]=i,r[tot]=i;
    else r[tot]=i;
    depa();
    if(tot==1) ans=n;
    cout<<ans<<endl;
    return 0;
}

Mushroom的区间
【题目描述】
Mushroom有一行数,初始时全部是0。现在Mushroom有m个区间[L,R],他希望用以下操作得到新的序列。
从m个给定区间中选择一个区间[s,t],把区间中的数对应元素全部翻转。(0变1,1变0)
请告诉Mushroom他能得到多少区间。(模10^9+7)
【输入格式】
第一行包含两个整数n,m。表示n个数和m个区间。
接下来m行是所表示的区间。
【输出格式】
一个整数,表示能得到的区间数。
【样例输入】
3 3
1 1
2 2
3 3
【样例输出】
8
【数据范围】
对于30%的数据,n,m<=20
对于60%的数据,n,m<=100
对于100%的数据,n,m<=100000
【样例解释】
每个位置都可以单个修改,所以有8种可能。

题解:

考试的时候GG了=-=,那个时候20分钟水完了,因为没有想到方法,连暴力也没有。后来分析,还是没有看破本质,自己太垃圾。其实后来懂了,真的敲简单,眼泪落下来。其实可以发现就是题中给的区间的排列组合,然饿要注意重复,如图,只有两种重复情况:

啊,比较好理解吧,然后我们只需要吧这种重复的找出来,然后,不管那个浅绿的大区间,因为其他区间可以组合为它,所以没有啥子意义。只需要找出这些不重复的x条边,那么答案就是2的x次方。然后再说如何找这个重复的区间。cx大神是把区间的给端点的建边,不是特别懂,就是建图然后dfs一遍,数边数。正解用的并查集,六飞了,懂了过后写起来爆简单。就是检查区间头尾是不是一个爸爸,是的话就说明重复的,不是的话,x++。

修改后代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#define p 1000000007
#define MN 100005
using namespace std;
int ans=1,n,m,l,r,a[MN],fa[MN],tot,lf,rf;
int findfather(int a)
{
    if(fa[a]==a) return a;
    return fa[a]=findfather(fa[a]);
}
int main()
{
    freopen("seg.in","r",stdin);
    freopen("seg.out","w",stdout);
    cin>>n>>m;
    for(int i=1;i<=n+1;i++) fa[i]=i;
    for(int i=1;i<=m;i++)
    {
        cin>>l>>r;
        lf=findfather(l);
        rf=findfather(r+1);
        if(lf!=rf)
        fa[lf]=fa[rf],tot++;
    }
    while(tot)
    {
        ans=(ans*2)%p;
        tot--;
    }
    cout<<ans<<endl;
    return 0;
}

来自风平浪静的明天
【题目描述】
冬眠了五年,光终于从梦中醒来。
千咲、要,大家都在。
隐约记得“昨天”的海船祭,爱花意外成为贡女,沉入海底。
海面冰封,却有丝丝暖流在冰面之下涌动。
此时,爱花沉睡在祭海女神的墓地。她的胞衣在一点点脱落,化作一簇簇暖流,夹杂着她的感情,向海面上涌去。
爱花,你在哪里?
五年之后,纺已经成为海洋学研究科的大学生。
在纺的帮助下,光得知了海面下海流的情况。//没有啥子意义的废话=-=单身狗受到重击
纺告诉光,暖流一旦产生,就会不断地向四周扩散,直到遇到海中的岩石。
红腹海牛,快告诉光,爱花在哪里。
纺帮你绘制了一张海流情况图,长度为N,宽度为M。
海很大,一边有沙滩,一边一望无际,但长度和宽度都不会超过300。沙滩是金黄色的,所以用Y表示。海是蓝色的,所以用B表示。暖流很暖和,所以用H表示
海中有大大小小的石头。石头很危险,所以用X表示
光相信自己一定能找到爱花(爱花的位置只有一种可能)
【输入格式】
第一行包括两个整数N,M。
接下来N行,每行M个字符。
【输出格式】
仅一行,表示爱花的位置(如果你无能为力,请输出 -1 ,只要你尽力,光不会责怪你)
【样例输入】
5 5
YYYHB
YYHHH
YHHXB
BBHBB
BBBBB
【样例输出】
2 3
【数据范围】
对于30%的数据,n,m<=10
对于70%的数据,n,m<=100
对于100%的数据,n,m<=300
【样例解释】
在(2,3)出现第一个H后,经过3s后,出现样例输入的地图。
P.S. Mushroom拜托他GF出的这题= =

题解:

可怕,直接暴力的BFS居然还是正解=-=。然饿,TLE了一个点,后面说。啊,其实这道题特别想之前学过的水的漫延,对伐。只不过是给了你某时刻暖流的漫延情况,喊你退回去起点而已。所以说标答给了一个从边界开始退回去的方法,然饿,有多个答案:

BBHHXX

XXXHXX

XXHHXH   哈!浅蓝色答案一!

XHHHHH   哟!浅蓝色答案二!

XHXHHH

BHHHHH

BBHHHB

BBBHBB

BBBBBB

所以说啊,这个方法算出来就是有多个答案,当然你也可以知道答案,因为答案一定是周围暖流最多的,因为多个答案出现的原因是周围石头作为边界没有计算。

然后,我当时想的,就是暴力模拟,列举每一个H点作为开始点,然后bfs一层一层的搜下去,遇到B就return ;因为这是不成立的,其他的不能走continue,能走就进队。然后需要加一个时间节点,就是标记一下这一层是不是完了,然后一层漫延完,再检查有没有够H的数量,刚好,那就输出起始坐标,否则继续。(不存在比H数量多的情况,因为前面遇到B是不会走的,会return)。差不多就这样,最后一点是,queue用STL 的,会TLE一个点,但是手写就不存在这个问题了。啊,好像STL库里面都要比手写的慢一点。以后暴力最好手写。

修改后代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
#include<cstring>
#define MN 305
using namespace std;
int dire[2][5]={{0,1,-1,0,0},{0,0,0,1,-1}};
int n,m,num,num0,hx,hy,fx,fy;
int qx[MN*MN],qy[MN*MN];
bool flag=false,visited[MN][MN];
char a[MN][MN],b[MN][MN];
bool can(int x0,int y0)
{
    if(a[x0][y0]==‘H‘||b[x0][y0]!=‘B‘) return true;
    return false;
}
void bfs(int x0,int y0)
{
    int sx,sy,x,y;
    hx=hy=1;
    fy=2,fx=3;
    qx[1]=x0;
    qx[2]=-100;
    qy[1]=y0;
    while(hy!=fy)
    {
        sx=qx[hx]; hx++;
        sy=qy[hy]; hy++;
        for(int i=1;i<=4;i++)
        {
            x=sx+dire[0][i];
            y=sy+dire[1][i];
            if(visited[x][y]) continue ;
            if(!can(x,y)) return ;
            if(a[x][y]==‘H‘)
            {
                num--;
                qx[fx]=x;
                qy[fy]=y;
                fx++,fy++;
                visited[x][y]=true;
            }
        }
        if(qx[hx]==-100)
        {
            hx++;
            qx[fx]=-100;
            fx++;
            if(num==0) {flag=true; return ;}
        }
    }
}
int main()
{
    freopen("calm.in","r",stdin);
    freopen("calm.out","w",stdout);
    cin>>n>>m;
    getchar();
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
      {
          a[i][j]=getchar();
          if(a[i][j]==‘H‘) b[i][j]=‘B‘,num0++;
          else b[i][j]=a[i][j];
      }
      getchar();
    }

    for(int i=1;i<=n;i++)
       for(int j=1;j<=m;j++)
       {
           if(a[i][j]==‘H‘)
       {
              memset(visited,false,sizeof(visited));
              memset(qx,0,sizeof(qx));
              memset(qy,0,sizeof(qy));
              visited[i][j]=true;
              num=num0-1;
              bfs(i,j);//暴力模拟
              if(flag) {cout<<i<<‘ ‘<<j<<endl; return 0;}
       }
       }

       cout<<-1<<endl;
    return 0;
}
时间: 2024-10-20 22:06:57

2016.10.31.第54套(集训1)的相关文章

10.28 rsync工具介绍 - 10.29/10.30 rsync常用选项 - 10.31 rsync通过ssh同步

- 10.28 rsync工具介绍 - 10.29/10.30 rsync常用选项 - 10.31 rsync通过ssh同步 # 10.28 rsync工具介绍 -/A目录 --> /B目录(A目录更新了一个文件,每次更新都需要把A目录拷贝到B目录),如果用cp命令 比较浪费时间,耗费磁盘空间,磁盘压力 读写之类的, -使用rsync -av /etc/passwd /tmp/1.txt -a选项就是包含了好几个选项  ,v 是可视化,可以看到拷贝的过程 ``` [[email protecte

每周进度及工作量统计——2016.10.13-2016.10.20

项目:四则运算出题程序--GUI支持和改进 项目类型:结对项目 项目成员:张金生    张政 项目完成情况:已完成 项目改进:已变更,GUI支持,错题本,倒计时等 项目日期:2016.10.11-2016.10-13 C类别 C内容 S开始时间 E结束时间 I间隔 T净时间 P预计时间 分析 改进设计  9:25  10:39  9  65  60 编码 功能优化  10:42  22:43  163  557  500   补全功能 +18:18 +21:54  47  169  240 编码

2016/3/31 拾遗 php字符串中 转义字符 “ ’‘ ” ’ “” ‘ &quot; \’ &#39; &#39; \‘ &quot; &quot; \&quot; &#39;&#39; \ &quot; &quot; 使用

1 <?php 2 3 4 5 6 echo $str_string1='甲问:"你在哪里学的PHP?"'; 7 echo "<br />"; 8 echo $str_string2="乙毫不犹豫地回答:'慕课网'"; 9 echo "<br />"; 10 echo $str_string3='甲问:\'能告诉我网址吗?\''; 11 echo "<br />";

Andriod学习过程(每日更新2016/10/9)

从2016/10/9日开始自学Andriod,菜鸟晋级有很多不会的东西,整理出自己觉得比较好用的笔记仅供后人参考.首先下载Andriod studio,网址http://www.android-studio.org/  安转后会提示没有还要安装SDK,SDKhttp://android-sdk.en.softonic.com/  都配置好以后新建项目, Application name:项目名称 Company Domain:公司域名 Package name:app打包名称 project l

“耐撕”团队 2016.3.31 站立会议

”耐撕“团队 2016.3.31站立会议 1. 时间:20:15--21:55 2. 成员: Z 郑蕊 * 组长 (博客:http://www.cnblogs.com/zhengrui0452/), P 濮成林(博客:http://www.cnblogs.com/charliePU/), Q 齐嘉亮(博客:http://www.cnblogs.com/dendroaspis-polylepis/), L  刘伟硕(博客:http://www.cnblogs.com/WeSure6/), 3.会议

2016年31期老男孩运维班学员决心书

2016年31期老男孩运维班学员决心书 张孟鑫 一.我为什么来这学习 在这个经济.政治.科技发展迅速的当代社会,掌握一门甚至多门技术已成为生活.工作必不可少的一部分,而在今天我听了老男孩教育创始人的讲课以及学长们的学习经验.体会,我感觉我好想找到我想要的那种感觉(可以让我奋斗让我拼搏),所以我决定了一定要将老男孩的部分东西变成我的,不然我愧对父母以及浪费的时间,所以我来到了这里,来奋斗. 二.我的学习方法.安排 我要用我可以利用的时间去学习,课前预习,上课跟随老师的步骤,课后总结.复习.实践.

背水一战 Windows 10 (31) - 控件(按钮类): ButtonBase, Button, HyperlinkButton, RepeatButton, ToggleButton, AppBarButton, AppBarToggleButton

原文:背水一战 Windows 10 (31) - 控件(按钮类): ButtonBase, Button, HyperlinkButton, RepeatButton, ToggleButton, AppBarButton, AppBarToggleButton [源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 控件(按钮类) ButtonBase Button HyperlinkButton RepeatButton ToggleButton AppBarButto

每周例行报告2016.10.07-2016.10.14

PSP 日期 类型 任务 开始时间 结束时间 被打断时间(min) 实际(min) 2016.10.07 需求分析 看spec,分析每个功能的需求 14:59 15:38 3 36 编码学习 设计文件存放.分词.词频统计,阅读同学的代码 15:44 17:11 5 82 编码学习 词频排序.读取目录下书目.主函数设计 19:00 21:26 19 127 2016.10.08 编码学习 学习重定向 15.01 15:39 2 36 代码复审 写博客.调试运行结果 15:45 17:12 6 81

每周进度及工作量统计——2016.10.06-2016.10.13

项目:词频统计--web支持 项目类型:个人项目 项目完成情况:已完成 项目改进:新项目 项目日期:2016.10.9-2016.10.10 C类别 C内容 S开始时间 E结束时间 I间隔 T净时间 P预计时间 分析 设计  9:12  10:37  55  30  20 学习 查阅资料  10:37  11:46  0  69  30 编码 实现上传  16:03  21:53  127  223  180 优化 改进 9:56 17:41  149  316  120 文档 程序说明,随笔