萌新妹子杀光卡常怪!!!
查看原帖
萌新妹子杀光卡常怪!!!
215915
lOpzIth楼主2023/7/26 16:25
#include<bits/stdc++.h>
#define int unsigned
#define Arr std::vector
#define Ptn std::pair
#define fi first
#define se second
#define eb emplace_back
#define pb push_back
const int N = 1e6 + 5;
const int M = 5e6 + 5;
int T, n, m, cnt, a[N], b[N], c[N], idT[N], val[N], add[N], head[N], L[M], id[M], nxt[M], ans[M];
class FastIostream {
	const int maxBF = 1 << 20;
	char *inbuf, *inst, *ined, *oubuf, *oust, *oued;
	void _flush() { fwrite(oubuf, 1, oued - oust, stdout); }
	char _getchar() {
		if (inst == ined) inst = inbuf, ined = inbuf + fread(inbuf, 1, maxBF, stdin);
		return inst == ined ? EOF : *inst++;
	} void _putchar(const char &c) {
		if (oued == oust + maxBF) _flush(), oued = oubuf;
		*oued++ = c;
	}
public:
	FastIostream() {
		inst = ined = inbuf = new char[maxBF];
		oust = oued = oubuf = new char[maxBF];
	} ~FastIostream() {_flush();}
	template <typename Int> FastIostream &operator>>(Int &n) {
		static char c;
		bool flag = false;
		while ((c = _getchar()) < '0' || c > '9') if (c == '-') flag = true;
		for (n = c - '0'; (c = _getchar()) >= '0' && c <= '9'; n = n * 10 + (c - 48));
		if (flag) n = ~n + 1;
		return *this;
	} template <typename Int> FastIostream &operator<<(Int n) {
		if (n < 0) _putchar('-'), n = ~n + 1;
		static char S[40];
		int t = 0;
		do {S[t++] = '0' + n % 10, n /= 10;} while (n);
		for (int i = 0; i < t; ++i) _putchar(S[t - i - 1]);
		return *this;
	} FastIostream &operator<<(const char *s) {
		for (int i = 0; s[i]; ++i) _putchar(s[i]);
		return *this;
	}
} io;

//inline int gcd(int x, int y) {return x ? gcd(y % x, x) : y;}

signed main()
{
    io >> n >> m;
    for (int i = 1; i <= n; i++) io >> a[i];
    for (int i = 1; i <= n; i++) io >> b[i];
    for (int i = 1; i <= n; i++) io >> c[i];
    for (int i = 1; i <= m; i++)
    {
        int l, r;
        io >> l >> r;
        if (!head[r]) head[r] = ++cnt, id[cnt] = i, L[cnt] = l;
        else id[++cnt] = i, nxt[cnt] = head[r], head[r] = cnt, L[cnt] = l;
    }
    for (int i = 1; i <= n; i++)
    {
        int p = i - 1;
        while (p != 0)
        {
            int t = std::__gcd(c[p], c[p + 1]);
            if ((a[p] & a[p + 1]) == a[p] && (b[p] | b[p + 1]) == b[p] && t == c[p]) break;
            a[p] = (a[p] & a[p + 1]), b[p] = (b[p] | b[p + 1]), c[p] = t;
            p--;
        }
        val[i] = val[i - 1] + add[i - 1] * (T - idT[i - 1]);
        int j = p + 1;
        for (; j + 3 <= i; j += 4)
        {
            val[j] = val[j] + add[j] * (T - idT[j]);
            add[j] = add[j - 1] + a[j] * b[j] * c[j];
            idT[j] = T;
            val[j + 1] = val[j + 1] + add[j + 1] * (T - idT[j + 1]);
            add[j + 1] = add[j] + a[j + 1] * b[j + 1] * c[j + 1];
            idT[j + 1] = T;
            val[j + 2] = val[j + 2] + add[j + 2] * (T - idT[j + 2]);
            add[j + 2] = add[j + 1] + a[j + 2] * b[j + 2] * c[j + 2];
            idT[j + 2] = T;
            val[j + 3] = val[j + 3] + add[j + 3] * (T - idT[j + 3]);
            add[j + 3] = add[j + 2] + a[j + 3] * b[j + 3] * c[j + 3];
            idT[j + 3] = T;
        }
        if (j > i) j -= 4;
        for (; j <= i; j++) 
        {
            val[j] = val[j] + add[j] * (T - idT[j]);
            add[j] = add[j - 1] + a[j] * b[j] * c[j];
            idT[j] = T;
        }
        T++;
        for (int lop = head[i]; lop; lop = nxt[lop]) 
        {
            int Id = id[lop], l = L[lop];
            ans[Id] = val[i] + add[i] * (T - idT[i]) - val[l - 1] - add[l - 1] * (T - idT[l - 1]);
        }
    }
    for (int i = 1; i <= m; i++) io << ans[i] << "\n";
    return 0;
}

最慢点差0.05s

2023/7/26 16:25
加载中...