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;
}