您的位置:首页 > 理论基础 > 计算机网络

2013 ACM/ICPC 长沙网络赛 J Candies (ZOJ)

2013-09-27 16:31 417 查看
开始看到这道题了, 不过没有很仔细的思考就去看前面的题目去了。。 还有不到1H 的时候想起了做法, 之后敲, 不过敲完之后又BUG, DEBUG 也没有完成 比赛就结束了。

n%3!=2 的情况下 , 能确定 所有每个人的值。

n%3==2 && 存在 给定的数a[i]!=-1且 i%3!=0 , 这种情况下 也能确定 每个值。

其他情况下 , 可能序列不唯一, 形成了 OOXOOXOOXOOX.........OOX  的形式 O未知,X已知。 假设 num[1]=b[1](第一个数的值=前两个数的和)num[2]=0; 之后每个数都能确定,在i%3==2的位置有可能出现负数, 用min1记录。 当询问  i%3==1的 值时 ,输出 num[i]+min1;

同理 再次使num[1]=0 , num[2]=b[1];   min2记录 i%3==1位置的 最小值  询问 i%3==2 的值时, 输出 num[i]+min2 ;

询问 i%3==0的时候 , 直接输出num[i];

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
#define INF 1000000000
#define N 100005
int n,a
,b
,num
,te1
,te2
,m;
int flag1,flag2;
int main()
{
//freopen("in.txt","r",stdin);
int i,j,k;
while(scanf("%d",&n)!=EOF)
{
flag1=flag2=0;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]==-1) flag1=1;
if(!flag2 && a[i]!=-1 && i%3!=0) flag2=i;
}
for(i=1;i<=n;i++)
{
scanf("%d",&b[i]);
}
memset(num,-1,sizeof(num)); // memset - num
if(!flag1)
{
int tmp;
scanf("%d",&m);
while(m--)
{
scanf("%d",&tmp);
tmp++;
printf("%d\n",a[tmp]);
}
}
else //not all is known
{
num[3]=b[2]-b[1];
for(i=2;i*3<=n;i++)
{
int tt=i*3;
num[tt]=b[tt-1]-b[tt-2]+num[tt-3];
}
if(n%3!=2)// all is certain
{
num[n-2]=b[n-1]-b
;
for(i=1;n-2-3*i>=1;i++)
{
int tt=n-2-3*i;
num[tt]=b[tt+1]-b[tt+2]+num[tt+3];
}
for(i=1;i<=n;i++)
{
if(num[i]==-1)
{
if(i==1) num[i]=b[1]-num[2];
else if(i==n) num
=b
-num[n-1];
else num[i]=b[i]-num[i-1]-num[i+1];
}
}
scanf("%d",&m);
while(m--)
{
int tmp;
scanf("%d",&tmp);
tmp++;
printf("%d\n",num[tmp]);
}
}
else
{
if(flag2)// this  is certain
{
int g=flag2;
num[g]=a[g];
if(g==1) num[2]=b[2]-num[1]-num[3];
if(g==n) num[n-1]=b[n-1]-num
-num[n-2];
for(i=g-1;i>=1;i--)
{
if(num[i]==-1)
{
num[i]=b[i+1]-num[i+1]-num[i+2];
}
}
for(i=g+1;i<=n;i++)
{
if(num[i]==-1)
{
num[i]=b[i-1]-num[i-1]-num[i-2];
}
}
scanf("%d",&m);
int tmp;
while(m--)
{
scanf("%d",&tmp);
tmp++;
printf("%d\n",num[tmp]);
}
}
else // only this is uncertain
{
for(i=1;i<=n;i++)
{
te1[i]=te2[i]=num[i];
}
int min1,min2;
te1[1]=b[1]; te1[2]=0;
te2[1]=0; te2[2]=b[1];
min1=min2=0;
for(i=4;i<=n;i++)
{
if(i%3==0) continue;
te1[i]=b[i-1]-te1[i-2]-te1[i-1];
min1=min(min1,te1[i]);
te2[i]=b[i-1]-te2[i-1]-te2[i-2];
min2=min(min2,te2[i]);
}
int tmp;
scanf("%d",&m);
while(m--)
{
scanf("%d",&tmp);
tmp++;
if(tmp%3==1) printf("%d\n",te1[tmp]+min1);
else if(tmp%3==2) printf("%d\n",te2[tmp]+min2);
else printf("%d\n",num[tmp]);
}
}
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: