萌新求助,为什么我大的数据过了小的挂了?
  • 板块学术版
  • 楼主zhoukangyang
  • 当前回复5
  • 已保存回复5
  • 发布时间2020/7/25 18:02
  • 上次更新2023/11/6 22:18:18
查看原帖
萌新求助,为什么我大的数据过了小的挂了?
173660
zhoukangyang楼主2020/7/25 18:02
#include<bits/stdc++.h>
#define N 2100000
#define int long long
using namespace std;
const int mod = 1e9+7;
#define G(a) putchar(a+48)
inline void write(int s) {
	if (s>9) write(s/10);
	G(s%10);
}
inline int read() {
	char c=getchar();
	int x=0,f=1;
	while(c<'0'||c>'9') {
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9') {
		x=(x<<3)+(x<<1)+c-'0';
		c=getchar();
	}
	return x*f;
}
int qpow(int x, int y) {
    int res = 1;
    while(y) {
        if(y & 1) res = 1ll * res * x % mod;
        x = 1ll * x * x % mod, y >>= 1;
    }
    return res;
} 
int ny(int x) {
    return qpow(x, mod-2);
}
int lowbit(int x) {
    return x & -x;
}
int n, m, a[N], power[N];
struct node {
	int szsz[N];
    void build() {
        for(int i = 1; i <= n; i++) 
            if(i+lowbit(i) <= n) 
                szsz[i+lowbit(i)] = (szsz[i+lowbit(i)]+szsz[i]) % mod;
    } 
	void add(int x,int val) {
		if(x<=0) return;
		while(x <= n) szsz[x] = (szsz[x] + val) % mod, x += lowbit(x);
	}
	int qzh(int x) {
		int Ans = 0;
		for(int i = x; i != 0; i -= lowbit(i)) Ans = (szsz[i] + Ans) % mod;
		return Ans;
	}
    int query(int l, int r) {
        return (qzh(r) - qzh(l-1) + mod) % mod;
    }
} qwq;
int minn[N<<2];
void build(int L, int R, int id) {
    int mid = (L+R) / 2;
    if(L == R) {
        minn[id] = a[L];
        return;
    }
    build(L,mid,id*2), build(mid+1, R, id*2+1);
    minn[id] = min(minn[id<<1], minn[id<<1|1]);
} 
int query(int L, int R, int l, int r, int id) {
    int mid = (L+R) / 2;
    if(L == l && R == r) return minn[id];
    else if(r <= mid) return query(L, mid, l, r, id*2);
    else if(l > mid) return query(mid+1, R, l, r, id*2+1);
    else return min(query(L, mid, l, mid, id*2), query(mid+1, R, mid+1, r, id*2+1));
}
void xg(int L, int R, int x, int y, int id) {
    int mid = (L+R) / 2;
    if(L == R) minn[id] = y;
    else {
        if(x <= mid) xg(L, mid, x, y, id*2);
        else xg(mid+1, R, x, y, id*2+1);
        minn[id] = min(minn[id*2], minn[id*2+1]);
    }
}
signed main() {
    power[0] = 1;
    int opt, la, lb, ra, rb;
    n = read(), m = read();
    for(int i = 1; i <= n; ++i) power[i] = 1ll * 998244353 * power[i-1] % mod;
    for(int i = 1; i <= n; ++i) a[i] = read();
    for(int i = 1; i <= n; ++i) qwq.szsz[i] = 1ll * power[a[i]] % mod;
    build(1, n, 1), qwq.build();
    while(m--) {
        opt = read();
        if(opt) { // 查询  
            la = read(), ra = read(), lb = read(), rb = read();
            int cha = query(1,n,la,ra,1); // 最低位
            int chb = query(1,n,lb,rb,1); // 最低位
            int ansa = qwq.query(la, ra), ansb = qwq.query(lb, rb);
            ansa = 1ll * ansa * ny(power[cha]) % mod;
            ansb = 1ll * ansb * ny(power[chb]) % mod;
            if(ansa != ansb) printf("NO\n");
            else printf("YES\n");
        }
        else {
            la = read(), lb = read();
            xg(1, n, la, lb, 1);
            qwq.add(la, 1ll * (mod - 1) * power[a[la]] % mod); 
            a[la] = lb;
            qwq.add(la, 1ll * power[a[la]] % mod);
        }
    }
    return 0;
}
2020/7/25 18:02
加载中...