论如何开场不顺
10分钟自己以为A1,然后狂搞其他题
反过来看第一题,最后20min检查的时候才发现自己推错了公式
dfs(m,n)可以视为dfs(m+n,n)的一个子问题,可以递归做 30
//Copyright(c)2015 liuchenrui
#include<cstdio>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
int n,m,k;
bool flag=true;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
void dfs(int n,int m)
{
if(m==0)return;
int t=n/m*m;
for(int i=1;i<=t;i++)
{
if(flag)flag^=1,printf("%d",m);
else printf(" %d",m);
}
dfs(m,n%m);
}
int main()
{
freopen("candy.in","r",stdin);
freopen("candy.out","w",stdout);
cin>>n>>m>>k;
if(n>m)swap(n,m);
int d=gcd(n,m);
cout<<n+m-d<<endl;
if(k==1)dfs(m,n);
}
T2
考场上把暴力写完 60
最后正解居然是一个暴力的翻版 然后调了一下午
//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 n,m,q;
struct Edge
{
int to,next,len;
}edge[100010];
int first[50010],size;
int ans[50010];
bool flag=false;
int father[50010];
int getfather(int v)
{
if(father[v]==v)return v;
father[v]=getfather(father[v]);
return father[v];
}
void addedge(int x,int y,int z)
{
size++;
edge[size].to=y;
edge[size].len=z;
edge[size].next=first[x];
first[x]=size;
}
int color[50001];
bool visit[50005];
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
void dfs(int now)//染3
{
color[now]=3;
for(int u=first[now];u;u=edge[u].next)
{
ans[father[now]]=gcd(ans[father[now]],edge[u].len);
if(color[edge[u].to]!=3)
{
dfs(edge[u].to);
}
}
}
void dfs1(int now)//跑出ans
{
visit[now]=true;
for(int u=first[now];u;u=edge[u].next)
{
ans[father[now]]=gcd(ans[father[now]],edge[u].len);
if(!visit[edge[u].to])dfs1(edge[u].to);
}
}
void dfs2(int now,int col)
{
color[now]=col;
for(int u=first[now];u;u=edge[u].next)
{
if(color[edge[u].to])
{
if((edge[u].len/ans[father[now]])&1)
{
if(color[edge[u].to]==color[now])
{
flag=true;
return;
}
}
else
{
if(color[edge[u].to]!=color[now])
{
flag=true;
return;
}
}
}
else
{
if((edge[u].len/ans[father[now]])&1)dfs2(edge[u].to,(((col-1)^1)+1));
else dfs2(edge[u].to,col);
if(flag)return;
}
}
}
int main()
{
int _q=10<<20;
char *_p=(char*)malloc(_q)+_q;
__asm__("movl %0, %%esp\n"::"r"(_p));
freopen("pod.in","r",stdin);
freopen("pod.out","w",stdout);
R(n),R(m),R(q);
for(int i=1;i<=n;i++)father[i]=i;
for(int i=1;i<=m;i++)
{
int x,y,z;
R(x),R(y),R(z);
addedge(x,y,z);
addedge(y,x,z);
int l=getfather(x);
int r=getfather(y);
if(l!=r)father[l]=r;
}
for(int i=1;i<=n;i++)getfather(i);
for(int i=1;i<=n;i++)if(father[i]==i)ans[i]=edge[first[i]].len;
for(int i=1;i<=n;i++)
{
if(!color[i])dfs1(i),dfs2(i,1);
if(flag)dfs(i),flag^=1;
}
for(int i=1;i<=q;i++)
{
int x,y,z;
R(x),R(y),R(z);
if(getfather(x)!=getfather(y)){printf("NIE\n");continue;}
if((z/gcd(z,ans[father[x]])&1)){printf("0\n");continue;}
if(color[x]==color[y]){printf("0\n");continue;}
else printf("%d\n",gcd(z,ans[father[x]]));
}
exit(0);
}
T3是一个前缀和,明明秒出解然后题目给了3s,吓得我检查了好多遍 100
//Copyright(c)2015 liuchenrui
#include<cstdio>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<cstring>
#define mod 2147483648ll
#define N 80010
#define ll long long
using namespace std;
inline void R(ll &v)
{
v=0;char c=0;ll 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;
}
ll g[N],c[N],d[N],gc[N],gcd[N],cd[N];
char s[N];
ll n,q;
int main()
{
freopen("gcd.in","r",stdin);
freopen("gcd.out","w",stdout);
scanf("%s",s+1);
ll len=strlen(s+1);
for(ll i=1;i<=len;i++)
{
g[i]=g[i-1];c[i]=c[i-1];d[i]=d[i-1];
gc[i]=gc[i-1];gcd[i]=gcd[i-1];cd[i]=cd[i-1];
if(s[i]=='g')g[i]++;
if(s[i]=='c')c[i]++,gc[i]+=g[i];
if(s[i]=='d')d[i]++,gcd[i]+=gc[i],cd[i]+=c[i];
}
R(q);
while(q--)
{
ll l,r;R(l),R(r);
ll ans=gcd[r]-gcd[l-1];
ans-=g[l-1]*(cd[r]-cd[l-1]-c[l-1]*(d[r]-d[l-1]));
ans-=gc[l-1]*(d[r]-d[l-1]);
printf("%I64d\n",ans%mod);
}
return 0;
}