[题目链接]

https://www.lydsy.com/JudgeOnline/problem.php?id=4939

[算法]

不难发现 ,

ansi = (r1 - l1 + 1) + (r2 - l2 + 1) + (r3 - l3 + 1) - sigma(min(cnt1i , cnt2i , cnt3i))

bitset + 莫队即可

时间复杂度 : O(Nsqrt(N) / 32)

[代码]

#include<bits/stdc++.h>
using namespace std;
#define N 100010
#define TT 25000
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull; struct query
{
int l , r;
int id;
} q[N]; int n , m , sz;
int cnt[N] , block[N] , ans[N] , l1[N] , r1[N] , l2[N] , r2[N] , l3[N] , r3[N] , a[N] , b[N];
bool vis[N];
bitset< N > tmp , f[TT + ]; template <typename T> inline void chkmin(T &x , T y) { x = min(x , y); }
template <typename T> inline void chkmax(T &x , T y) { x = max(x , y); }
template <typename T> inline void read(T &x)
{
T f = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
x *= f;
}
inline void add(int x)
{
tmp[a[x] + cnt[a[x]]] = ;
++cnt[a[x]];
}
inline void dec(int x)
{
tmp[a[x] + cnt[a[x]] - ] = ;
--cnt[a[x]];
}
inline bool cmp(query a , query b)
{
if (block[a.l] == block[b.l]) return a.r < b.r;
else return a.l < b.l;
}
inline void solve(int l , int r)
{
tmp.reset();
memset(cnt , , sizeof(cnt));
memset(vis , false , sizeof(vis));
int len = ;
for (int i = ; i <= TT; i++) f[i].reset();
for (int i = l; i <= r; i++)
{
q[++len] = (query){l1[i] , r1[i] , i};
ans[i] += r1[i] - l1[i] + ;
q[++len] = (query){l2[i] , r2[i] , i};
ans[i] += r2[i] - l2[i] + ;
q[++len] = (query){l3[i] , r3[i] , i};
ans[i] += r3[i] - l3[i] + ;
}
sort(q + , q + len + , cmp);
int L = q[].l , R = q[].l - ;
for (int i = ; i <= len; i++)
{
while (R < q[i].r)
{
add(R + );
++R;
}
while (R > q[i].r)
{
dec(R);
--R;
}
while (L < q[i].l)
{
dec(L);
++L;
}
while (L > q[i].l)
{
add(L - );
--L;
}
if (!vis[q[i].id - l + ])
{
vis[q[i].id - l + ] = true;
f[q[i].id - l + ] = tmp;
} else f[q[i].id - l + ] &= tmp;
}
for (int i = l; i <= r; i++)
ans[i] -= f[i - l + ].count() * ;
} int main()
{ read(n); read(m);
int size = (int)sqrt(n) + ;
for (int i = ; i <= n; i++) block[i] = (i - ) / size + ;
for (int i = ; i <= n; i++)
{
read(a[i]);
b[i] = a[i];
}
sort(b + , b + n + );
for (int i = ; i <= n; i++) a[i] = lower_bound(b + , b + n + , a[i]) - b;
for (int i = ; i <= m; i++)
{
read(l1[i]); read(r1[i]);
read(l2[i]); read(r2[i]);
read(l3[i]); read(r3[i]); }
for (int i = ; i <= m; i += TT) solve(i , min(i + TT - , m));
for (int i = ; i <= m; i++) printf("%d\n" , ans[i]); return ;
}

最新文章

  1. 杂物 git rebase
  2. IO-同步,异步,阻塞,非阻塞
  3. [CareerCup] 4.8 Contain Tree 包含树
  4. Jquery-获取父级元素parent
  5. Altium Designer Summer 09创建半圆焊盘方法
  6. Apache Solr采用Java开发、基于Lucene的全文搜索服务器
  7. 通过虚拟机VMware来练习安装ESXi
  8. 【C语言探险】 第四课的第二部分:串
  9. UVA - 11270 轮廓线DP
  10. Node入门教程(3)第二章: Node 安装
  11. Unity3D各平台Application.xxxPath的路径
  12. Codeforces Round #527 (Div. 3) C. Prefixes and Suffixes
  13. css 蒙层
  14. Win10系列:C#应用控件基础10
  15. How to distinguish between strings in heap or literals?
  16. python 全栈开发,Day72(昨日作业讲解,昨日内容回顾,Django多表创建)
  17. Iframe高度自适应(兼容IE/Firefox、同域/跨域)
  18. docker-dockerfile使用
  19. caffe中的Accuracy+softmaxWithLoss
  20. LINUX下PHP安装VLD扩展并测试OK

热门文章

  1. 转:Android IOS WebRTC 音视频开发总结 (系列文章集合)
  2. servlet基础梳理(一)
  3. Eclipse 教程
  4. Android SDK下载速度慢的解决方法(简单使用代理)
  5. 工作总结 mvc 调页面传参数 参数值会一直保存 在这个页面上的
  6. Windows socket I/O模型 之 select(2)
  7. systemd、upstart和system V
  8. 轻松搞定RabbitMQ(二)——工作队列之消息分发机制
  9. [概率dp] hdu 5378 Leader in Tree Land
  10. Ubuntu 15.10