「NOI十联测」奥义商店

若lzz想花费最少的钱,那么显然要选择数目较少的颜色。

先考虑暴力的写法。

每次向两边统计,每个物品要求被买的概率可以由上一个物品推出。

now=1;//now 被买概率 M 选择的颜色的数目
for(int q=1;st+d*q<=n&&q<=cnt[1];++q){
now*=(M-q+1.0)/(n-1-q+1);//当前点被涂上选择的颜色的概率 * 先前的物品也涂上选择的颜色
ans+=val[st+d*q]*now;
}
now=1;
for(int q=1;st-d*q>0&&q<=cnt[1];++q){//同上
now*=(M-q+1.0)/(n-1-q+1);
ans+=val[st-d*q]*now;
}

观察到,当\(2 \leq t\),那么\(M \leq {n \over 2}\),而此时now的衰减极快,大约可以在\(log_2(10^8)\)次数内不再对答案的有贡献(精度问题)。因此可以做到查询复杂度\(o(log)\),修改复杂度\(o(1)\)。

当\(t=1\),颜色只有一种,故只要是在等差序列上的点,都要被选中。

​ 对于\(\sqrt n \leq d\)的情况,可以暴力计算,询问复杂度\(o(\sqrt n)\),修改复杂度\(o(1 )\)。

​ 对于\(\sqrt n \geq d\)的情况,可以对每个d和每个起始点都预处理一遍答案,询问复杂度\(o(1)\),修改复杂度\(o(\sqrt n )\)。

故可以得到时间和空间都为\(o(n \sqrt n)\)的算法。

#include<bits/stdc++.h>
#define rep(q,a,b) for(int q=a,q##_end_=b;q<=q##_end_;++q)
#define dep(q,a,b) for(int q=a,q##_end_=b;q>=q##_end_;--q)
#define mem(a,b) memset(a,b,sizeof a )
#define debug(a) cerr<<#a<<' '<<a<<"___"<<endl
using namespace std;
void in(int &r) {
static char c;
r=0;
while(c=getchar(),c<48);
do r=(r<<1)+(r<<3)+(c^48);
while(c=getchar(),c>47);
}
bool cur1;
const int mn=100005;
int n,m,val[mn];
int sq,sum[330][330];
void get1(int st,int d){
if(d<=sq)printf("%.4lf\n",(double)sum[d][st%d]);
else{
int ans=val[st];
for(int q=1;st+d*q<=n;++q)ans+=val[st+d*q];
for(int q=1;st-d*q>0;++q)ans+=val[st-d*q];
printf("%.4lf\n",(double)ans);
}
}
void get(int col,int st,int d,int M){
double ans=val[st],now=1;
for(int q=1;st+d*q<=n&&q<=M;++q){
if(now<1e-10)break;
now*=(M-q+1.0)/(n-1-q+1);
ans+=val[st+d*q]*now;
}
now=1;
for(int q=1;st-d*q>0&&q<=M;++q){
if(now<1e-10)break;
now*=(M-q+1.0)/(n-1-q+1);
ans+=val[st-d*q]*now;
}
printf("%.4lf\n",ans);
}
void change(int x,int v){
int d=v-val[x];
val[x]=v;
rep(w,1,sq)sum[w][x%w]+=d;
}
bool cur2;
int main(){
// cerr<<(&cur1-&cur2)/1024.0/1024.0;
freopen("lzz.in","r",stdin);
freopen("lzz.out","w",stdout);
in(n),in(m);
rep(q,1,n)in(val[q]);
sq=sqrt(n)+1;
rep(q,1,sq)rep(w,1,n)sum[q][w%q]+=val[w];
int a,b,c,d;
while(m--){
in(a),in(b),in(c);
if(a==1)change(b,c);
else{
in(d);
int M=1e9;
rep(q,1,b)in(a),M=min(a,M);
if(b==1)get1(c,d);
else get(b,c,d,M);
}
}
return 0;
}

「NOI十联测」奥义商店的更多相关文章

  1. 「NOI十联测」深邃

    「NOI十联测」深邃 要使得最大的连通块最小,显然先二分答案. 先固定1结点为根. 对于一个果实,显然是先处理子树中未分配的点,再向外延伸. 每个结点记录一个\(si[]\),表示子树中未分配的点数, ...

  2. 「NOI十联测」黑暗

    「NOI十联测」黑暗 \(n\) 个点的无向图,每条边都可能存在,一个图的权值是连通块个数的 \(m\) 次方,求所有可能的图的权值和.(n≤30000,m≤15) 令\(ans[n][m]\)为n个 ...

  3. 「NOI十联测」反函数

    30pts 令(为1,)为-1: 暴力枚举每个点为起始点的路径,一条路径是合法的当且仅当路径权值和为0且路径上没有出现过负数. 将所有答案算出. 100pts 使用点分治. 要求知道经过重心root的 ...

  4. HHHOJ #153. 「NOI模拟 #2」Kotomi

    抽代的成分远远大于OI的成分 首先把一个点定为原点,然后我们发现如果我们不旋转此时答案就是所有位置的\(\gcd\) 如果要选择怎么办,我们考虑把我们选定的网格边连同方向和大小看做单位向量\(\vec ...

  5. HHHOJ #151. 「NOI模拟 #2」Nagisa

    计算几何板子题(我才没有拷板子的说--) 众所周知,三角形的重心坐标是\((\frac{x_1+x_2+x_3}{3},\frac{y_1+y_2+y_3}{3})\) 然后我们发现如果我们有一个点集 ...

  6. Solution -「NOI 模拟赛」彩色挂饰

    \(\mathcal{Description}\)   给定一个含 \(n\) 个点 \(m\) 条边的简单无向图,设图中最大点双的大小为 \(s\),则保证 \(s\le6\).你将要用 \(k\) ...

  7. Solution -「NOI 模拟赛」出题人

    \(\mathcal{Description}\)   给定 \(\{a_n\}\),求一个 \(\{b_{n-1}\}\),使得 \(\forall x\in\{a_n\},\exists i,j\ ...

  8. 「洛谷 P1801」黑匣子

    好像很久没有更过博客了,因为博主这几周很忙.其实是在搞颓. 题意很难懂,所以就不重复了.其实是懒. 一眼看上去这是个 \(Splay\) 裸题,直接插入一个数,查询区间第 \(K\) 大,但是这样太不 ...

  9. Diary -「NOI 2021」酱油记

    雨幕浓稠 远近一白 是水雾弥漫的天 还是泡沫撑起的海   雨真大呢.   前几天去 ZH 中学集训没啥好记的,就从会合日开始叭. [Day -1]   逃出 ZH,掉入梦麟.(   高中的同学们忘记带 ...

随机推荐

  1. 利用数学软件Mathematica的三维图像进行建模

    前言 最近在使用Mathematica进行二元函数的图像绘制,在导出图像选项中看到了obj,maya等三维格式.其实很早之前我就有过这样的想法,但之前使用的是matlab作图,无法导出三维格式.那么废 ...

  2. 对vector和map容器的删除元素操作

    /** * 删除头部元素 * 切割map到指定的个数 * @param map * @param i * @return */ map<int, Rect> PublicCardFrame ...

  3. [opencv]拼接合并轮廓集合mergeContours

    /** * 拼接合并轮廓集合 * @param contours * @return */ vector<vector<Point>> mergeContours(vector ...

  4. RSA非对称加密算法实现:Python

    RSA是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院工作.RSA ...

  5. Java中的对象、类、抽象类、接口的理解

    1.对象 对象是个具体的东西,有着明确的属性特征和行为特征. 例如:你手上牵着的女朋友或男朋友就是个具体的对象. 如图中的苏格兰折耳猫,特征是耳朵向下呈折叠状,有着具体的颜色(你看到的颜色),并且和其 ...

  6. Swoole 中毫秒定时器(Timer)的使用

    间隔定时器, tick 定时器会持续触发,直到调用 clear() 清除为止. $timer = Swoole\Timer::tick(3000, function (int $timer_id, $ ...

  7. oracle 之 while循环月份

    需求 需要跑一个数据,时间从17年5月到21年3月. 代码(简单粗暴实现) DECLARE i number; BEGIN i:= 201705; WHILE i <202104 LOOP if ...

  8. 【PowerShell】ASCII与Char之间的转换

    1 [char[]][int[]]$char=65..90 2 $char -join ',' 3 [int[]][char[]]$ascii=$char 4 $ascii -join ',' A,B ...

  9. 新增访客数量MR统计之MR数据输出到MySQL

    关注公众号:分享电脑学习回复"百度云盘" 可以免费获取所有学习文档的代码(不定期更新)云盘目录说明:tools目录是安装包res 目录是每一个课件对应的代码和资源等doc 目录是一 ...

  10. 学习javaScript必知必会(1)~js介绍、函数、匿名函数、自调用函数、不定长参数

    一.简单了解一下JavaScript(js) 1.什么是js? js:是网景公司开发的,是基于客户端浏览器, 面向(基于)对象.事件驱动式的页面脚本语言. 2.什么场景下使用到js? 表单验证.页面特 ...