正解:贪心+线段树/set库

解题报告:

算辣直接甩链接qwq

恩这题就贪心?从前往后从后往前各推一次然后找一遍哪个地方最大就欧克了,正确性很容易证明

(这里有个,很妙的想法,就是,从后往前推从前往后推可能会有相同的牌嘛,但是其实这个是没有个关系的!

因为,既然有相同的牌那么就必定有多了的牌,然后如果这个多了的牌比重了的牌大我们就放前面,比重了的小我们就放后面,这样就不会影响答案的正确性了……

哇我觉得这个想法真是太神仙了像我这种菜鸡自己单独想的话是绝对想不到这个的我可能就直接放弃贪心了TT

但是纯贪心的话是会超时的TT然后我就又参考了下题解,发现有线段树&set库两种优化方法?因为set库还并不了解所以先把线段树的代码看完了……看完之后感觉对线段树也有了更深的认识啊(恩大概是因为我太菜了对线段树的认识太浅薄所以随便个什么东西都能让我感觉很神仙很有启发TT

直接放代码quq

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rp(i,x,y) for(register ll i=x;i<=y;++i)
#define my(i,x,y) for(register ll i=y;i>=x;--i)

;
ll n,a[N],b[N],ans[N],tot=;
];
];

ll read()
{
    ;
    ')ch=getchar();
    )+(x<<)+(ch^'),ch=getchar();
    return x;
}
void build(ll d,ll l,ll r)
{
    t[d].s1=t[d].s2=;
    if (l==r) return;
    ll mid=(l+r)>>;
    build(d<<,l,mid);build((d<<)|,mid+,r);
}

void update(ll d,ll op)
{
    ll s;
    )|].s1,t[d<<].s2);
    ].s1,t[(d<<)|].s2);
    t[d].s1=t[d<<].s1+t[(d<<)|].s1-s;
    t[d].s2=t[d<<].s2+t[(d<<)|].s2-s;
}

void ins(ll d,ll l,ll r,ll x,ll op)
{
    ;;return;}
    ;
    ,l,mid,x,op);
    )|,mid+,r,x,op);
    update(d,op);
}

int main()
{
    n=read();
    rp(i,,n)b[i]=read(),vis[b[i]]=;
    my(i,,n<<)if(!vis[i])a[++tot]=i;
    rp(i,,n)ins(,,n<<,a[i],),ins(,,n<<,b[i],),ans[i]+=i-t[].s1;
    build(,,n<<);
    my(i,,n)ins(,,n<<,a[i],),ins(,,n<<,b[i],),ans[i-]+=n-i+-t[].s1;
    ;
    rp(i,,n)mx=max(mx,ans[i]);
    printf("%lld",mx);
    ;
}

然后港下set做法?话说set做法实在太太太简单了趴,,,完全不用脑子的说,,,我当初还是太弱了呢连set和lower_bound都不会qwq

就非常简单啊,lower_bound优化一下查找过程就水过去了,挺无趣的qwq还是线段树的比较有趣qwq

然后代码放一下qwq

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rp(i,x,y) for(register ll i=x;i<=y;++i)
#define my(i,x,y) for(register ll i=x;i>=y;--i)

;
ll n,a[N],b[N],ans,f[N],g[N],tot;
];
set<ll>c;

ll read()
{
    ;
    ')ch=getchar();
    )+(x<<)+(ch^'),ch=getchar();
    return x;
}

int main()
{
    n=read();
    rp(i,,n)b[i]=read(),vis[b[i]]=;
    rp(i,,n<<)if(!vis[i])a[++tot]=i;
    rp(i,,n)c.insert(a[i]);
    rp(i,,n)
    {
        set<ll>::iterator it=c.upper_bound(b[i]);
        ]+,c.erase(it);
        ];
    }
    c.clear();
    rp(i,,n)c.insert(-a[i]);
    my(i,n,)
    {
        set<ll>::iterator it=c.upper_bound(-b[i]);
        ]+,c.erase(it);
        ];
    }
    rp(i,,n)ans=max(ans,f[i]+g[i+]);
    printf("%lld\n",ans);
    ;
}

//完美结束yeah!

完美结束嘻嘻嘻

ps:

感觉这个好像不是完全是个线段树?并不知道是什么思想暂且先当做线段树趴!

再,pppppps:

第一次在博客上写题解,感觉还挺新奇的?以后要多写点儿题解(毕竟灵巧太蒻了有很多题目都要再总结记录下来啊quq不然可能以后再看做过的题目都会怀疑自己以前写的代码都是些什么神仙玩意儿了QAQ

然后感觉格式有点儿丑啊还是……可能还有很多新奇的编辑工具不会用趴,比如说代码……我的代码插入那儿真是太丑了QAQ想换成主色调为黑的感觉超级酷可惜不会换(dbq我不该把心思都放在博客好不好看上的……忏悔TT

BZOJ4391 High Card Low Card [Usaco2015 dec](贪心+线段树/set库的更多相关文章

  1. 【BZOJ4391】[Usaco2015 dec]High Card Low Card(贪心)

    [BZOJ4391][Usaco2015 dec]High Card Low Card(贪心) 题面 BZOJ 题解 预处理前缀后缀的结果,中间找个地方合并就好了. #include<iostr ...

  2. 【题解】P3129高低卡(白金)High Card Low Card

    [题解][P3129 USACO15DEC]高低卡(白金)High Card Low Card (Platinum) 考虑贪心. 枚举在第几局改变规则,在改变规则之前,尽量出比它大的最小的牌,在改变规 ...

  3. 【题解】P1712 [NOI2016]区间(贪心+线段树)

    [题解]P1712 [NOI2016]区间(贪心+线段树) 一个observe是,对于一个合法的方案,将其线段长度按照从大到小排序后,他极差的来源是第一个和最后一个.或者说,读入的线段按照长度分类后, ...

  4. [BZOJ4391][Usaco2015 dec]High Card Low Card dp+set+贪心

    Description Bessie the cow is a huge fan of card games, which is quite surprising, given her lack of ...

  5. 【dp 贪心】bzoj4391: [Usaco2015 dec]High Card Low Card

    巧妙的贪心 Description Bessie the cow is a huge fan of card games, which is quite surprising, given her l ...

  6. [bzoj4391] [Usaco2015 dec]High Card Low Card 贪心 线段树

    ---题面--- 题解: 观察到以决策点为分界线,以点数大的赢为比较方式的游戏都是它的前缀,反之以点数小的赢为比较方式的都是它的后缀,也就是答案是由两段答案拼凑起来的. 如果不考虑判断胜负的条件的变化 ...

  7. 【刷题】BZOJ 4391 [Usaco2015 dec]High Card Low Card

    Description Bessie the cow is a huge fan of card games, which is quite surprising, given her lack of ...

  8. [USACO15DEC]高低卡(白金)High Card Low Card (Platinum)

    题目描述 Bessie the cow is a hu e fan of card games, which is quite surprising, given her lack of opposa ...

  9. Codeforces 675E Trains and Statistic(DP + 贪心 + 线段树)

    题目大概说有n(<=10W)个车站,每个车站i卖到车站i+1...a[i]的票,p[i][j]表示从车站i到车站j所需买的最少车票数,求所有的p[i][j](i<j)的和. 好难,不会写. ...

随机推荐

  1. 创建shell脚本

    1.写一个脚本 a) 用touch命令创建一个文件:touch my_script b) 用vim编辑器打开my_script文件:vi my_script c) 用vim编辑器编辑my_script ...

  2. Java知多少(92)滚动条

    滚动条(JScrollBar)也称为滑块,用来表示一个相对值,该值代表指定范围内的一个整数.例如,用Word编辑文档时,编辑窗右边的滑块对应当前编辑位置在整个文档中的相对位置,可以通过移动选择新的编辑 ...

  3. feign调用接口session丢失解决方案

    微服务使用feign相互之间调用时,因为feign默认不传输Header,存在session丢失的问题.例如,使用Feign调用某个远程API,这个远程API需要传递一个鉴权信息,我们可以把cooki ...

  4. Scala学习笔记——断言和单元测试

    1.断言 assert(conditon)将在条件不成立的时候,抛出assertionError assert(conditon,explanation)讲在条件不成立的时候,抛出explanatio ...

  5. Linux权限详解 命令之 chmod:修改权限

    权限简介 Linux系统上对文件的权限有着严格的控制,用于如果相对某个文件执行某种操作,必须具有对应的权限方可执行成功. Linux下文件的权限类型一般包括读,写,执行.对应字母为 r.w.x. Li ...

  6. Docker的概念术语(2)

    Docker是什么? Docker是开发人员和系统管理员使用容器开发,部署和运行应用程序的平台.使用Linux容器部署应用程序称为容器化.Linux容器不是一个全新的概念,它们用于轻松部署应用程序. ...

  7. git合并分支上指定的commit

    merge 能够胜任平常大部分的合并需求.但也会遇到某些特殊的情况,例如正在开发一个新的功能,线上说有一个紧急的bug要修复.bug修好了但并不像把仍在开发的新功能代码也提交到线上去.这时候也许想要一 ...

  8. 【JAVA-JDT-AST】Java抽象语法树的构建、遍历及转成dot格式(附Github源码)

    Background: 最近为了重现tree-based clone detection的论文:L. Jiang, G. Misherghi, Z. Su, and S. Glondu. Deckar ...

  9. Tomcat服务器使用和debug

    1 在写程序的过程中,遇到了tomcat服务器不能重启的情况,要排查出这个错误并解决它. tomcat就像一棵树,我不能对书上的每片叶子的纹理都熟悉,我只能看到树的轮廓.好像之前出现过这个问题,在se ...

  10. nginx 根据端口不同实现负载均衡

    upstream www.abc.com { server www.mynginx.com:91; server www.mynginx.com:92; }server { listen 80; se ...