65分求助,居然还有TLE!!!
查看原帖
65分求助,居然还有TLE!!!
209944
君玘楼主2020/11/8 21:08

我的想法是:

设A为动物园的n种动物可能满足p的1,即A|=a[i]。

设P为所有的p[j],应该可以这么算P|=(1<<p[j])。

那么,已经满足的p[j]为A&P,设T=P-(A&P),那么T就是不允许出现的p[j]。(因为q[k]互不相同,对于任意p[j1]!=p[j2],所对应的q[j1]和q[j2]都不会重复,那么若是不想再新增q[k],则必不能新增p[j])

所以若T的第t位为1,所有编号第t位为1的动物都无法再加进去。

但是一个一个试太麻烦,因此我又想到了一个。

假设T一共有cnt个1,那么答案为2^cnt-n。(为了不使那些位为1,那么那些位必为0,因此一共只有2^cnt种动物能进动物园,而动物园本来就有n种动物,这n种动物必在这2^cnt种之内。因为T=P-(A&P),因此若T第t位为1,则A第t位必为0,因此这n种动物必是第t位为0的动物,即这n种动物必在2^cnt种之内,因此只能再添加2^cnt-n种动物)

也不知道是不是对的啊,然后就有了以下代码:

#include<bits/stdc++.h>
#define gc ch=getchar()
#define ll long long
using namespace std;
template <class T>void read(T &s){
	s=0;T f=1;char gc;
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;gc;}
	while(ch<='9'&&ch>='0'){s=s*10+ch-'0';gc;}
	s*=f;
}
template <class T>void put(T s){
	if(s<0) putchar('-'),s=-s;
	if(s>10) put(s/10);
	putchar(s%10+'0');
}
ll n,m,c,k;
ll a[1000005];
ll A,P,T;
ll ans=1;
int main(){
	read(n),read(m),read(c),read(k);
	for(int i=1;i<=n;++i) read(a[i]),A|=a[i];
	ll p,q;
	for(int i=1;i<=m;++i) read(p),read(q),P=P|1<<p;
	T=P-(P&A);
	while(T){
		if(T&1) --k;
		T>>=1;
	}
	ans=((ans<<(k-1))-n)+(ans<<(k-1));
	put(ans);
	return 0;
}

13-19没得分,13、15、16T掉了。

请各位dalao帮帮忙,谢谢orz

2020/11/8 21:08
加载中...