noi.ac #553 序列
【题目描述】
老虎和蒜头是好朋友。
众所周知,蒜头经常给老虎出一些题目,而老虎也常常被难倒,作为捧杯之王的老虎难免心有怨怼。今天,老虎发现了蒜头的一个序列 a 。虽然老虎不知道这个序列是用来做什么的,但老虎还是希望搞点破坏——他计划把序列 a 全部变成 0 。
然而,对蒜头的序列进行操作绝不是容易的事情。具体来说,老虎每次可以选择两个位置 i,j(i≠j) ,将 ai 和 aj 变为 ai⊕aj,其中 ⊕ 是异或操作。
然而,只将蒜头的一个序列变成 0 实在是不够解气。因此,老虎希望你能够对于 m 组询问 l,r ,告诉老虎对于该序列的一个子序列 al,al+1,…,ar,最少需要操作几次才能将该序列变为全 0 序列。
【输入格式】
输入的第一行包括两个正整数 n,m ,表示序列的长度和询问的次数。
接下来 m 行,每行两个正整数 li,ri ,表示一组询问。
【输出格式】
输出共 m 行,每行一个数,表示该组询问最少的操作次数。
【样例数据】
input
5 3
3 3 3 3 5
1 5
2 3
3 5
output
4
1
3
【数据范围】
对于 100% 的数据,0≤ai<230。
Subtask 1(20 分): 2≤n,m≤10
Subtask 2(30 分): 2≤n,m≤2000
Subtask 3(50 分): 2≤n,m≤2×105
时间限制: 2s
空间限制: 512MB
很显然,对于一段区间,如果有相同的数,那么一次可以消掉两个。如果两个数不同,那么两次就能消掉(它们两个碰两次),如果有单个的,需要两次才能消掉(一次和0,一次它们两个相消)。
很显然,我们只需要维护一段区间中相同的数的个数,和落单的数的个数,这个每次拓展一位是很好处理的。
所以上莫队就行了。QAQ
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MAXN 200010
using namespace std;
int n,m,block,cur_ans,sum1;
int a[MAXN],b[MAXN],pos[MAXN],ans[MAXN],sum[MAXN];
struct Node{int id,l,r;}node[MAXN];
inline bool cmp(struct Node x,struct Node y)
{return pos[x.l]<pos[y.l]||(pos[x.l]==pos[y.l]&&x.r<y.r);}
inline void ins(int x)
{
if(!x) return;
if(sum[x]%2==1)
{
if(sum1&1) cur_ans--,sum1=0;
else cur_ans++,sum1=1;
}
else
{
if(sum1&1) sum1=0;
else cur_ans+=2,sum1=1;
}
sum[x]++;
}
inline void del(int x)
{
if(!x) return;
if(sum[x]%2==1)
{
if(sum1&1) cur_ans-=2,sum1=0;
else sum1=1;
}
else
{
if(sum1&1) cur_ans--,sum1=0;
else cur_ans++,sum1=1;
}
sum[x]--;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
scanf("%d%d",&n,&m);
block=(int)sqrt(1.0*n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
memcpy(b,a,sizeof(a));
sort(&b[1],&b[n+1]);
int k=unique(&b[1],&b[n+1])-b-1;
for(int i=1;i<=n;i++) a[i]=lower_bound(&b[1],&b[k+1],a[i])-b;
for(int i=1;i<=n;i++)
{
pos[i]=i/block;
if(i%block) pos[i]++;
}
for(int i=1;i<=m;i++)
{
scanf("%d%d",&node[i].l,&node[i].r);
node[i].id=i;
}
sort(&node[1],&node[m+1],cmp);
int l=1,r=0;
for(int i=1;i<=m;i++)
{
// printf("%d %d\n",node[i].l,node[i].r);
while(r<node[i].r) r++,ins(a[r]);
while(l>node[i].l) l--,ins(a[l]);
while(l<node[i].l) del(a[l]),l++;
while(r>node[i].r) del(a[r]),r--;
ans[node[i].id]=cur_ans;
}
for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
return 0;
}
noi.ac #553 序列的更多相关文章
- NOI.ac #31 MST DP、哈希
题目传送门:http://noi.ac/problem/31 一道思路好题考虑模拟$Kruskal$的加边方式,然后能够发现非最小生成树边只能在一个已经由边权更小的边连成的连通块中,而树边一定会让两个 ...
- NOI.AC NOIP模拟赛 第五场 游记
NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...
- NOI.AC NOIP模拟赛 第一场 补记
NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...
- noi.ac上的一套(假)NOI题
noi.ac上的一套(假)NOI题 本来想着可以刷点通过量的,结果发现好像并不是这样的. 整数 description 给你\(n,p\),要你求\(\sum_{k=1}^n\sum_{i=1}^k\ ...
- SDOI2015 寻宝游戏 | noi.ac#460 tree
题目链接:戳我 可以知道,我们相当于是把有宝藏在的地方围了一个圈,求这个圈最小是多大. 显然按照dfs序来遍历是最小的. 那么我们就先来一遍dfs序列,并且预处理出来每个点到根的距离(这样我们就可用\ ...
- NOI.AC#2139-选择【斜率优化dp,树状数组】
正题 题目链接:http://noi.ac/problem/2139 题目大意 给出\(n\)个数字的序列\(a_i\).然后选出一个不降子序列最大化子序列的\(a_i\)和减去没有任何一个数被选中的 ...
- NOI.AC#2144-子串【SAM,倍增】
正题 题目链接:http://noi.ac/problem/2144 题目大意 给出一个字符串\(s\)和一个序列\(a\).将字符串\(s\)的所有本质不同子串降序排序后,求有多少个区间\([l,r ...
- # NOI.AC省选赛 第五场T1 子集,与&最大值
NOI.AC省选赛 第五场T1 A. Mas的童年 题目链接 http://noi.ac/problem/309 思路 0x00 \(n^2\)的暴力挺简单的. ans=max(ans,xor[j-1 ...
- NOI.AC NOIP模拟赛 第六场 游记
NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...
随机推荐
- Android获取网络时间的方法
一.通过免费或者收费的API接口获取 1.免费 QQ:http://cgi.im.qq.com/cgi-bin/cgi_svrtime 淘宝:http://api.m.taobao.com/rest/ ...
- asp.net 13 缓存,Session存储
1.缓存 将数据从数据库/文件取出来放在服务器的内存中,这样后面的用来获取数据,不用查询数据库,直接从内存(缓冲)中获取数据,提高了访问的速度,节省了时间,也减轻了数据库的压力. 缓冲空间换时间的技术 ...
- Python——用turtle画一个月饼
今天是中秋节,首先在这里祝大家中秋快乐!那么提到中秋,我们首先想到的当然是香甜的月饼,所以我今天就在这里画一个月饼送给大家. 那么 要用Python画图,我们必须掌握并运用Turtle库,这个可以自己 ...
- redis的数据结构及操作命令
一.字符串: redis中最为基础的存储类型,以二进制存储,value的字符串最多512M,Key做多1024字节. 常用命令:赋值(set).取值(get).删除(del),递增(incr/incr ...
- 关于MVC与MVP的理解
1. MVC的理解误区 理解误区: 1. 认为Model是指失血模型的实体类(Entity),是作为View和Controller之间的传输数据. 2. 把业务逻辑全部放在Controller端,认为 ...
- 函数缓存 (Function caching)
函数返回值缓存是优化一个函数的常用手段.我们可以将函数.输入参数.返回值全部保存起来,当下次以同样的参数调用这个函数时,直接使用存储的结果作为返回(不需要重新计算). 函数缓存允许我们将一个函数对于给 ...
- Oracle 11.2.0.1 ADG环境MRP进程遭遇ORA
环境:Linux + Oracle 11.2.0.1 ADG现象:发现备库没有应用日志 1. 数据库查询备库目前状态发现备库目前没有应用日志,apply lag已经显示备库有3天21小时多没有应用日志 ...
- 经典i++和++i问题(附带运算符优先级问题)
转自 https://blog.csdn.net/mustard1020/article/details/79617865 1.i++和++i的区别 (1)i++简单来说就是先用i的值来参加表 ...
- Win10 OpenCV3.3.0+VS2013配置大坑,OpenCV解决方案编译报错“找不到python36_d.lib”错误
今天因为想要用OpenCV做图像识别,小白一个,在网上找到一个教程,但是需要配置OpenCV3.3.0的环境,于是又在网上找OpenCV3.3.0+VS2013(因为我之前已经安过了VS2013),前 ...
- 合并K个sorted list
合并k个已经排好序的数列是面试中也比较容易被问到的一个算法,有很多种解决,其中第一时间比较容易想到的解法如下: 对于这三组从小到大的数列: 如此循环,最终就将三个已经排序的数列的数字按从小到大的顺序排 ...