/*
区间操作,可以推一推式子,方差为平方的平均数-平均数的平方,维护区间和与区间平方和,平方和的维护方法类似,式子推一推就行了,注意约分
*/
#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. 开发管理系统时,安装sqlserver2005问题整理

    最近在为单位开发一个综合管理系统.但是由于时间的问题,有时候就把程序带回家进行修改.但是家里有没有环境,就把数据库文件和程序带回家,可是随之问题来了.要重新在家里陪着开发环境,vs2008非常快的就安 ...

  2. tst、cmp、bne、beq指令

    1.tst:逻辑处理指令,用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运算结果更新CPSR中条件标志位的值.当前运算结果为1,则Z=0:当前运算结果为0,则Z=1 cmp ...

  3. Url重写——伪静态实现

    简述: 在我们浏览网站的时候,很多都是以.html结尾的.难道这些都是静态网页么?其实不是的,它们很多是伪静态 那么什么是伪静态?顾名思义,就是假的静态页面.通过某种设置让你看成是静态的. Q:为何要 ...

  4. 【Git】关于VSCode 内置Git问题

    VSCode的内置git是自动关联本机git的, 所以当提交代码时,VSCode提示[警告:请配置git用户名和账户]时, 只需要在git bash 端配置git config --gobal use ...

  5. SQLSERVER 获取datetime日期的查询语句

    SELECT varchar(10:57AM SELECT varchar(CONVERT(100), GETDATE(), 2): 11.05.16 SELECT varchar(CONVERT(1 ...

  6. Python Logging模块的简单使用

    前言 日志是非常重要的,最近有接触到这个,所以系统的看一下Python这个模块的用法.本文即为Logging模块的用法简介,主要参考文章为Python官方文档,链接见参考列表. 另外,Python的H ...

  7. Github上的Watch和 Star的区别

    Github 推出了新的 Notification 系统,更改了原有的 Watch 机制,为代码库增加了 Star 操作.Notification 将接收 Watching 代码库的动态,包括:* I ...

  8. 使用charles V3.11.2 实现SSL抓包

    首先,确认开启了SSL选项: 然后到Help->SSL Proxying里查看帮助; 根据提示,将android手机连接到局域网的wifi上,然后将wifi连接的代理设置为192.168.21. ...

  9. oracle--游标--bai

    --复制表 create table emp as(select * from scott.emp); select * from emp; --(1) 最简单的游标 declare --声明并初始化 ...

  10. Android Automotive开发之一《环境: JDK7&JDK8切换 》

    http://ubuntuhandbook.org/index.php/2015/01/install-openjdk-8-ubuntu-14-04-12-04-lts/ 安装OpenJDK8 sud ...