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. log4j Logger 使用简介

    项目结构: log4j.properties 内容: log4j.rootCategory=info,stdout log4j.appender.stdout=org.apache.log4j.Con ...

  2. Python的编码规范

    7. 什么是 PEP8? 8号Python增强提案,是针对Python代码格式而编写的风格指南 8. 了解 Python 之禅么? 通过 import this 语句可以获取其具体的内容.它告诉大家何 ...

  3. 验证Prometheus alertmanager邮件发送

    新环境上配置alertmanager时出现了“Client was not authenticated to send anonymous mail during MAIL FROM”错误,但老环境上 ...

  4. JS系列:编程语言

    1.编程语言 html+css标记语言 js:轻量级的交互语言->全栈编程语言 - 面向对象: + C++ + JAVA + PHP + C# (.net doc) + JS - 面向过程 + ...

  5. VMnet1、VMnet8到底是什么?

    当我们安装VMware Workstation后,在宿主机(物理电脑)上会多出两个网卡,VMNet1.VMNet8,在虚拟机设置里会多出一个配置 VMNet0. vmnet1和vmnet8是两个虚拟网 ...

  6. day16——自定义模块、time、datetime、random

    day16 自定义模块 自定义一个模块 import :导入(拿工具箱) # import test # test.func() 导入发生的事情 在当前的名称空间中开辟一个新的空间 将模块中所有的代码 ...

  7. go 指针 通过指针修改int类型的值

    指针的定义 :var p *int 取指针的值 :*p ------------------------------------------------------------------------ ...

  8. MySQL学习一:建表

    目标:创建三张表,学生表student(sid,name,gender), 课程表course(cid,name), 分数mark(mid, sid, cid, gender); 要求sid, cid ...

  9. 基于hystrix的线程池隔离

    hystrix进行资源隔离,其实是提供了一个抽象,叫做command,就是说,你如果要把对某一个依赖服务的所有调用请求,全部隔离在同一份资源池内 对这个依赖服务的所有调用请求,全部走这个资源池内的资源 ...

  10. 开启Telnet服务

    在Win7系统中安装和启动Telnet服务非常简单:依次点击“开始”→“控制面板”→“程序”,“在程序和功能”找到并点击“打开或关闭Windows功能”进入Windows 功能设置对话框.找到并勾选“ ...