首页 > 其他分享 >SEERC 2020 Problem H

SEERC 2020 Problem H

时间:2023-11-05 22:11:32浏览次数:31  
标签:tmp suf SEERC int 询问 read 2020 textrm Problem

题目链接

模拟赛搬了这题,场切了顺手写个题解。

这种题当然先考虑单组询问怎么做,然后再拓展出去。

设按位与的集合是 \(A\),按位或的集合是 \(B\),结果都是 \(x\),我们考虑 \(A,B\) 的元素应该满足的性质。不难发现,所有 \(y<x\) 的 \(y\) 都应该在 \(B\),\(y>x\) 的 \(y\) 都应该在 \(A\)。反证法不难发现。直接暴力枚举单组都会寄掉。

考虑把这个东西拓展到 popcount 上。定义 \(p(x)\) 为 \(x\) 在二进制下 \(1\) 的个数。我们考虑什么数应该被分进 \(A\),什么数应该被分进 \(B\)。设 \(\textrm{AND } A_i=\textrm{OR }b_i=k\)。而找答案的时候,我们可以暴力枚举 \(p(k)\) 的值。这是直接枚举 \(k\) 所不能做到的。

令 \(x=p(k)\)。显然 \(x\le p(y),y\in A\),\(x\ge p(z),z\in B\)。所以对于一个数 \(y\),如果满足 \(p(y)>x\) 就应该被分入 \(A\),满足 \(p(y)<x\) 就应该被分入 \(B\)。考虑 \(p(y)=x\) 的情况。容易发现这样的 \(y\) 应该都相等,反证易知。设 \(A\) 中此时的元素的 \(\textrm{AND}\) 为 \(A_1\),\(B\) 中此时的元素的 \(\textrm{OR}\) 为 \(B_1\)。设使得 \(p(y)=x\) 的 \(y\) 有 \(d\) 个。设此时的 \(p(y)=x\) 都为 \(T\),判是否合法有以下三种:

  • \(d=0\):不考虑:因为这样的情况可以被其他的 \(x\) 情况所描述。
  • \(d\ge1\):判断是否有 \(A_1 \textrm{ or }T=B_1\)。
  • \(d\ge 2\):判断是否有 \(A_1\textrm{ or }T=B_1\textrm{ and }T\)。

这样可以做描述所有合法情况。容易写出来一个 \(O(\log V)\) 判断合法性的东西。具体可以这样写:

对于一个集合 \(S\),考虑维护所有 popcount 为 \(x\) 的数的按位与,按位或的值,以及数量。

查询时直接考虑对这堆信息做前后缀维护,枚举断点 \(k\) 根据上面提到的分类判断。判断的复杂度可以做到 \(O(\log V)\)。

考虑怎么拓展到多组询问上,有两种做法。

做法一,考场做法:

可以考虑根号分治。离线所有询问。对于 \(r-l+1\leq \sqrt n\) 的询问直接暴力求。对于 \(r-l+1>\sqrt n\) 的,可以按照左端点分块。把所有询问发配到左端点的块上。

对于同一个块中的所有询问,按照右端点 \(r\) 排序。具体就是,设 \(l\) 所在块右端点为 \(l_1\),那么这种询问的 \([l,r]=[l,l_1]+[l_1+1,r]\)。\([l,l_1]\) 暴力求,但是 \([l_1+1,r]\) 一起求。总复杂度 \(O(n\sqrt n\log V)\),可以通过本题。

提交记录

做法二,std 做法:

可以考虑分治,设当前分治到区间 \([l,r]\),中点为 \(mid=\lfloor\dfrac{l+r}{2}\rfloor\)。单次分治我们只需要处理 \(L\in [l,mid],R\in (mid,r]\) 的所有询问。

我们对右半部分进行前缀信息维护,对右半部分进行前缀信息维护。具体就是,枚举相等的值的 popcount。维护前缀或,前缀与,后缀或,后缀与,以及前后缀相等的。然后一个询问区间可以通过合并左半边后缀以及右半边前缀得到。按照那三条判断合法性的方法直接判断即可。

总时间复杂度 \(O(n\log n\log V)\),可以通过本题。

做法一参考代码:

#include<bits/stdc++.h>
#define pb push_back
#define F(i,a,b) for(int i=a;i<=(b);i++)
#define dF(i,a,b) for(int i=a;i>=(b);i--)
#define lowbit(x) (x&(-x))
using namespace std;
int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
	while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
	return x*f;
}
const int mod=998244353,maxn=114514;
int n,m,a[maxn];
int popcount(int x){
	int rt=0;
	for(;x;x^=lowbit(x)) rt++;
	return rt;
}
bool ans[maxn];
struct node{
	struct CCF{
		int asum=-1,osum=0,cnt=0;
	};
	vector<CCF>tmp;
	node():tmp(31){}
	void insert(int x){
		const int y=popcount(x);
		tmp[y].cnt++;
		tmp[y].osum|=x;
		tmp[y].asum&=x;
	}
	bool query(){
		vector<int>suf(32);
		suf[31]=-1;
		dF(i,30,0) suf[i]=suf[i+1]&tmp[i].asum;
		int cur=0;
		F(i,0,30){
			cur|=tmp[i].osum;
			int num=tmp[i].cnt;
			if((cur==suf[i+1]&&num)||(num>=2&&cur==suf[i])) return 1;
		}
		return 0;
	}
};
vector<tuple<int,int,int>>q[maxn];
signed main(){
	n=read(),m=read();
	F(i,1,n) a[i]=read();
	int len=sqrt(n);
	F(i,1,m){
		int l=read(),r=read();
		if(r-l<=len){
			node cur;
			F(j,l,r) cur.insert(a[j]);
			ans[i]=cur.query();
		}
		else q[(l-1)/len].pb(make_tuple(r,l,i));
	}
	F(i,0,n/len) if(!q[i].empty()){
		sort(q[i].begin(),q[i].end());
		int p=(i+1)*len+1;
		node cur;
		for(auto [r,l,id]:q[i]){
			for(;p<=r;++p) cur.insert(a[p]);
			node tmp=cur;
			dF(j,(i+1)*len,l) tmp.insert(a[j]);
			ans[id]=tmp.query();
		}
	}
	F(i,1,m) puts(ans[i]?"YES":"NO");
}

标签:tmp,suf,SEERC,int,询问,read,2020,textrm,Problem
From: https://www.cnblogs.com/nullptr-qwq/p/17811339.html

相关文章

  • 题解 P6880 [JOI 2020 Final] オリンピックバス
    洛谷。题意应该显然,注意最多只能翻转一条边,并且可以不翻转。分析首先观察数据范围\(2\leN\le200\),\(1\leM\le5\times10^4\),可以发现我们的\(N\)和\(M\)并不是同级的,因此,在众多的最短路算法中,我们应当选择不加堆优化的dijkstra算法,并且使用邻接矩阵,这是\(O(n^2)......
  • 题解 P6878 [JOI 2020 Final] JJOOII 2
    好久没写题解,水一篇。题意题意显然。分析看到这道题,我们就应该进行一个小贪心,对于最左边某一字符,直到最右边的这一字符,我们不会在中间删除同样的字符,不然则可以保留这一字符,将两边往内缩。也就是说,我们确定了最左边的J后,那么留下最后一个J必然是当前这个J的后面的第\(......
  • P9821 [ICPC2020 Shanghai R] Sum of Log
    原题链接题意,求:\[\sum_{i=0}^{X}\sum_{j=[i=0]}^{Y}[i\&j=0]\lfloor\log_2(i+j)+1\rfloor\]为简洁,记\(\lg(x)=\lfloor\log_2(x)\rfloor,n=\max(X,Y)\)由于\(i\&j=0\)则\(i+j=i\operatorname{|}j\)则\(\lg(i+j)=\lg(i\operatorname{|}j)=\lg(......
  • Ozon Tech Challenge 2020 (Div.1 + Div.2, Rated, T-shirts + prizes!) B. Kuroni an
    Problem-1305B-Codeforces 啦啦啦,这题题目有点长,概括一下就是,希望将所有()匹配的括号去掉问你需要操作多少次 双指针,一个i一个j,从前往后记录匹配的括号如果发现:1.括号匹配2.i<jok,就放入ans (⊙o⊙)…,最后记得sort一遍ans,第一遍因为这个wa了一发 #include......
  • [ABC327G] Many Good Tuple Problems 题解
    题意对于一对长度均为\(M\)且元素值在\(\left[1,N\right]\)之间的序列\((S,T)\),定义其为好的当且仅当:存在一个长度为\(N\)的\(01\)序列\(X\),使得其满足如下条件:对于任意\(i\in\left[1,M\right]\),有\(X_{S_i}\neqX_{T_i}\)。给定\(N,M\),求在所有可......
  • NEFU OJ Problem1356 帽儿山奇怪的棋盘 题解
    帽儿山奇怪的棋盘题目:TimeLimit:1000ms|MemoryLimit:65535KDescription军哥来到了帽儿山,发现有两位神人在顶上对弈。棋盘长成下图的模样:每个点都有一个编号:由上到下,由左到右,依次编号为1、2……12。两位神人轮流博弈,每一轮操作的一方可以取走一个棋子,或者取走相邻的两......
  • [网鼎杯 2020 朱雀组]phpweb
    [BJDCTF2020]Themysteryofip非预期这题看着就不简单,页面总是刷新,报错都看不清,bp抓包看看。bp抓到的包是一个用POST传参的传参的值为一个函数,试着修改一下这个函数,看看会有什么变化,输入system发现被过滤了,八成这个waf做得很完善,但正好之前看到一个骚姿势,可以使用\system,php......
  • IntelliJ IDEA 2020.03 一下版本激活
    1.下载https://www.jetbrains.com/idea/download/other.html2.安装省略了一步步往下3.下载激活文件先下载激活文件链接:https://pan.baidu.com/s/1gfXCr8Htb3D-I7CW5ND41A?pwd=d86h提取码:d86h4.激活配置好jdk那些就不说了打开软件先点击试用30天进入后随便打开一个项目......
  • [MRCTF2020]Ez_bypass
    打开题目后得到源码,可以使用PHP代码在线格式化一下,方便阅读。源码如下。$flag='MRCTF{xxxxxxxxxxxxxxxxxxxxxxxxx}';if(isset($_GET['gg'])&&isset($_GET['id'])){$id=$_GET['id'];$gg=$_GET['gg'];if(md5($id)==......
  • environmental problem--deforestation
    DeforestationisaseriousenvironmentalissueinChinaandmanyothercountries.Themainreasonsfordeforestationareeconomicdevelopmentneeds,urbanization,andillegallogging.Deforestationcanleadtoseriousenvironmentalproblemssuchaserosio......