/ Randle /

记录详情

Accepted

/in/foo.cc: In function 'int main()':
/in/foo.cc:97:12: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
    if((1<<j-1)&k)add(i,j,1<<j-1);
           ~^~
/in/foo.cc:97:30: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
    if((1<<j-1)&k)add(i,j,1<<j-1);
                             ~^~
/in/foo.cc:103:27: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
   if(boy[i])ans+=1<<boy[i]-1;
                     ~~~~~~^~
# 状态 耗时 内存占用
#1 Accepted 16ms 28.82 MiB
#2 Accepted 14ms 27.812 MiB
#3 Accepted 13ms 28.695 MiB
#4 Accepted 37ms 28.941 MiB
#5 Accepted 30ms 27.941 MiB
#6 Accepted 155ms 27.816 MiB
#7 Accepted 203ms 27.949 MiB
#8 Accepted 319ms 28.184 MiB
#9 Accepted 361ms 29.07 MiB
#10 Accepted 348ms 27.441 MiB

代码

#include<bits/stdc++.h>
const int maxn=1e6;
inline const void read(int &a)
{
	a=0;
	char c=getchar();
	while(c<'0'||c>'9')c=getchar();
	while(c>='0'&&c<='9')
	{
		a=(a<<1)+(a<<3)+c-'0';
		c=getchar();
	}
}
inline const void write(int a)
{
	if(a>9)write(a/10);
	putchar(a%10+'0');
}
inline const int max(int a,int b)
{
	if(a>b)return a;
	else return b;
}
inline const int min(int a,int b)
{
	if(a<b)return a;
	else return b;
}
int n,d=0;
int point[maxn],next[maxn],to[maxn],len[maxn];//len指这条边的权值,实际上就是指向的那一位的大小,即时这对男女的互相倾心值。
int exboy[maxn],exgirl[maxn],boy[maxn],girl[maxn],three[maxn];//exboy和exgirl表示男孩女孩对暗恋者的期望值。boy和girl分别指这个男女生现任女男友,three是女生离做小三的距离,也就是要被某个男生作为首选,最少还差多少与他的倾心值。
bool visboy[maxn],visgirl[maxn];//记录是否已经参与本次违背伦理的换男女友活动
const bool found(int p)//判断是否能够为这个男生牵线,并返回是否成功
{
	visboy[p]=true;//这个男生卷进来男生
	int side=point[p];
	while(side)//遍历他喜欢的每一个女生
	{
		if(!visgirl[to[side]])//每个女生只被抢一次,否则会死循环
		{
			if(exboy[p]+exgirl[to[side]]==len[side])//假设这个女孩能作为首选
			{	
				visgirl[to[side]]=true;//纯洁的女孩也被卷了进来
				if(!girl[to[side]]||found(girl[to[side]]))//如果女孩没有男友或者他的男友能另找女孩,就在一起!
				{
					girl[to[side]]=p;//女生的男朋友
					boy[p]=to[side];//男生的女朋友
					return true;//共同甜蜜的宣布牵手成功
				}
			}
			else//这个女孩不是首选
					three[to[side]]=min(three[to[side]],exboy[p]+exgirl[to[side]]-len[side]);//这个女孩暗下决心,还要多少倾心值才能成为首选
		}
		side=next[side];
	}
	return false;
}
void solve()
{
	for(int i=1;i<=n;i++)
	{
		memset(three,0x7f,sizeof(three));
		while(true)
		{	
			memset(visgirl,false,sizeof(visgirl));
			memset(visboy,false,sizeof(visboy));
			if(found(i))break;
			int minus=three[0];
			for(int j=1;j<=32;j++)if(!visgirl[j])minus=min(three[j],minus);
			if(minus==three[0])break;
			for(int j=1;j<=n;j++)if(visboy[j])exboy[j]-=minus;
			for(int j=1;j<=32;j++)
				if(visgirl[j])exgirl[j]+=minus;
		}
	}
}
inline const void add(int a,int b,int c)
{
	next[++d]=point[a];
	to[d]=b;
	point[a]=d;
	len[d]=c;
	exboy[a]=max(exboy[a],len[d]);
}
int main()
{
	memset(exboy,0,sizeof(exboy));
	memset(exgirl,0,sizeof(exgirl));
	memset(girl,0,sizeof(girl));
	memset(boy,0,sizeof(boy));
	read(n);
	int k;
	for(int i=1;i<=n;i++)
	{
		read(k);
		for(int j=1;j<=32;j++)
			if((1<<j-1)&k)add(i,j,1<<j-1);
	}
	solve();
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		if(boy[i])ans+=1<<boy[i]-1;
		else ans^=1;
	}
	write(ans);
	return 0;
}

信息

递交者
类型
递交
题目
奇数异或(国家集训队)
题目数据
下载
语言
C++
递交时间
2017-10-06 22:37:59
评测时间
2017-10-06 22:37:59
评测机
分数
100
总耗时
1501ms
峰值内存
29.07 MiB