题目描述

降雷皇哈蒙很喜欢雷电,他想找到神奇的电光。

哈蒙有n条导线排成一排,每条导线有一个电阻值,神奇的电光只能从一根导线传到电阻比它大的上面,而且必须从左边向右传导,当然导线不必是连续的。

哈蒙想知道电光最多能通过多少条导线,还想知道这样的方案有多少。

数据范围

对于20%的数据n<=10;

对于40%的数据n<=1000;

对于另外20%的数据type=0;

对于另外20%的数据保证最多能通过不超过100条导线;

对于100%的数据n<=100000,电阻值不超过100000。

=w=

首先第一问直接最长不下降子序列即可。

其中f[i]表示以a[i]结尾的最长不下降子序列最长是多少。

然后对于第二问而言,设g[i]表示要以a[i]结尾的最长不下降子序列的长度达到f[i]有多少种选法。

容易有g[i]=∑i−1j=1[f[j]==f[i]−1 and a[j]<a[i]]。

我们发现这个如果用数据结构来维护的话,需要维护两个条件。

那么就开n棵权值线段树,动态加边即可。

代码

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
const char* fin="hamon.in";
const char* fout="hamon.out";
const int inf=0x7fffffff;
const int maxn=100007,mo=123456789,maxtot=3000007;
int n,m,i,j,k;
int a[maxn],f[maxn],g[maxn];
int tmp,tmd,ans,ans1;
int c[maxn];
int rt[maxn],tot;
struct node{
int x;
int lson,rson;
}d[maxtot];
void change(int v,int v1){
for (;v<maxn;v+=v&-v) c[v]=max(c[v],v1);
}
int getmax(int v){
int k=0;
for (;v;v-=v&-v) k=max(k,c[v]);
return k;
}
void modify(int t,int l,int r,int v,int v1){
int mid=(l+r)/2;
if (l==r){
d[t].x+=v1;
return ;
}
if (v<=mid){
if (!d[t].lson) d[t].lson=++tot;
modify(d[t].lson,l,mid,v,v1);
}else{
if (!d[t].rson) d[t].rson=++tot;
modify(d[t].rson,mid+1,r,v,v1);
}
d[t].x=(d[d[t].lson].x+d[d[t].rson].x)%mo;
}
int getsum(int t,int l,int r,int v){
int mid=(l+r)/2;
if (!t || l>v) return 0;
if (r<=v) return d[t].x;
return (getsum(d[t].lson,l,mid,v)+getsum(d[t].rson,mid+1,r,v))%mo;
}
int main(){
freopen(fin,"r",stdin);
freopen(fout,"w",stdout);
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++) scanf("%d",&a[i]),a[i]+=2,rt[i]=++tot;
for (i=1;i<=n;i++){
tmp=tmd=0;
tmp=getmax(a[i]-1);
if (m==1) tmd=getsum(rt[tmp],1,maxn-1,a[i]-1);
if (tmp){
f[i]=tmp+1;
g[i]=tmd;
}else f[i]=g[i]=1;
change(a[i],f[i]);
if (m==1) modify(rt[f[i]],1,maxn-1,a[i],g[i]);
if (ans<f[i]){
ans=f[i];
ans1=g[i];
}else if (ans==f[i]) ans1=(ans1+g[i])%mo;
}
printf("%d\n",ans);
if (m==1) printf("%d\n",ans1);
if (tot>=maxtot) printf("error\n");
return 0;
}

=o=

虽然这题我的解法非常暴力,但是反映了做题技巧啊:

当要满足两个条件时,考虑开若干棵线段树。

【JZOJ4920】【NOIP2017提高组模拟12.10】降雷皇的更多相关文章

  1. 【NOIP2017提高组模拟12.10】幻魔皇

    题目 幻魔皇拉比艾尔很喜欢斐波那契树,他想找到神奇的节点对. 所谓斐波那契树,根是一个白色节点,每个白色节点都有一个黑色节点儿子,而每个黑色节点则有一个白色和一个黑色节点儿子.神奇的节点对则是指白色节 ...

  2. 【JZOJ4921】【NOIP2017提高组模拟12.10】幻魔皇

    题目描述 幻魔皇拉比艾尔很喜欢斐波那契树,他想找到神奇的节点对. 所谓斐波那契树,根是一个白色节点,每个白色节点都有一个黑色节点儿子,而每个黑色节点则有一个白色和一个黑色节点儿子.神奇的节点对则是指白 ...

  3. 【NOIP2017提高组模拟12.10】神炎皇

    题目 神炎皇乌利亚很喜欢数对,他想找到神奇的数对. 对于一个整数对(a,b),若满足a+b<=n且a+b是ab的因子,则成为神奇的数对.请问这样的数对共有多少呢? 分析 设\(gcd(a,b)= ...

  4. 【JZOJ4919】【NOIP2017提高组模拟12.10】神炎皇

    题目描述 神炎皇乌利亚很喜欢数对,他想找到神奇的数对. 对于一个整数对(a,b),若满足a+b<=n且a+b是ab的因子,则成为神奇的数对.请问这样的数对共有多少呢? 数据范围 对于100%的数 ...

  5. NOIP2017提高组模拟赛 10 (总结)

    NOIP2017提高组模拟赛 10 (总结) 第一题 机密信息 FJ有个很奇怪的习惯,他把他所有的机密信息都存放在一个叫机密盘的磁盘分区里,然而这个机密盘中却没有一个文件,那他是怎么存放信息呢?聪明的 ...

  6. 【NOIP2017提高组模拟12.24】B

    题目 现在你有N个数,分别为A1,A2,-,AN,现在有M组询问需要你回答.每个询问将会给你一个L和R(L<=R),保证Max{Ai}-Min{Ai}<=R-L,你需要找出并输出最小的K( ...

  7. 【JZOJ4928】【NOIP2017提高组模拟12.18】A

    题目描述 数据范围 对于100%的数据,n<=100000,1<=A[i]<=5000 =w= Ans=∏1ai 代码 #include<iostream> #inclu ...

  8. 【NOIP2017提高组模拟12.17】环

    题目 小A有一个环,环上有n个正整数.他有特殊的能力,能将环切成k段,每段包含一个或者多个数字.对于一个切分方案,小A将以如下方式计算优美程度: 首先对于每一段,求出他们的数字和.然后对于每段的和,求 ...

  9. 求hack or 证明(【JZOJ 4923】 【NOIP2017提高组模拟12.17】巧克力狂欢)

    前言 本人在此题有一种不是题解的方法,但无法证明也找不到反例. 如果各位大神有反例或证明请发至 邮箱:qq1350742779@163.com Description Alice和Bob有一棵树(无根 ...

随机推荐

  1. 洛谷P2333 [SCOI2006]一孔之见

    传送门 辣鸡题目毁我人生败我前程 50分代码 //Achen #include<algorithm> #include<iostream> #include<cstrin ...

  2. Navicat12.1.7破解教程

    https://blog.csdn.net/qq_39344689/article/details/85161342

  3. jeecmsv8 shiro 分析

      源代码注释可见 https://github.com/chenbo19867758/jeecmsV8-BoBo.git 1.后台登录页面 /jeeadmin/jeecms/login.do 1 w ...

  4. 【arc075f】AtCoder Regular Contest 075 F - Mirrored

    题意 给定一个数x,问有多少个正整数y,使得rev(y)-y==x 其中rev(x)表示x按位翻转之后得到的数. x<=1e9 做法 首先通过打表发现,这个答案不会很大. 这就说明解相当地松弛. ...

  5. PAT甲级——A1047 Student List for Course

    Zhejiang University has 40,000 students and provides 2,500 courses. Now given the registered course ...

  6. PAT甲级——A1011 World Cup Betting

    With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly excite ...

  7. Maven实战02_Maven的安装和配置

    1:在Windows上安装Maven 本人系统环境:win10  + JDK1.8 + apache-maven-3.3.9 在安装Maven之前,首先要确定你的Java环境是否已经配置好了,你是否已 ...

  8. 【DM642学习笔记三】flash的烧写

    ICETEK-DM642-PCI板上的29L008B芯片提供了8M位的Flash空间(访问地址空间是CE1,90000000h~90080000h).主要用于自启动功能和存储FPGA的配置数据. 一. ...

  9. 装饰者模式(Decorator、Compoment)(早餐销售装饰,动态添加职责)

    适用于以下情况: (1)需要扩展一个类的功能,或给一个类添加附加职责. (2)需要动态的给·一个对象添加功能,这些功能可以再动态的撤销. (3)需要增加由一些基本功能的排列组合而产生的非常大量的功能, ...

  10. SQL 查询--日期条件(今日、昨日、本周、本月。。。) (转)

    主要用到sql 函数 DATEDIFF(datepart,startdate,enddate) sql 语句,设 有 数据库表 tableA(日期字段ddate) ——查询 今日 select * f ...