80+50+100=230。T1没做出来说明我数列学得不好?

LOLO 的含树

现有函数

\[g_m(i)=\begin{cases}
0, & 0 \leq i \leq m\\
i-1+\frac{1}{i}\sum_{j=1}^i(g_m(i-j)+g_m(j-1)), & i>m
\end{cases}
\]

给出 \(n,m\),求 \(g_m(n) \bmod (10^9+7)\)。

\(0 \leq m < n \leq 10^9\)。

HDU6680 Rikka with Quicksort

令 \(a_n=g_m(n),s_n=\sum_{i=1}^na_i\),则原式在 \(n>m\) 时可以写作

\[a_n=n-1+\frac{2}{n}s_{n-1}
\]

对 \(s_n\) 进行处理

\[s_n=s_{n-1}+a_n\\
=n-1+\frac{n+2}{n}s_{n-1}
\]

两边同时除以 \((n+1)(n+2)\) 得到

\[\frac{s_n}{(n+1)(n+2)}=\frac{n-1}{(n+1)(n+2)}+\frac{s_{n-1}}{n(n+1)}
\]

令 \(f_n=\frac{s_n}{(n+1)(n+2)}\),那么原式可以写成

\[f_n=\frac{n-1}{(n+1)(n+2)}+f_{n-1}
\]

分块打表预处理 \(\frac{n-1}{(n+1)(n+2)}\) 前缀和即可。

这个打表程序还是有点技术含量的,暴力打表特别慢。时间复杂度 \(O(L \log P)\)。

co int N=4e8+3;
int f[N]; il int inv(int x){
if(x<N) return f[x];
if(x%2==0) return mul(f[2],inv(x/2));
if(x%3==0) return mul(f[3],inv(x/3));
if(x%5==0) return mul(f[5],inv(x/5));
if(x%7==0) return mul(f[7],inv(x/7));
if(x%11==0) return mul(f[11],inv(x/11));
if(x%13==0) return mul(f[13],inv(x/13));
if(x%17==0) return mul(f[17],inv(x/17));
if(x%19==0) return mul(f[19],inv(x/19));
return fpow(x,mod-2);
}
co int L=1e6; int main(){
freopen("ftab.in","w",stdout);
f[0]=f[1]=1;
for(int i=2;i<N;++i) f[i]=mul(mod-mod/i,f[mod%i]);
int sum=0;
printf("%d,",sum);
for(int i=1;i<=1e9;++i){
sum=add(sum,mul(i-1,mul(inv(i+1),inv(i+2))));
if(i%L==0) printf("%d,",sum);
if(i%(10*L)==0) cerr<<i<<endl;
if(i%(100*L)==0) puts("");
}
return 0;
}

大常数(主要是L设的太大)代码

co int L=1e6;
int f[1001]={}; int sum(int n){
int ans=f[n/L];
for(int i=n/L*L+1;i<=n;++i) ans=add(ans,mul(i-1,mul(fpow(i+1,mod-2),fpow(i+2,mod-2))));
return ans;
} int main(){
freopen("func.in","r",stdin),freopen("func.out","w",stdout);
int n=read<int>(),m=read<int>();
int ans=add(sum(n-1),mod-sum(m));
ans=mul(ans,mul(n,n+1));
printf("%d\n",add(n-1,mul(2,mul(fpow(n,mod-2),ans))));
return 0;
}

乔治的重病

Mio 是个带孝子,他搜集了 n 种药材,第 i 味药有 pi 的概率使乔治被治好。他要将这 n 种药材中的一部分组合在一起(每味药的效果独立,且最多只能用一次)。俗话说是药三分毒,Mio 希望他的父亲只被治好一次。

\(n \leq 10^4\)。

HDU6693 Valentine's Day

假设选了集合 \(S\),答案可以表示为

\[ans=\sum_{i\in S}\frac{p_i}{1-p_i}\prod_{i\in S}(1-p_i)
\]

设现有的 \(\sum_{i\in S}\frac{p_i}{1-p_i}=X,~\prod_{i\in S}(1-p_i)=Y\),假设加入了新的物品 \(i\),那么新答案为

\[ans'=(X+\frac{p_i}{1-p_i})Y(1-p_i)
\]

新旧答案变化量为

\[\Delta ans=(1-X)Yp_i
\]

显然 \(X \geq 1\) 时加入任何物品都不会使得答案变忧。类似的,如果删除一个物品后 \(X \geq 1\),那么删除这个物品不会使答案变差。因此,任意一个最优解对应的非空药材集合 \(G\) 都满足 \(X \geq 1\),且该集合每个真子集均有 \(X<1\),也即

\[\forall T\subsetneq G,~X=\sum_{i\in T}\frac{p_i}{1-p_i}<1
\]

不难发现 \(\frac{p_i}{1−p_i}\) 和 \(p_i\) 的单调性相同。因此,如果一个满足上述条件的非空集合 \(G\) 不是由使乔治痊愈概率最大的若干个物品构成,那么可以把集合内概率最小的物品 \(a\) 换成集合外概率最大的物品 \(b\), 从而得到一个答案不会更劣的集合 \(G \backslash \{a\} \cup \{b\}\)。设新集合中概率最小的物品为 \(c\),新集合的真子集 \(G \backslash \{a\} \cup \{b\} \backslash \{c\}\) 可能不满足 \(X<1\),此时可以不断地删去集合中概率最小的物品,直到该集合满足条件。这个过程不会使答案变劣,不断地替换和删除药材可以得到最优解。

最终的结论是,按照概率从大到小的顺序购买药材直到 \(X \geq 1\) 或者全部买完为止,即可得到一个最优解。

时间复杂度 \(O(n \log n)\)。

co int N=10000+10;
LD p[N]; int main(){
freopen("ill.in","r",stdin),freopen("ill.out","w",stdout);
int n=read<int>();
for(int i=1;i<=n;++i) scanf("%Lf",p+i);
sort(p+1,p+n+1,greater<LD>());
LD ans=0;
LD X=0,Y=1;
for(int i=1;i<=n;++i){
if(p[i]==1) {ans=1;break;}
X+=p[i]/(1-p[i]),Y*=(1-p[i]);
ans=max(ans,X*Y);
}
printf("%.*Lf",read<int>(),ans);
return 0;
}

石鬼面

Mio 涂在面具上的血可以看做由 n 个血滴构成的序列,共有 m 种颜色。

Mio 可以改变血滴的颜色,他想知道一个区间里有多少种颜色的血滴。

他进行了 q 次操作,修改一个点的颜色或者查询一个区间内出现的颜色种数。

一次操作输入格式为 op x y

  1. op=1 时,将从左往右第 x 个血滴颜色改为 y。
  2. op=2 时,查询区间[x,y]内有多少种颜色的血滴。

题解

经典题。想方设法维护last即可,分块,树套树,线段树分治均可。

我用的是分块,\(O(n \sqrt{n})\)。

co int N=100000+10,M=316+10;
int n,m,Q;
int a[N],lst[N];
set<int> s[N];
int blo,num;
int le[M],ri[M],bl[N];
int cnt[M][N],tag[M][M]; void modify(int id,int p,int v){
for(int i=p;i<=ri[bl[p]];++i) cnt[id][i]+=v;
for(int i=bl[p]+1;i<=num;++i) tag[id][i]+=v;
}
int main(){
freopen("mask.in","r",stdin),freopen("mask.out","w",stdout);
read(n),read(m),read(Q);
for(int i=1;i<=m;++i) s[i].insert(0),s[i].insert(n+1);
for(int i=1;i<=n;++i) read(a[i]),lst[i]=*--s[a[i]].lower_bound(i),s[a[i]].insert(i); blo=sqrt(n),num=(n+blo-1)/blo;
for(int i=1;i<=num;++i){
le[i]=ri[i-1]+1,ri[i]=min(i*blo,n);
for(int j=le[i];j<=ri[i];++j) bl[j]=i,++cnt[i][lst[j]];
for(int j=1;j<=n;++j) cnt[i][j]+=cnt[i][j-1];
} // cerr<<"last=";
// for(int i=1;i<=n;++i) cerr<<" "<<lst[i];
// cerr<<endl;
while(Q--){
if(read<int>()==1){
int p=read<int>(),v=read<int>();
if(a[p]==v) continue;
s[a[p]].erase(p),modify(bl[p],lst[p],-1);
int q=*s[a[p]].upper_bound(p);
if(q<=n){
modify(bl[q],lst[q],-1);
lst[q]=lst[p],modify(bl[q],lst[q],1);
}
a[p]=v,s[v].insert(p);
lst[p]=*--s[v].lower_bound(p),modify(bl[p],lst[p],1);
q=*s[v].upper_bound(p);
if(q<=n){
modify(bl[q],lst[q],-1);
lst[q]=p,modify(bl[q],lst[q],1);
}
}
else{
int l=read<int>(),r=read<int>();
int ans=0;
if(bl[l]==bl[r]){
for(int i=l;i<=r;++i) ans+=lst[i]<l;
printf("%d\n",ans);
continue;
}
for(int i=l;i<=ri[bl[l]];++i) ans+=lst[i]<l;
for(int i=bl[l]+1;i<=bl[r]-1;++i) ans+=cnt[i][l-1]+tag[i][bl[l-1]];
for(int i=le[bl[r]];i<=r;++i) ans+=lst[i]<l;
printf("%d\n",ans);
}
}
return 0;
}

test20190924 老L的更多相关文章

  1. test20190925 老L

    100+0+0=100.概率题套路见的太少了,做题策略不是最优的. 排列 给出 n 个二元组,第 i 个二元组为(ai,bi). 将 n 个二元组按照一定顺序排成一列,可以得到一个排列.显然,这样的排 ...

  2. 铜齿铁牙UP计划

    铜齿铁牙UP计划 我在""做教练"之好声音训练"给出了老师.播音主持学习者,声乐学习者科学用声三要点: 用气发声 共鸣发声 虚实结合 用气发声首先要学会腹式呼吸 ...

  3. ThinkPHP 汉字转成多种形式拼音

    模型: <?php namespace Admin\Model; use Think\Model; /** * 汉字转拼音 * @author huangguojin */ class ZHMo ...

  4. 这些O2O比你们更靠谱儿

    本文纯属虚构,如有雷同,全是 C2C(Copy to China). 一 「什么社区 O2O,不就是跑腿儿的?那叮*小区不好好跑腿儿,非要搞什么狗屁社交,不是死了?」 三十四岁的老刘咽了口唾沫,接着跟 ...

  5. vue 获取汉字的全拼、简拼、首拼

    1.封装公共方法,获取汉字的全拼.简拼.首拼 export const Pinyin = { _JMcode:{ "-":"", "—":& ...

  6. JavaWeb 后端 <二> 之 Servlet 学习笔记

    一.Servlet概述 1.什么是Servlet Servlet是一个运行在服务器端的Java小程序,通过HTTP协议用于接收来自客户端请求,并发出响应. 2.Servlet中的方法 public v ...

  7. HTML5 3D 粒子波浪动画特效DEMO演示

    需要thress.js插件:     http://github.com/mrdoob/three.js // three.js - http://github.com/mrdoob/three.js ...

  8. (l老陈-小石头)典型用户、用户故事、用例图

    一.典型用户 老陈 小石头 二.用户故事 老陈:作为一个家长,我希望能利用软件在电脑上储存一些数学题目,以便在繁忙的工作中也能帮助到孩子提高数学. 小石头:作为一个小学二年级的小学生,我希望能利用软件 ...

  9. “不给力啊,老湿!”:RSA加密与破解

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 加密和解密是自古就有技术了.经常看到侦探电影的桥段,勇敢又机智的主角,拿着一长串毫 ...

随机推荐

  1. 基于redis+lua实现高并发场景下的秒杀限流解决方案

    转自:https://blog.csdn.net/zzaric/article/details/80641786 应用场景如下: 公司内有多个业务系统,由于业务系统内有向用户发送消息的服务,所以通过统 ...

  2. 选redis还是memcache,源码怎么说

    转自: https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651961272&idx=1&sn=79ad515b01 ...

  3. SQL Server 类似正则表达式的字符处理问题

    SQL Serve提供了简单的字符模糊匹配功能,比如:like, patindex,不过对于某些字符处理场景还显得并不足够,日常碰到的几个问题有: 1. 同一个字符/字符串,出现了多少次 2. 同一个 ...

  4. Resouce Pool的理解

    本篇文章从现象到本质再到具象去理解 , 从理论到实战再到源码回顾去深化. 1.在开发中,无处不在的池. eg 网络通信连接池: HttpClient连接池 HttpClient通过PoolingHtt ...

  5. 超级简单POI导出Excel实战

    在一般的生产管理系统都会将数据通过页面导出到Excel,这里以Java为例通过第三方开源poi进行对Excel的操作,具体操作如下 1.引入jar包依赖 这里我以maven的方式引入jar包,具体依赖 ...

  6. 小白的C++之路——简易计算机

    #include <iostream> using namespace std; int main() { char link; double num1, num2,num3; cout ...

  7. 快速排序(Quick Sort)C语言

    已知数组 src 如下: [5, 3, 7, 6, 4, 1, 0, 2, 9, 10, 8] 快速排序1 在数组 src[low, high] 中,取 src[low] 作为 关键字(key) . ...

  8. LeetCode 1253. 重构 2 行二进制矩阵 - Java - 统计

    题目链接:https://leetcode-cn.com/contest/weekly-contest-162/problems/reconstruct-a-2-row-binary-matrix/ ...

  9. Go语言【数据结构】数组

    数组 简介 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形.字符串或者自定义类型.数组形式 numbers[0], numbers[1] ..., nu ...

  10. Latex中如何设置字体颜色(三种方式)

    1.直接使用定义好的颜色 \usepackage{color} \textcolor{red/blue/green/black/white/cyan/magenta/yellow}{text} 其中t ...