[题目链接]

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 ;
}

[YNOI 2016] 掉进兔子洞的更多相关文章

  1. [bzoj 4939][Ynoi 2016]掉进兔子洞

    传送门 Description 一个长为 n 的序列 a. 有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间剩下的数的个数和,询问独立. 注意这里删掉指的是一个一 ...

  2. luogu P4688 [Ynoi2016]掉进兔子洞 bitset 莫队

    题目链接 luogu P4688 [Ynoi2016]掉进兔子洞 题解 莫队维护bitset区间交个数 代码 // luogu-judger-enable-o2 #include<cmath&g ...

  3. loj #6201. 「YNOI2016」掉进兔子洞

    #6201. 「YNOI2016」掉进兔子洞 您正在打galgame,然后突然发现您今天太颓了,于是想写个数据结构题练练手: 给出一个长为 nnn 的序列 aaa. 有 mmm 个询问,每次询问三个区 ...

  4. YNOI2016:掉进兔子洞 (莫队+bitset)

    YNOI2016:掉进兔子洞 题意简述: 有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间剩下的数的个数和,询问独立. 注意这里删掉指的是一个一个删,不是把等于这 ...

  5. [Luogu 4688] [Ynoi2016]掉进兔子洞 (莫队+bitset)

    [Luogu 4688] [Ynoi2016]掉进兔子洞 (莫队+bitset) 题面 一个长为 n 的序列 a.有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间 ...

  6. BZOJ.4939.[Ynoi2016]掉进兔子洞(莫队 bitset 分组询问)

    BZOJ 洛谷 删掉的数即三个区间数的并,想到bitset:查多个区间的数,想到莫队. 考虑bitset的每一位如何对应每个数的不同出现次数.只要离散化后不去重,每次记录time就可以了. 但是如果对 ...

  7. 【bzoj4939】【YNOI2016】掉进兔子洞(莫队)

    题目描述 您正在打galgame,然后突然发现您今天太颓了,于是想写个数据结构题练练手: 一个长为 n 的序列 a. 有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个 ...

  8. BZOJ4939: [Ynoi2016]掉进兔子洞(莫队 bitset)

    题意 题目链接 一个长为 n 的序列 a. 有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间剩下的数的个数和,询问独立. 注意这里删掉指的是一个一个删,不是把等于 ...

  9. 【洛谷 P4688】 [Ynoi2016]掉进兔子洞(bitset,莫队)

    题目链接 第一道Ynoi 显然每次询问的答案为三个区间的长度和减去公共数字个数*3. 如果是公共数字种数的话就能用莫队+bitset存每个区间的状态,然后3个区间按位与就行了. 但现在是个数,bits ...

随机推荐

  1. 两点C#的propertyGrid的使用心得【转】

    源文:http://www.cnblogs.com/bicker/p/3318934.html 最近接触C#的PropertyGrid比较多,得到了两个小心得记录一下. 第1点是关于控制Propert ...

  2. HDU 4403 A very hard Aoshu problem (DFS暴力)

    题意:给你一个数字字符串.问在字符串中间加'='.'+'使得'='左右两边相等. 1212  : 1+2=1+2,   12=12. 12345666 : 12+3+45+6=66.  1+2+3+4 ...

  3. 广告制胜无它,顺应人性尔——leo鉴书63

    近期看了几本怎样写文案的书.对广告有了些兴趣.查了下相关销量排行,位置比較高的是本叫<科学的广告+我的广告生涯>的书,是同一作者(Claude C. Hopkins)两本书的合集.前者是他 ...

  4. Java IO 类

    IO包中绝大部分的类都是由以下四个类直接或间接继承来的InputStream OutputStream Reader 还有Writer 其中InputStream和OutputStream代表输入流和 ...

  5. POJ1830开关问题——gauss消元

    题目链接 分析: 第一个高斯消元题目,操作是异或.奇偶能够用0.1来表示,也就表示成bool类型的方程,操作是异或.和加法没有差别 题目中有两个未知量:每一个开关被按下的次数(0.1).每一个开关的转 ...

  6. switch中的case不加break执行情况

    输出结果:230 分析,switch先匹配一个case满足$a,然后执行case里面的语句,直到遇到break,否则一直往下执行 <?php $a = ; switch($a){ : echo ...

  7. 使用Entity Framework和WCF Ria Services开发SilverLight之6:查找指定字段

    对数据库表指定字段的查找,又是实际工作中的一项必要工作.SL客户端仅获取实际需要的指定的字段,好处很多,比如:有助于减少网络流量. 有两类这样的使用场景. 1:联表查询不需要外键表 在上一篇中,我们使 ...

  8. WPF触发器(Trigger、DataTrigger、EventTrigger)

    WPF中有种叫做触发器的东西(记住不是数据库的trigger哦).它的主要作用是根据trigger的不同条件来自动更改外观属性,或者执行动画等操作. WPFtrigger的主要类型有:Trigger. ...

  9. iOS设备控制打印机输出文本

    本文转载至 http://tec.5lulu.com/detail/108krn1e6e66m8sbd.html 让我们来看看是如何实现的吧,首先要知道打印机的ip地址,然后用socket通过打印机的 ...

  10. 【BZOJ4296】[PA2015]Mistrzostwa BFS

    [BZOJ4296][PA2015]Mistrzostwa Description 给定一张n个点m条边的无向图,请找到一个点数最多的点集S,满足:1.对于点集中任何一个点,它至少与d个点集中的点相邻 ...