还教室 CH Round #52 - Thinking Bear #1 (NOIP模拟赛)

【引子】
还记得 NOIP 2012 提高组 Day2 中的借教室吗?时光飞逝,光阴荏苒,两年
过去了,曾经借教室的同学们纷纷归还自己当初租借的教室。请你来解决类似于
借教室的另一个问题。
【问题描述】
在接受借教室请求的 n 天中,第 i 天剩余的教室为 a i 个。作为大学借教室服
务的负责人,你需要完成如下三种操作共 m 次:
① 第 l 天到第 r 天,每天被归还 d 个教室。
② 询问第 l 天到第 r 天教室个数的平均数。
③ 询问第 l 天到第 r 天教室个数的方差。
【输入格式】
第一行包括两个正整数 n 和 m,其中 n 为借教室的天数,m 为操作次数。
接下来一行, 共包含 n 个整数, 第 i 个整数表示第 i 天剩余教室数目为 a i 个。
接下来 m 行,每行的第一个整数为操作编号(只能为 1 或 2 或 3) ,接下来
包含两个正整数 l 和 r,若操作编号为 1,则接下来再包含一个正整数 d。
【输出格式】
对于每个操作 2 和操作 3,输出一个既约分数(分子与分母互质)表示询问
的答案(详见样例) 。若答案为 0,请输出“0/1” (不含引号) 。
【样例输入】
5 4
1 2 3 4 5
1 1 2 3
2 2 4
3 2 4
3 1 5
【样例输出】
4/1
2/3
14/25


推导一下方差

D(X)=E(X^2)-E^2(X)

线段树维护区间和和区间平方和

区间平方和 t[o].s2+=d*d*(r-l+1)+2*d*t[o].s

PS:r-l+1的平方爆int了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
;
#define m (l+r)/2
#define lson o<<1,l,m
#define rson o<<1|1,m+1,r
#define lc o<<1
#define rc o<<1|1
typedef long long ll;
inline int read(){
    ,f=;
    ;c=getchar();}
    +c-';c=getchar();}
    return x*f;
}
int n,q,flag,l,r; ll d;
struct node{
    ll s,s2,lazy;
}t[N<<];
inline void paint(int o,int l,int r,ll d){
    t[o].lazy+=d;
    t[o].s2+=d*d*(r-l+)+*d*t[o].s;
    t[o].s+=d*(r-l+);
}
inline void merge(int o){
    t[o].s=t[lc].s+t[rc].s;
    t[o].s2=t[lc].s2+t[rc].s2;
}
inline void pushDown(int o,int l,int r){
    if(t[o].lazy){
        ll d=t[o].lazy;
        paint(lson,d);
        paint(rson,d);
        t[o].lazy=;
    }
}
void build(int o,int l,int r){
    if(l==r) {ll a=read();t[o].s=a;t[o].s2=a*a;}
    else{
        build(lson);
        build(rson);
        merge(o);
    }
}
void add(int o,int l,int r,int ql,int qr,ll d){
    if(ql<=l&&r<=qr) paint(o,l,r,d);
    else{
        pushDown(o,l,r);
        if(ql<=m) add(lson,ql,qr,d);
        if(m<qr) add(rson,ql,qr,d);
        merge(o);
    }
}
ll query1(int o,int l,int r,int ql,int qr){
    if(ql<=l&&r<=qr) return t[o].s;
    else{
        pushDown(o,l,r);
        ll ans=;
        if(ql<=m) ans+=query1(lson,ql,qr);
        if(m<qr) ans+=query1(rson,ql,qr);
        return ans;
    }
}
ll query2(int o,int l,int r,int ql,int qr){
    if(ql<=l&&r<=qr) return t[o].s2;
    else{
        pushDown(o,l,r);
        ll ans=;
        if(ql<=m) ans+=query2(lson,ql,qr);
        if(m<qr) ans+=query2(rson,ql,qr);
        return ans;
    }
}
inline ll gcd(ll a,ll b){?a:gcd(b,a%b);}
void print(ll x,ll y){
    ll g=gcd(x,y);
    printf("%lld/%lld\n",x/g,y/g);
}
int main(){
    n=read();q=read();
    build(,,n);
    ;i<=q;i++){
        flag=read();l=read();r=read();
        ){d=read();add(,,n,l,r,d);}
        ){
            ll x=query1(,,n,l,r),len=r-l+;
            print(x,len);
        }else{
            ll x1=query1(,,n,l,r),x2=query2(,,n,l,r),len=r-l+;//printf("hi %lld %lld\n",x1,x2);
            print(len*x2-x1*x1,len*len);
        }
    }
}

CH Round #52 还教室[线段树 方差]的更多相关文章

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

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

  2. NOIP2012借教室[线段树|离线 差分 二分答案]

    题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自 ...

  3. noip 借教室 线段树95分做法

    大致的思路是用线段树维护每个区间内部的最小值 段更新最小值 每次查某个区间的最小值是否满足租借要求 满足就借出去 update最小值 注意pushdown操作  还有一个从子区间提取答案的操作 提交地 ...

  4. Codeforces Round #218 (Div. 2) (线段树区间处理)

    A,B大水题,不过B题逗比了题意没理解清楚,讲的太不清楚了感觉= =还是英语弱,白白错了两发. C: 二分答案判断是否可行,也逗比了下...二分的上界开太大导致爆long long了...   D: ...

  5. CH模拟赛 还教室

    /* 区间操作,可以推一推式子,方差为平方的平均数-平均数的平方,维护区间和与区间平方和,平方和的维护方法类似,式子推一推就行了,注意约分 */ #include<iostream> #i ...

  6. CH Round #72树洞[二分答案 DFS&amp;&amp;BFS]

    树洞 CH Round #72 - NOIP夏季划水赛 描述 在一片栖息地上有N棵树,每棵树下住着一只兔子,有M条路径连接这些树.更特殊地是,只有一棵树有3条或更多的路径与它相连,其它的树只有1条或2 ...

  7. Bestcoder round #65 &amp;&amp; hdu 5592 ZYB&#39;s Premutation 线段树

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submissio ...

  8. Educational Codeforces Round 6 E. New Year Tree dfs+线段树

    题目链接:http://codeforces.com/contest/620/problem/E E. New Year Tree time limit per test 3 seconds memo ...

  9. 线段树 Codeforces Round #197 (Div. 2) D. Xenia and Bit Operations

    题目传送门 /* 线段树的单点更新:有一个交叉更新,若rank=1,or:rank=0,xor 详细解释:http://www.xuebuyuan.com/1154895.html */ #inclu ...

随机推荐

  1. ASP.NET常用页面指令

    1.<%@Page "属性"="值"%>指令 AutoEventWireup:指定页的事件是否自动绑定,默认值true为启用自动绑定. CodeBe ...

  2. React事件属性

    一.简介 二.滚动例子,滚动改变颜色 <!DOCTYPE html> <html lang="zh-cn"> <head> <meta c ...

  3. 剑指Offer24 复杂链表的复制

    /************************************************************************* > File Name: 24_Comple ...

  4. C# 自己对delegate的总结和认识

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. 我的第一个 Rails 站点:极简优雅的笔记工具-Raysnote

    出于公司开发需求,这个暑假我開始搞Ruby on Rails.在业余时间捣鼓了一个在线笔记应用:http://raysnote.com.这是一个极简而优雅的笔记站点(至少我个人这么觉得的). 笔记支持 ...

  6. 数据结构 : Hash Table

    http://www.cnblogs.com/lucifer1982/archive/2008/06/18/1224319.html 作者:Angel Lucifer 引子 这篇仍然不讲并行/并发. ...

  7. Javascript基础(2)

    开始更咯~~~嘻嘻. ---------------------------------------------------------------------------------- 异常捕获:即 ...

  8. Fedora15下搭建QT开发环境及编译QT

    看了不少linux上编译qt的文章,实际上直接通过yum 安装qt是最方便的,请参考<yum安装qt> 不过初步接触fedora,为了了解一下如何在linux上编译.安装开源代码,所以必须 ...

  9. [CLR via C#]1.5 本地代码生成器:NGen.exe

    原文:[CLR via C#]1.5 本地代码生成器:NGen.exe 1. NGen.exe工具,可以在一个程序安装到用户计算机时,将IL代码编译成为本地代码.由于代码在安装时已经编译好,所以CLR ...

  10. Eclipse的WorkingSet使用(转载)

    Eclipse作为一款流行的JavaIDE开发工具,其有很多好用的功能为我们的开发提供帮助.但我们的工作空间中有很多项目时,管理起来就很头疼了. 但是我们又不想更换工作区间,所以我们需要一个更加有效的 ...