颜色
颜色
题目描述
给定一个长度为
接下来给出
输入格式
第
分别代表序列长度,颜色总数和询问总数。
第
第
输出格式
总共
样例 #1
样例输入 #1
4 2 3 1 1 2 2 1 4 1 2 10 11 9 10 3 0 0 0
样例输出 #1
8 2 0
提示
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<vector> using namespace std; int n, m, q, block; int c[5211314], pos[5211314]; int pre[102][102][13140 * 2], sum[102][13140 * 2]; 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 << 1) + (x << 3) + (ch - '0'); ch = getchar(); } return x * f; } inline void Pretreatment() { for (int k = 1; k <= 20001; ++ k) { for(int i = 1; i <= pos[n]; ++ i) { sum[i][k] += sum[i - 1][k]; //sum[i][k]表示前i个块有几个k } } for (int i = 1; i <= pos[n]; ++ i) { for (int j = i; j <= pos[n]; ++ j) { for(int k = 1; k <= 20001; ++ k) { pre[i][j][k] = pow((sum[j][k] - sum[i - 1][k]), 2) + pre[i][j][k - 1]; //pre[i][j][k]表示i到j的块中1到k的权值总和 } } } return; } inline int Ask(int lift, int right, int minn, int maxn) { int l = pos[lift], r = pos[right], nowans = 0, temp[20001] = {}; if (l == r) { for (int i = lift; i <= right; ++ i) { if (c[i] >= minn && c[i] <= maxn) { //注意判断 nowans = nowans + 2 * temp[c[i]] * 1 + 1 * 1; //(a+b)^2 = a^2 + 2*a*b + b^2 其中temp[c[i]]是a,新加的1是b //下一次的a要加1 temp[c[i]] += 1; } } return nowans; } else { nowans = nowans + (pre[l + 1][r - 1][maxn] - pre[l + 1][r - 1][minn - 1]); for (int i = lift; i <= l * block; ++ i) { if (c[i] < minn || c[i] > maxn) continue; if (temp[c[i]] == 0) { temp[c[i]] = sum[r - 1][c[i]] - sum[l][c[i]]; } nowans = nowans + 2 * temp[c[i]] * 1 + 1 * 1; temp[c[i]] ++; } for (int i = (r - 1) * block + 1; i <= right; ++ i) { if (c[i] < minn|| c[i] > maxn) continue; if (temp[c[i]] == 0) { temp[c[i]] = sum[r - 1][c[i]] - sum[l][c[i]]; } nowans = nowans + 2 * temp[c[i]] * 1 + 1 * 1; temp[c[i]] ++; } return nowans; } } int main() { n = read(); m = read(); q = read(); block = 1000; for (int i = 1; i <= n; ++ i) { c[i] = read(); pos[i] = (i - 1) / block + 1; sum[pos[i]][c[i]] ++; } Pretreatment(); int ans = 0; for (int i = 1, l, r, a, b; i <= q; ++ i) { l = read(), r = read(); a = read(), b = read(); l ^= ans, r ^= ans, a ^= ans, b ^= ans; if (l > r) swap(l, r); if (a > b) swap(a, b); ans = Ask(l, r, a, b); printf("%d\n",ans); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现