[BZOJ4085][Sdoi2015]quality && 线段树 (TLE)

线段树维护F[ai-1], F[ai-1 + 1], F[ai-1 - 1], F[ai+1], F[ai+1 + 1], F[ai+1 - 1]

以及两两乘积和

加一的时候可以直接用递推式用保存的F值求出新的值

减一的时候也可以解方程求值

然后 写码农题

然而此题常数太卡 在jzoj上都600ms了 BZ上还是过不去 弃疗了

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<iostream>
#define SF scanf
#define PF printf
using namespace std;
typedef int LL;
inline int read() {
    int x=0,f=1; char ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=getchar(); }
    while(ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar(); }
    return x*f;
}
const int MOD = 1000000007;
const int MAXN = 300000;
int a, b, n, m, inv, L, R, Y, Z;
int p[MAXN+10][4];
int pow_mod(int x, int k) {
    int ret = 1;
    while(k) {
        if(k & 1) ret = 1LL * ret * x % MOD;
        x = 1LL * x * x % MOD;
        k >>= 1;
    }
    return ret;
}
struct Matrix {
    int a[3][3], r, c;
    void set(int n) {
        memset(a, 0, sizeof(a));
        r = c = n;
        for(int i = 0; i < n; i++) a[i][i] = 1;
    }
    Matrix operator * (const Matrix &t) const {
        Matrix ret; memset(ret.a, 0, sizeof(ret.a));
        ret.r = r; ret.c = t.c;
        for(int i = 0; i < r; i++)
            for(int k = 0; k < c; k++)
                for(int j 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值