小本本需记录:to_do list 今日明日的任务,完成情况,积分情况

7:00--7:30 回顾昨日笔记与算法,确立今日学习目标 && 打鸡血(回顾人生,展望人生)

7:40--8:20 查找今日所需资料,制定目标,设置完每一个自由安排的番茄钟
(有想要做的顺延到明天的to_do list)

8:30--9:00 树状数组

https://www.cnblogs.com/RabbitHu/p/BIT.html#4321088

9:00--9:30

tarjan系列算法代码小结

https://www.cnblogs.com/zwfymqz/p/8480778.html

10:10--10:50 差分约束

https://www.cnblogs.com/zwfymqz/p/8515897.html

11:00-- 11:40 夜深人静写算法

https://blog.csdn.net/WhereIsHeroFrom/article/details/78969718

11:40--12:00
折线分割
https://blog.csdn.net/qq_34131212/article/details/78043679

中午:

  • 看lyd tarjan
  • 看主席树

14:30--15:10 模板4个

  • 线段树.2.
  • 主席树(回寝室学习)

15:20--15:50 线段树 (咕咕咕)

https://www.cnblogs.com/cjyyb/p/8567674.html

15:50--16:20 线段树
https://www.cnblogs.com/cjyyb/p/8567674.html

16:20--17:00 2-SAT问题

https://www.cnblogs.com/zwfymqz/p/8485365.html

17:00--18:00 莫队
https://www.cnblogs.com/RabbitHu/p/MoDuiTutorial.html

18:00--18:20 matrix
https://www.guokr.com/i/0376718656/articles/

18:30--19:00 bilibili Friends

晚上
19:00--20:00 两道noip原题(一道数据结构一道搜索)
https://www.cnblogs.com/fengxunling/p/9565047.html

20:00--20:30 拓展阅读
https://www.cnblogs.com/fengxunling/p/10363327.html

20:30--21:00 写博客 && 清理所学。【明得失,清理不足,不能盲目刷题】

21:00--21:30 遗忘曲线

21:30--22:10 刷今日遗留问题

回寝后,变身文艺青年,一首古诗词。

最小瓶颈路
https://www.cnblogs.com/zwfymqz/p/9717129.html

pomorodo to-do list

C +1 二维的树状数组未搞定

C +1 点双,边双未搞完

B +3 P2194 HXY烧情侣

P3916 【图的遍历】

可以采用反向建边,从最大的点开始dfs

我们考虑每次从所剩点中最大的一个点出发,我们暂且称它为i,而凡是i这个点所能到达的点,可以到达的点最大都是i。

在遍历的时候按n——>1的顺序

因为是从大到小遍历,故每个点第一次被碰到的i一定是这个点最大可到达的点

用树状数组区间修改区间查询:

/*
translation:

solution:

trigger:

note:
    *
date:
    2019.08.16
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define dwn(i,a,b) for(int i=a;i>=b;--i)
template <typename T> inline void rd(T &x){x=0;char c=getchar();int f=0;while(!isdigit(c)){f|=c=='-';c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}x=f?-x:x;}
#define mem(a,b) memset(a,b,sizeof(a))
#define ee(i,x) for(int i=head[x];i;i=e[i].next)

#define N 500010

int n,m;
int tr1[N],tr2[N];

void add(int x,int k){
    for(int i=x;i<=n;i+=(-i)&i)
        tr1[i]+=k,tr2[i]+=k*x;
}

int query(int x){
    int res=0;
    for(int i=x;i;i-=(-i)&i)
        res+=(x+1)*tr1[i]-tr2[i];
    return res;
}

signed main(){
    rd(n),rd(m);
    int last=0,now;
    rep(i,1,n){
        rd(now);
        add(i,now-last);//////////////////////////////
        last=now;
    }
    rep(i,1,m){
        int op,x,y,k;
        rd(op);
        if(op==1){
            rd(x),rd(y),rd(k);
            add(x,k),add(y+1,-k);
        }
        else if(op==2){
            rd(x),rd(y);
            printf("%lld\n",query(y)-query(x-1));
        }
    }
}
01-22 09:10