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];
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; }
相关文章推荐
- 2013 ACM/ICPC 长沙网络赛-Candies
- 2013 ACM/ICPC 长沙网络赛-Goldbach
- 2013 ACM/ICPC 长沙网络赛J题
- 2013 ACM/ICPC 长沙现场赛 C题 - Collision (ZOJ 3728)
- ZOJ 3732 2013 ACM/ICPC 长沙赛区现场赛G题 Graph Reconstruction (图论)
- 2013 ACM/ICPC 长沙网络赛B题解题报告
- 2013 ACM/ICPC 长沙现场赛 A题 - Alice's Print Service (ZOJ 3726)
- 2013 ACM/ICPC 长沙网络赛-Goldbach
- HDU 4565 So Easy!(思想+矩阵快速幂)——2013 ACM-ICPC长沙赛区全国邀请赛
- HDU 4741 Save Labman No.004 2013 ACM/ICPC 杭州网络赛
- 2013 ACM/ICPC 长沙赛区湖大全国邀请赛 A题(6.1修订)
- HDU 4565 -- So Easy! 数学 && 2013 ACM-ICPC 长沙赛区全国邀请赛 A题
- HDU 4572 Bottles Arrangement(数学推公式)——2013 ACM-ICPC长沙赛区全国邀请赛
- HDU 4569 Special equations(枚举+数论)(2013 ACM-ICPC长沙赛区全国邀请赛)
- 2013 ACM-ICPC长沙赛区全国邀请赛So Easy! && 2015 ACM/ICPC Asia Regional Shenyang Online-Best Solver
- zoj 3813 Alternating Sum(2014ACMICPC Regional 牡丹江站网络赛 E)
- The 2013 ACM-ICPC Asia Changsha Regional Contest C Zoj Collision
- zoj 3813 Alternating Sum(2014ACMICPC Regional 牡丹江站网络赛 E)
- HDU 4571 Travel in time 2013 ACM-ICPC长沙赛区全国邀请赛G题
- HDU 4568 Hunter(最短路径+DP)(2013 ACM-ICPC长沙赛区全国邀请赛)