CH模拟赛 还教室


/*
区间操作,可以推一推式子,方差为平方的平均数-平均数的平方,维护区间和与区间平方和,平方和的维护方法类似,式子推一推就行了,注意约分
*/
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#define ll long long
#define fo(i,l,r) for(int i = l;i <= r;i++)
#define fd(i,l,r) for(int i = r;i >= l;i--)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int N = ;
ll read(){
ll x=,f=;
char ch=getchar();
while(!(ch>=''&&ch<='')){if(ch=='-')f=-;ch=getchar();};
while(ch>=''&&ch<=''){x=x*+(ch-'');ch=getchar();};
return x*f;
}
ll gcd(ll a,ll b){return b==?a:gcd(b,a%b);}
struct fs{
ll son;
ll mo;
void yf(){
if(son == || mo == ){
if(son == ) mo = ;
return;
}
ll d = gcd(son,mo);
son /= d;
mo /= d;
}
void clear(ll a,ll b){
son = a;
mo = b;
yf();
}
fs operator + (fs b){
fs a=*this;
ll d = gcd(a.mo,b.mo);
ll lcm = a.mo / d * b.mo;
a.son *= lcm / a.mo;
b.son *= lcm / b.mo;
a.son += b.son;
a.mo = lcm;
a.yf();
return a;
}
fs operator - (fs b){
fs a=*this;
ll d = gcd(a.mo,b.mo);
ll lcm = a.mo / d * b.mo;
a.son *= lcm / a.mo;
b.son *= lcm / b.mo;
a.son -= b.son;
a.mo = lcm;
if(!a.son) a.mo = ;
else a.yf();
return a;
}
fs operator * (fs b){
fs a=*this;
a.son *= b.son;
a.mo *= b.mo;
a.yf();
return a;
}
fs operator / (ll b){
fs a =*this;
a.mo *= b;
a.yf();
return a;
}
bool operator < (fs b){
return son*b.mo < mo*b.son;
}
fs operator - (ll k){
fs b,a=*this;
b.clear(k,);
if(a<b) swap(a,b);
return a-b;
}
void print(){
printf("%I64d/%I64d\n",son,mo);
}
}ans,fd;
int n,m;ll val[N];
ll sumv[N<<],addv[N<<],powv[N<<];
ll cmd,op,ql,qr,qv,ans1,ans2;
void maintain(int rt){
sumv[rt] = sumv[rt<<] + sumv[rt<<|];
powv[rt] = powv[rt<<] + powv[rt<<|];
}
void pushdown(int l,int r,int rt){
int m = (l + r) >> ;
if(!addv[rt]) return;
addv[rt<<] += addv[rt];
addv[rt<<|] += addv[rt];
powv[rt<<] += *addv[rt]*sumv[rt<<] + (m-l+)*addv[rt]*addv[rt];
powv[rt<<|] += *addv[rt]*sumv[rt<<|] + (r-m)*addv[rt]*addv[rt];
sumv[rt<<] += addv[rt] * (m-l+);
sumv[rt<<|] += addv[rt] * (r-m);
addv[rt] = ;
}
void build(int l,int r,int rt){
addv[rt] = ;
if(l==r){
powv[rt] = val[l]*val[l];
sumv[rt] = val[l];
return;
}
int m = (l + r) >> ;
build(lson);
build(rson);
maintain(rt);
}
void change(ll l,ll r,int rt){
if(ql <= l && qr >= r){
addv[rt] += qv;
powv[rt] += *qv*sumv[rt] + qv*qv*(r-l+);
sumv[rt] += qv*(r-l+);
return;
}
pushdown(l,r,rt);
int m = (l + r) >> ;
if(ql <= m) change(lson);
if(qr > m) change(rson);
maintain(rt);
}
ll query(int l,int r,int rt){
if(ql <= l && qr >= r){
if(op == ) return sumv[rt];
else return powv[rt];
}
pushdown(l,r,rt);
int m = (l + r) >> ;
ll ret = ;
if(ql <= m) ret += query(lson);
if(qr > m) ret += query(rson);
return ret;
}
int main(){
freopen("classroom.in","r",stdin);
freopen("classroom.out","w",stdout);
n =read();m=read();
fo(i,,n) val[i]=read();
build(,n,);
fo(i,,m){
cmd=read();ql=read();qr=read();
if(cmd==){
qv=read();
change(,n,);
}else if(cmd == ){
op = ;
ans1=query(,n,);
ans2=(qr-ql+);
ans.clear(ans1,ans2);
ans.print();
}else if(cmd == ){
op = ;
ans1=query(,n,);
ans2=(qr-ql+);
ans.clear(ans1,ans2);
ans1=ans2=;
op = ;
ans1=query(,n,);
ans2=(qr-ql+);
fd.clear(ans1,ans2);
fd = fd*fd;
ans = ans-fd;
ans.print();
}
}
return ;
}
CH模拟赛 还教室的更多相关文章
- CH Round #52 还教室[线段树 方差]
还教室 CH Round #52 - Thinking Bear #1 (NOIP模拟赛) [引子]还记得 NOIP 2012 提高组 Day2 中的借教室吗?时光飞逝,光阴荏苒,两年过去了,曾经借教 ...
- CH模拟赛 皇后游戏
/* 做的时候手推了一下n=2的四种情况,再排一下序就可以了,证明不是很严谨,但我想这就行了,毕竟全是套路 */ #include<iostream> #include<cstdio ...
- CH模拟赛 拆地毯
/* MST,注意只能加K条边,但是备选是M条边 */ #include<iostream> #include<cstdio> #include<string> # ...
- CH Round #52 - Thinking Bear #1 (NOIP模拟赛)
A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...
- 模拟赛小结:2017 China Collegiate Programming Contest Final (CCPC-Final 2017)
比赛链接:传送门 前期大顺风,2:30金区中游.后期开题乏力,掉到银尾.4:59绝杀I,但罚时太高卡在银首. Problem A - Dogs and Cages 00:09:45 (+) Solve ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
- CH Round #49 - Streaming #4 (NOIP模拟赛Day2)
A.二叉树的的根 题目:http://www.contesthunter.org/contest/CH%20Round%20%2349%20-%20Streaming%20%234%20(NOIP 模 ...
- CH Round #54 - Streaming #5 (NOIP模拟赛Day1)
A.珠 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2354%20-%20Streaming%20%235%20(NOIP模拟赛Day1)/珠 题解:sb题, ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
随机推荐
- MySql存储过程
MySQL 存储过程 ```sql CREATE PROCEDURE myprocedure (IN para01 INTEGER) BEGIN DECLARE var01 CHAR(10); IF ...
- 基于英特尔® 至强™ 处理器 E5 产品家族的多节点分布式内存系统上的 Caffe* 培训
原文链接 深度神经网络 (DNN) 培训属于计算密集型项目,需要在现代计算平台上花费数日或数周的时间方可完成. 在最近的一篇文章<基于英特尔® 至强™ E5 产品家族的单节点 Caffe 评分和 ...
- jquery validate表单验证插件-推荐
1 表单验证的准备工作 在开启长篇大论之前,首先将表单验证的效果展示给大家. 1.点击表单项,显示帮助提示 2.鼠标离开表单项时,开始校验元素 3.鼠标离开后的正确.错误提示及鼠标移入时的帮 ...
- 超简单——自己搭建ftp服务器
自己搭建ftp服务器 之所以没选择serv-u,一是因为收费,虽说网上有破解版,但是使用过程中发现破解版很不稳定,经常异常死掉,随后改选用免费的filezilla. 1软件获取 从百度搜索 FileZ ...
- [LeetCode] Android Unlock Patterns 安卓解锁模式
Given an Android 3x3 key lock screen and two integers m and n, where 1 ≤ m ≤ n ≤ 9, count the total ...
- [LeetCode] Path Sum II 二叉树路径之和之二
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...
- IDEA 中生成 Hibernate 逆向工程实践
谈起 Hibernate 应该得知道 Gavin King 大叔,他构建了 Hibernate ,并将其捐献给了开源社区. Hibernate 对象关系映射解决方案,为面向对象的领域模型到传统的关系型 ...
- Mybatis关联查询和数据库不一致问题分析与解决
Mybatis关联查询和数据库不一致问题分析与解决 本文的前提是,确定sql语句没有问题,确定在数据库中使用sql和项目中结果不一致. 在使用SpringMVC+Mybatis做多表关联时候,发现也不 ...
- GD库常用函数
创建句柄 imagecreate($width, $height) //新建图像 imagecreat ...
- NC6开发配置流程
1.功能注册 2.菜单注册 3.单据类型管理 4.单据模板初始化 5.查询模板初始化 6.功能节点默认模板设置 7.编码对象注册.编码规则定义