博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[SNOI2017]一个简单的询问
阅读量:5146 次
发布时间:2019-06-13

本文共 2246 字,大约阅读时间需要 7 分钟。

写水题快乐一下

显然\(\operatorname{get(l_1,r_1,x)}\times \operatorname{get(l_2,r_2,x)}\)可以拆成

\(\operatorname{pre(r_1,x)}\times \operatorname{pre(r_2,x)}+\operatorname{pre(l_1-1,x)}\times \operatorname{pre(l_2-1,x)}\)减去\(\operatorname{pre(r_1,x)}\times \operatorname{pre(l_2-1,x)}+\operatorname{pre(r_2,x)}\times \operatorname{pre(l_1-1,x)}\)

\(\operatorname{pre(i,x)}\)表示\([1,i]\)\(x\)出现次数

显然我们把一个询问拆成四个,\(\operatorname{pre(l,x)}\times \operatorname{pre(r,x)}\)变成一组询问\(l,r\)即可,直接大力莫队莽

代码

#include 
#define re register#define LL long longinline int read() { char c = getchar(); int x = 0; while (c < '0' || c > '9') c = getchar(); while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + c - 48, c = getchar(); return x;}int a[50005], tax[50005], tmp[50005];struct Ask { int l, r, o, rk;} q[200005];int n, m, Q, sz;LL ans, Ans[50005];inline int cmp(const Ask &A, const Ask &B) { if (A.l / sz == B.l / sz) return A.r < B.r; return A.l < B.l;}inline void del(int x, int o) { ans -= 1ll * tax[a[x]] * tmp[a[x]]; tmp[a[x]] += o; ans += 1ll * tax[a[x]] * tmp[a[x]];}inline void add(int x, int o) { ans -= 1ll * tax[a[x]] * tmp[a[x]]; tax[a[x]] += o; ans += 1ll * tax[a[x]] * tmp[a[x]];}int main() { n = read(); for (re int i = 1; i <= n; i++) a[i] = read(); Q = read(); for (re int l1, l2, r1, r2, i = 1; i <= Q; i++) { l1 = read(), r1 = read(), l2 = read(), r2 = read(); q[++m] = (Ask){ r1, r2, 1, i }; if (l1 > 1 && l2 > 1) q[++m] = (Ask){ l1 - 1, l2 - 1, 1, i }; if (l2 > 1) q[++m] = (Ask){ r1, l2 - 1, -1, i }; if (l1 > 1) q[++m] = (Ask){ r2, l1 - 1, -1, i }; } for (re int i = 1; i <= m; i++) if (q[i].l > q[i].r) std::swap(q[i].l, q[i].r); sz = n / (std::sqrt(m)) + 1; std::sort(q + 1, q + m + 1, cmp); for (re int l = 0, r = 0, i = 1; i <= m; i++) { while (r < q[i].r) add(++r, 1); while (l > q[i].l) del(l--, -1); while (l < q[i].l) del(++l, 1); while (r > q[i].r) add(r--, -1); Ans[q[i].rk] += 1ll * q[i].o * ans; } for (re int i = 1; i <= Q; i++) printf("%lld\n", Ans[i]); return 0;}

转载于:https://www.cnblogs.com/asuldb/p/11351891.html

你可能感兴趣的文章
innodb的存储结构
查看>>
焦点控制
查看>>
python-文件读写操作
查看>>
P1129 [ZJOI2007]矩阵游戏 二分图匹配
查看>>
Git 内部原理之 Git 对象哈希
查看>>
Vue中引入TradingView制作K线图
查看>>
爱历史 - 朝代歌
查看>>
【笔记】Cocos2dx学习笔记
查看>>
PHP设计模式之:单例模式
查看>>
c++输出缓冲区刷新
查看>>
Linux查看CPU和内存使用情况总结
查看>>
session丢失问题
查看>>
Python 批量修改root密码
查看>>
ThinkSNS+ 基于 Laravel master 分支,从 1 到 0,再到 0.1
查看>>
WEB服务器:Apache、Tomcat、JBoss、WebLogic、Websphere、IIS的区别与关系
查看>>
软件工程 speedsnail 冲刺7
查看>>
虚拟机CentOS设置IP
查看>>
Django之ORM多对多表创建方式,AJAX异步提交,分页器组件等
查看>>
Django 之 rest_framework 响应器使用
查看>>
7.Django CSRF 中间件
查看>>