151102 总结

NOIP之前来场爆蛋,,心态啊

T1

原以为这道题要写高精,写完发现可以用log替代。。没特判0 70

T2

写了个n^3dp。正确性好像都是错的

正确解法:

我们可以把这些多项式展开,可以贪心得到这道题必须多分组,那么写出方程

正解才30。。

T3

求双联通分量

自己写的不熟吧果然还是太弱了。考场上写挂(没更新dfn),然后特殊情况也没特判就爆蛋啦

正解就是想的那样,,各种细节没注意然后挂掉了 0

考验心理啊

//Copyright(c)2015 liuchenrui
#include<cstdio>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#define pa {puts((numa&1)?"Bob":"Alice");goto end;}
#define pb {puts((numa&1)?"Alice":"Bob");goto end;}
#define ld long double
using namespace std;
inline void R(int &v)
{
	v=0;char c=0;int p=1;
	while(c<'0' || c>'9'){if(c=='-')p=-1;c=getchar();}
	while(c>='0' && c<='9'){v=(v<<3)+(v<<1)+c-'0';c=getchar();}
	v*=p;
}
int n,m;
int a[100010],b[100010];
int main()
{
	freopen("ball.in","r",stdin);
	freopen("ball.out","w",stdout);
	int T;R(T);
	while(T--)
	{
		int numa=0,numb=0;
		bool f1=false,f2=false;
		R(n);
		for(int i=1;i<=n;i++)
		{
			R(a[i]);
			if(a[i]<0)a[i]=-a[i],numa++;
			if(b[i]==0)f1=true;
		}
		R(m);
		for(int i=1;i<=m;i++)
		{
			R(b[i]);
			if(b[i]<0)b[i]=-b[i],numb++;
			if(b[i]==0)f2=true;
		}
		if(f1)puts((numb&1)?"Bob":"Alice");
		if(f2)puts((numa&1)?"Alice":"Bob");
		if((numa&1)!=(numb&1))
		{
			if(numa&1)puts("Alice");
			else puts("Bob");
			continue;
		}
		ld x=0,y=0;
		for(int i=1;i<=n;i++)x+=(log((ld)a[i]));
		for(int i=1;i<=m;i++)y+=(log((ld)b[i]));
		if(x>y)pb else pa;
		end:;
	}

}

//Copyright(c)2015 liuchenrui
#include<cstdio>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
inline void R(int &v)
{
	v=0;char c=0;int p=1;
	while(c<'0' || c>'9'){if(c=='-')p=-1;c=getchar();}
	while(c>='0' && c<='9'){v=(v<<3)+(v<<1)+c-'0';c=getchar();}
	v*=p;
}
int dp[5005][5005];
int a[5005],b[5005];
int main()
{
	freopen("xxx.in","r",stdin);
	freopen("xxx.out","w",stdout);
	int n,m;R(n);R(m);
	for(int i=1;i<=n;i++)R(a[i]),a[i]--;
	for(int i=1;i<=m;i++)R(b[i]),b[i]--;
	memset(dp,63,sizeof dp);dp[n+1][m+1]=0;
	for(int i=n;i>=1;i--)
		for(int j=m;j>=1;j--)
		{
			dp[i][j]=min(dp[i][j],min(dp[i+1][j],min(dp[i][j+1],dp[i+1][j+1]))+a[i]*b[j]);
		}
	cout<<dp[1][1];
}

//Copyright(c)2015 liuchenrui
#include<cstdio>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<cstring>
#define o(e) ((((e)-1)^1)+1)
using namespace std;
inline void R(int &v)
{
	v=0;char c=0;int p=1;
	while(c<'0' || c>'9'){if(c=='-')p=-1;c=getchar();}
	while(c>='0' && c<='9'){v=(v<<3)+(v<<1)+c-'0';c=getchar();}
	v*=p;
}
int index,tot;
struct Edge
{
	int to,next,from;bool can;
}edge[100010];
int first[100010],size;
int low[100010],dfn[100010];
int n,m,ans,t;
int num[100010];
int father[100010];
int getfather(int v)
{
	if(father[v]==v)return v;
	father[v]=getfather(father[v]);
	return father[v];
}
void addedge(int x,int y)
{
	size++;
	edge[size].to=y;
	edge[size].next=first[x];
	first[x]=size;
	edge[size].can=true;
	edge[size].from=x;
}
void tarjan(int now,int fa)
{
	dfn[now]=low[now]=++index;
	for(int u=first[now];u;u=edge[u].next)
	{
		if(!dfn[edge[u].to])
		{
			tarjan(edge[u].to,u);
			low[now]=min(low[now],low[edge[u].to]);
			//if(low[edge[u].to]>dfn[now])fprintf(stderr,"%d %d\n",now,edge[u].to);
			if(low[edge[u].to]>dfn[now])edge[u].can=false,edge[o(u)].can=false;
		}
		else
		{
			if(u!=fa && u!=o(fa))
				low[now]=min(low[now],dfn[edge[u].to]);
		}
	}
}
int main()
{
	freopen("date.in","r",stdin);
	freopen("date.out","w",stdout);
	R(n),R(m);
	for(int i=1;i<=n;i++)father[i]=i,num[i]=1;
	for(int i=1;i<=m;i++)
	{
		int x,y;
		R(x),R(y);
		addedge(x,y);
		addedge(y,x);
	}
	for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i,80001);
	for(int i=1;i<=size;i+=2)
	{
		if(edge[i].can)
		{
			int l=getfather(edge[i].from);
			int r=getfather(edge[i].to);
			if(l!=r)
			{
				father[l]=r;
				num[r]+=num[l];
			}
		}
	}
	tot=n;
	//for(int i=1;i<=size;i++)fprintf(stderr,"%d %d %d\n",edge[i].from,edge[i].to,edge[i].can);
	for(int i=1;i<=n;i++)
	{
		if(getfather(i)==i)
		{
			tot-=num[i];
			ans+=num[i]*tot;
		}
	}
	cout<<ans<<endl;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值