/*
区间操作,可以推一推式子,方差为平方的平均数-平均数的平方,维护区间和与区间平方和,平方和的维护方法类似,式子推一推就行了,注意约分
*/
#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模拟赛 还教室的更多相关文章

  1. CH Round #52 还教室[线段树 方差]

    还教室 CH Round #52 - Thinking Bear #1 (NOIP模拟赛) [引子]还记得 NOIP 2012 提高组 Day2 中的借教室吗?时光飞逝,光阴荏苒,两年过去了,曾经借教 ...

  2. CH模拟赛 皇后游戏

    /* 做的时候手推了一下n=2的四种情况,再排一下序就可以了,证明不是很严谨,但我想这就行了,毕竟全是套路 */ #include<iostream> #include<cstdio ...

  3. CH模拟赛 拆地毯

    /* MST,注意只能加K条边,但是备选是M条边 */ #include<iostream> #include<cstdio> #include<string> # ...

  4. CH Round #52 - Thinking Bear #1 (NOIP模拟赛)

    A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...

  5. 模拟赛小结:2017 China Collegiate Programming Contest Final (CCPC-Final 2017)

    比赛链接:传送门 前期大顺风,2:30金区中游.后期开题乏力,掉到银尾.4:59绝杀I,但罚时太高卡在银首. Problem A - Dogs and Cages 00:09:45 (+) Solve ...

  6. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  7. CH Round #49 - Streaming #4 (NOIP模拟赛Day2)

    A.二叉树的的根 题目:http://www.contesthunter.org/contest/CH%20Round%20%2349%20-%20Streaming%20%234%20(NOIP 模 ...

  8. 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题, ...

  9. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

随机推荐

  1. [No0000A9]实用word用法

    目录  TOC \o "1-3" \h \z \u 三招去掉页眉那条横线.... PAGEREF _Toc465252982 \h 08D0C9EA79F9BACE118C8200 ...

  2. C#简单的对象交互

    在对象的世界里,一切皆为对象;对象与对象相互独立,互不干涉,但在一定外力的作用下对象开始共同努力 对象交互的实例 电视机大家都有吧,依照万物皆对象的思维模式来看,电视机可以是一个类,然后电视机有一些基 ...

  3. [LeetCode] Add and Search Word - Data structure design 添加和查找单词-数据结构设计

    Design a data structure that supports the following two operations: void addWord(word) bool search(w ...

  4. [LeetCode] Remove Duplicates from Sorted List II 移除有序链表中的重复项之二

    Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numb ...

  5. [LeetCode] Minimum Window Substring 最小窗口子串

    Given a string S and a string T, find the minimum window in S which will contain all the characters ...

  6. [转载]Web前端开发工程师编程能力飞升之路

    [背景] 如果你是刚进入web前端研发领域,想试试这潭水有多深,看这篇文章吧:如果你是做了两三年web产品前端研发,迷茫找不着提高之路,看这篇文章吧:如果你是四五年的前端开发高手,没有难题能难得住你的 ...

  7. Mongodb数据库学习系列————(一)Mongodb数据库主从复制的搭建

    Mongodb数据库主从复制的搭建 Writeby:lipeng                                    date:2014-10-22 最近项目上用到了位置查询,在网上 ...

  8. Angularjs+node+Mysql实现地图上的多点标注

    注:本文适合对于node有一定基础的人,如果您是小白,请先用1个小时学习node.node文档https://nodejs.org/en/docs/ 该片博文的源码地址:https://github. ...

  9. C++知识回顾(二)——名称空间

    随着工程的增大,名称相互冲突的肯能性增加,使用多个厂商的类库时,可能导致名称冲突.为了解决这些问题,需要用到名称空间. 为了将代码加入名称空间,可以使用namespae将其包含,例如,编写一段代码,其 ...

  10. Redis中connect与pconnect区别?

    1.首先先介绍下connect和pconnect的区别. connect:脚本结束之后连接就释放了. 2.pconnect:脚本结束之后连接不释放,连接保持在php-fpm进程中. 所以使用pconn ...