$$ \newcommand{\seq}[2]{{#1}_{1},{#1}_{2},\cdots,{#1}_{#2}} \newcommand{\num}[1]{1,2,\cdots,#1} \newcommand{\stra}[2]{\begin{bmatrix}#1 \\ #2\end{bmatrix}} \newcommand{\strb}[2]{\begin{Bmatrix}#1 \\ #2\end{Bmatrix}} \newcommand{\dw}[1]{\underline{#1}} \newcommand{\up}[1]{\overline{#1}} $$

Codeforces 447

447 D

题意

\(n*m\) 的矩阵, \(k\) 次操作:

  1. 给每一行减掉 \(p\)
  2. 给每一列减掉 \(p\)

求操作后矩阵所有元素总和的最大可能值。(\(1 ≤ n, m ≤ 10^3; 1 ≤ k ≤ 10^6; 1 ≤ p ≤ 100\))

Examples

Input
2 2 2 2
1 3
2 4
Output
11
Input
2 2 5 2
1 3
2 4
Output
11

先预处理出①只操作行,且只操作 \(i\) 次②只操作列,且只操作 \(i\) 次( \(i\in [1,10^6]\)
然后丢到priority_queue贪心一波就行

447 E

题意

一个序列,两种操作

  1. 给区间 \([l,r]\) 的每个元素 \(a_i\) 依次加上 \(f_{i-l+1}\) ( \(f_i\) 为斐波那契数列第 \(i\) 项, \(f_1=f_2=1,f_3=2\) )
  2. 询问区间的和

\((1\le n\le 300000)\)\(\% 10^9+9\)

Examples

Input
4 4
1 2 3 4
1 1 4
2 1 4
1 2 4
2 1 3
Output
17
12

线段树

Code

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define maxn 300010
#define mod 1000000009ll
#define INF 100000000000000000ll
using namespace std;
typedef long long D;
template<typename tp>
void read(tp& x){
	x=0;
	char c=getchar();
	bool sgn=0;
	while((c<'0'||c>'9')&&c!='-')c=getchar();
	if(c=='-')sgn=1,c=getchar();
	while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();
	if(sgn)x=-x;
}
template<typename tp>
void write(tp x){
	if(x<0)putchar('-'),write(-x);
	else{
		if(x>=10)write(x/10);
		putchar(x%10+'0');
	}
}
D n,m;
D f[maxn],t[maxn<<2];
D z[maxn<<2][2];
D L(D x){return x>=mod?x%mod:x;}
void build(D p,D l,D r){
	z[p][0]=z[p][1]=0;
	if(l==r){
		scanf("%lld",&t[p]);
		return;
	}
	D mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	t[p]=L(t[p<<1]+t[p<<1|1]);
}
D get(D A,D B,D i){
    return i==1?A:L(L(f[i-2]*A)+L(f[i-1]*B));
}
D sum(D A,D B,D i){
    return L(mod+get(A,B,i+2)-B);
}
D sum(D A,D B,D l,D r){
    return L(mod+sum(A,B,r)-sum(A,B,l-1));
}
void pushdown(D p,D l,D r){
	if(l==r){z[p][0]=z[p][1]=0;return;}
	if(z[p][0]&&z[p][1]){
		D mid=(l+r)>>1;
        t[p<<1]=L(t[p<<1]+sum(z[p][0],z[p][1],1,mid-l+1));
        t[p<<1|1]=L(t[p<<1|1]+sum(z[p][0],z[p][1],mid-l+2,r-l+1));
        z[p<<1][0]=L(z[p<<1][0]+z[p][0]);
        z[p<<1][1]=L(z[p<<1][1]+z[p][1]);
        z[p<<1|1][0]=L(z[p<<1|1][0]+get(z[p][0],z[p][1],mid-l+2));
        z[p<<1|1][1]=L(z[p<<1|1][1]+get(z[p][0],z[p][1],mid-l+3));
        z[p][0]=z[p][1]=0;
	}
}
void add(D p,D l,D r,D seg_l,D seg_r,D k){
	pushdown(p,l,r);
	if(seg_l<=l&&r<=seg_r){
        z[p][0]=f[l-k+1],z[p][1]=f[l-k+2];
        t[p]=L(t[p]+sum(z[p][0],z[p][1],1,r-l+1));
        return;
	}
	D mid=(l+r)>>1;
    if(seg_l<=mid)add(p<<1,l,mid,seg_l,seg_r,k);
    if(seg_r>mid)add(p<<1|1,mid+1,r,seg_l,seg_r,k);
    t[p]=L(t[p<<1]+t[p<<1|1]);
}
D query(D p,D l,D r,D seg_l,D seg_r){
    pushdown(p,l,r);
    if(seg_l<=l&&r<=seg_r){
        return t[p];
    }
    D mid=(l+r)>>1;
    D ret=0;
    if(seg_l<=mid)ret=L(ret+query(p<<1,l,mid,seg_l,seg_r));
    if(seg_r>mid)ret=L(ret+query(p<<1|1,mid+1,r,seg_l,seg_r));
    return ret;
}
signed main(){
	read(n);read(m);
	f[1]=f[2]=1;
	for(D i=3;i<maxn;i++){
		f[i]=L(f[i-1]+f[i-2]);
	}
	build(1,1,n);
	while(m--){
		D mo,l,r;
		read(mo);read(l);read(r);
		if(mo==1){
            add(1,1,n,l,r,l);
		}
		else{
            write(query(1,1,n,l,r));
            putchar('\n');
		}
	}
	return 0;
}
posted @ 2019-02-12 17:58  chc_1234567890  阅读(215)  评论(0编辑  收藏  举报