码迷,mamicode.com
首页 > 其他好文 > 详细

*Codeforces Round #338 (Div. 2)

时间:2016-01-09 21:35:05      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:

A. Bulbs

题意:n个开关m个灯泡,每个开关可以打开多个灯泡(按下其他开关不会导致已经亮的灯泡熄灭),问能否打开所有的灯。

做法:模拟,用tag标记能被打开的灯,遍历一遍所有的灯泡,看是否全部都能被打开。

代码如下:

#include<bits/stdc++.h>
#define rep(i,n) for(i=1;i<=n;i++)
using namespace std;
bool tag[110];
int main()
{
	int n,m;
	cin>>n>>m;
	int i;
	rep(i,n)
	{
		int x,j;
		cin>>x;
		rep(j,x)
		{
			int u;
			cin>>u;
			tag[u]=true;
		}
	}
	rep(i,m)
		if(!tag[i])
		{
			printf("NO");
			return 0;
		}
	printf("YES");
	return 0;
}

  

B. Longtail Hedgehog

题意:n个点m条边无自环无重边,找一条下标递增的线段作为尾巴,尾巴末端的点连接的边作为刺,求出尾巴长度*刺的数量的最大值。

思路:如果尾巴确定,那么它的刺的数量也是确定的,只需要用一次dfs找出所有的尾巴,并且在每个节点标记上它作为末端的刺的数量(即连边数)*尾巴长度的值,完成后统计出最大值即可。

做法:从n->1依次枚举每个节点(不能从1->n,从1->n不能把当前节点作为末端),进行dfs,记录答案。

代码如下:

#include<bits/stdc++.h>
#define rep(i,n) for(i=1;i<=n;i++)
using namespace std;
typedef long long int ll;
const int maxn=100100;
const int maxm=200100;
int fir[maxn],Next[maxm*2],End[maxm*2];
ll vis[maxn],connum[maxn];
int n,m,size;
bool tag[maxn];
void addedge(int x,int y)
{
	size++;
	Next[size]=fir[x];
	fir[x]=size;
	End[size]=y;
}
ll dfs(int v)
{
	for(int u=fir[v];u;u=Next[u])
	{
		int ed=End[u];
		if(ed<v)
		{
			if(vis[ed]!=1)vis[v]=max(vis[v],vis[ed]+1);
			else vis[v]=max(vis[v],dfs(ed)+1);
		}
	}
	return vis[v];
}
int main()
{
	// freopen("B.in","r",stdin);
	// freopen("B.out","w",stdout);
	scanf("%d%d",&n,&m);
	int i;
	rep(i,m)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		addedge(x,y);
		addedge(y,x);
		connum[x]++;
		connum[y]++;
	}
	rep(i,n)vis[i]=1;
	for(i=n;i>0;i--)
		if(vis[i]==1)
			vis[i]=dfs(i);
	ll ans=0;
	//rep(i,n)cout<<vis[i]<<endl;
	rep(i,n)
		ans=max(ans,vis[i]*connum[i]);
	cout<<ans;
}

*C. Running Track

题意:给多个原始字符串s,可以进行剪切和连接(能够反向),问最少用几个s就可以得到目标字符串t,并输出方案,不能就输出-1.

D. Multipliers

题意:给出数n的所有质因数,计算出n的所有因子的乘积。

做法:公式,定理太多,直接搬题解

技术分享

技术分享

接下来是 d(x)=(a1+1)(a2+1)...(ak+1)的证明。

技术分享

计算技术分享可以用费马小定理:

技术分享

关于快速的计算(a1+1)(a2+1)...(an+1)可以用下面的方法:

技术分享

这样就可以计算答案了(不用讨论是否是完全平方数的情况),代码如下:

#include<bits/stdc++.h>
#define rep(i,n) for(i=1;i<=n;i++)
using namespace std;
constexpr int maxn=200100;
typedef long long int ll;
map<ll,ll>a;
const ll MOD=1e9+7;
array<ll,maxn>lmul,rmul;
int n;
ll ksm(ll a,ll b,ll c)
{
	ll ans=1LL,x=a%c;
	while(b)
	{
		if(b&(1LL))ans=(ans*x)%c;
		x=(x*x)%c;
		b/=2LL;
	}
	return ans;
}
int main()
{
	freopen("D.in","r",stdin);
	freopen("D.out","w",stdout);
	ios::sync_with_stdio(false);
	int i;
	cin>>n;
//	bool ok=true;
	rep(i,n)
	{
		ll p;
		cin>>p;
		a[p]++;
	}
	ll ans=1LL,tans=1LL;
	map<ll,ll>::iterator it;
	int num=0;
	lmul[0]=rmul[a.size()+1]=1LL;
	for(it=a.begin();it!=a.end();++it)
	{
		++num;
		lmul[num]=lmul[num-1]*(it->second+1)%(MOD-1);
	}
	map<ll,ll>::reverse_iterator rit;
	for(rit=a.rbegin();rit!=a.rend();++rit)
	{
		rmul[num]=rmul[num+1]*(rit->second+1)%(MOD-1);
		--num;
	}
	for(it=a.begin();it!=a.end();++it)
	{
		++num;
		ll u=it->second*(it->second+1LL)/2LL;
		ll p=ksm(it->first,u,MOD);
		u=lmul[num-1]*rmul[num+1]%(MOD-1);
	//	cout<<"u="<<u<<endl;
		p=ksm(p,u,MOD);
	//	cout<<"p="<<p<<endl;
		ans=ans*p%MOD;
		//tans=ksm(it->first,it->second/2LL,MOD);
	//	if(it->second&1LL)ok=false;
	}
	//if(ok)ans=ans*tans%MOD;
	cout<<ans;
}

  

*E. Hexagons

 

*Codeforces Round #338 (Div. 2)

标签:

原文地址:http://www.cnblogs.com/xionglinlin/p/5117160.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!