IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> P4135 作诗 -> 正文阅读

[开发工具]P4135 作诗

参考

题意:给定数列,mm次询问 [ l i , r i ] [l_i,r_i] [li?,ri?]中,出现正偶数次的数的个数。

idea:之前我们是做过问区间众数的题的,这题跟那题比较类似,但不完全相同。我们需要预处理出 c n t [ i ] [ j ] cnt[i][j] cnt[i][j] 为前 i i i块中 j j j出现的次数 a n s [ i ] [ j ] ans[i][j] ans[i][j] i i i块到第 j j j块中出现偶数次的数的个数

ACcode:

#include<iostream>
#include<cstring>
#include<cstdio>
#define LL long long
#include<cmath>
#define N 100010
#define SQ 1010
using namespace std;

int n,m,c,cnt[SQ][N],ans[SQ][SQ],val[N],bl[N],st[SQ],ed[SQ],maxx=-1,t[N],sq;

void init()
{
	for(int i=1;i<=bl[n];i++)
	{
		st[i] = (i-1)*sq + 1;
		ed[i] = i*sq ; 
	}
	ed[ bl[n] ] = n;
	for(int i=1;i<=bl[n];i++)
	{
		for(int j=0;j<=c;j++)
		{
			cnt[i][j] += cnt[i-1][j];
		}
	}
	for(int i=1;i<=bl[n];i++)
	{
		for(int j=i;j<=bl[n];j++)
		{
			ans[i][j] = ans[i][j-1];
			for(int k=st[j];k<=ed[j];k++)
			{
				t[ val[k] ]++;
				if( t[ val[k] ]%2==0 ) ans[i][j]++;
				else if( t[ val[k] ]>=3 ) ans[i][j]--;
			}
		}
		memset(t,0,sizeof(t));
	}
}

int query(int l,int r)
{
	int sum = 0;
	if( bl[l]+1>=bl[r] )//特别注意,这题当[l,r]都相邻两个块或者同一个块是要直接加不然会出问题
	{
		for(int i=l;i<=r;i++)
		{
			t[ val[i] ]++;
			if( t[ val[i] ]%2==0 ) sum++;//说明在t[]在+1之前是奇数,所以这是一种新方案
			else if( t[ val[i] ]>=3 ) sum--; //说明t[]在+1之前是偶数,并且之前的t[]>=2故sum需-1
		}
		for(int i=l;i<=r;i++) t[ val[i] ]--;
		return sum;
	}
	sum = ans[ bl[l]+1 ][ bl[r]-1 ];
	for(int i=l;i<=min( r,ed[ bl[l] ] );i++)
	{
		t[ val[i] ]++;
		int v = cnt[ bl[r]-1 ][ val[i] ] - cnt[ bl[l] ][ val[i] ];
		if( (t[ val[i] ]+v)%2==0 ) sum++;
		else if( (t[ val[i] ]+v)>=3 ) sum--;
	}
	if( bl[l] != bl[r] )
	{
		for(int i=st[ bl[r] ];i<=r;i++)
		{
			t[ val[i] ]++;
			int v = cnt[ bl[r]-1 ][ val[i] ] - cnt[ bl[l] ][ val[i] ];
			if( (t[ val[i] ]+v)%2==0 ) sum++;
			else if( t[ val[i] ]+v >=3 ) sum--;
		}
		for(int i=st[ bl[r] ];i<=r;i++) t[ val[i] ]--;
	}
	for(int i=l;i<=min( r,ed[bl[l]] );i++) t[ val[i] ]--;
	return sum;
}

void solve()
{
	scanf("%d %d %d",&n,&c,&m);
	sq = sqrt(n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&val[i]);
		bl[i] = (i-1)/sq + 1;
		cnt[ bl[i] ][ val[i] ]++;
	}
	
	init();
	int as = 0;
	while( m-- )
	{
		int l,r;
		scanf("%d %d",&l,&r);
		l = (l+as) % n + 1;
		r = (r+as) % n + 1;
		if( l>r ) swap( l,r );
		as = query( l,r );
		printf("%d\n",as);
	}
}

signed main()
{
		//freopen("in.txt","r",stdin);
	
	solve();
	return 0;
	
}
  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2021-08-09 10:26:16  更:2021-08-09 10:27:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/20 15:25:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码