AC了,但是不知道为什么,但是恶心的不得了~最近写代码,思路都非常清晰,但是代码各种bug~T.T~
说说思路吧:二分~330ms~  小队友fribbi的思路是离线250msAC~

预处理solve函数(让能求出来的尽量都求出来)-->a[2]和a[n-3]已知

①已知a[i]可知a[i+3]
②已知a[i] a[i-1] 或者a[i] a[i+1]或者a[i+1] a[i-1]可知全部

③已知a[0]或a[1]或a[n-2]或a[n-1]可知全部

提问:

①已知则直接输出,不存在a[i+1] a[i-1]已知a[i]未知这种情况,solve已处理

②已知前面或者后面的一个 二分检测(因为至少a[2+2*k],k=0,1,2...已知)

③提问是0位置或者n-1位置 二分检测

检测时候用test数组,因为检测时有赋值,不能对num数组赋值,否则会影响下次的测试~

巨恶心的代码(自己给把自己恶心到了)~

 #include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 100000
#define back num[i]=sum[i-1]-num[i-1]-num[i-2]
#define front num[i]=sum[i+1]-num[i+1]-num[i+2]
int num[N+];
int sum[N+];
int test[N+];
int n;
int cal(int id){//make sure id>=2&&id<n-2
//return 1 O(N)全部求出来了,return 0,代表只求出了一部分的数字
int i,least;
if(num[id-]!=-){//左边已知
for(i=id-;i>=;i--) front;for(i=id+;i<n;i++) back;return ;
}
else if(num[id+]!=-){//右边已知
for(i=id-;i>=;i--) front;for(i=id+;i<n;i++) back;return ;
}
else{//左右都未知
least=sum[id+]-num[id];
for(i=id+;i<n&&num[i]==-;i+=){
num[i]=sum[i-]-least;if(i+<n) least=sum[i+]-num[i];
}
least=sum[id-]-num[id];
for(i=id-;i>&&num[i]==-;i-=){
num[i]=sum[i+]-least;if(i->=) least=sum[i-]-num[i];
}
return ;
}
}
void solve(){
int i,j;
if(num[]!=-){num[]=sum[]-num[];for(i=;i<n;i++) back;}
else if(num[]!=-){num[]=sum[]-num[];for(i=;i<n;i++)back;}
else if(num[n-]!=-){num[n-]=sum[n-]-num[n-];for(i=n-;i>=;i--)front;}
else if(num[n-]!=-){num[n-]=sum[n-]-num[n-];for(i=n-;i>=;i--)front;}
else for(j=,i=;i<n-&&!j;i++) if(num[i]!=-) j=cal(i);
//j相当于flag,flag=1代表已经全部求出,不需要继续循环了
return ;
}
int backword(int i,int id){
for(;i<n;i++){
if(test[i]==-) test[i]=sum[i-]-test[i-]-test[i-];
if(test[i]<) if(test[i]<) return (i%==id%)?:;
}
return ;//合法
}
int forward(int i,int id){
for(;i>=;i--){
if(test[i]==-) test[i]=sum[i+]-test[i+]-test[i+];
if(test[i]<) return (i%==id%)?:;
}
return ;//合法
}
bool check(int id,int key,int type){
int i,j;
for(i=;i<n;i++) test[i]=num[i];test[id]=key;
//test[i-1]已知 test[i]测试 向两边检查
if(type==){
if(backword(id+,id)==||forward(id-,id)==) return ;
}
//test[i+1]已知 test[i]测试 向两边检查
else if(type==){
if(backword(id+,id)==||forward(id-,id)==) return ;
}
//test[0]测试,test[1]未知,test[2]已知 向后检查
else if(type==){
test[]=sum[]-test[]-test[];
if(backword(,id)==) return ;
}
//test[n-1]测试,test[n-2]未知,test[n-3]已知 向前检查
else {
test[n-]=sum[n-]-test[n-]-test[n-];
if(forward(n-,id)==) return ;
}
return ;
}
int bin(int type,int id){//二分检查最大值,能大则大
int left=,right=sum[id],mid,ans=left;
while(left<=right){
mid=(left+right)/;
if(check(id,mid,type))//正好 太小
{left=mid+;ans=mid;}
else right=mid-;//太大
}
return ans;
}
int main(){
int i,j;
int p,q;
int res;
while(scanf("%d",&n)!=EOF){
for(i=;i<n;i++) scanf("%d",&num[i]);
for(i=;i<n;i++) scanf("%d",&sum[i]); num[]=sum[]-sum[];//导火索
num[n-]=sum[n-]-sum[n-];//导火索 solve();//把所有的可以计算出来的全部计算出来 scanf("%d",&q);
while(q--){
scanf("%d",&p);
if(num[p]!=-) res=num[p];//num[i]已知
else if(p->=&&num[p-]!=-) res=bin(,p);//num[i-1]已知
else if(p+<n&&num[p+]!=-) res=bin(,p);//num[i+1]已知
else if(p==) res=bin(,p);//num[0]未知,num[1]未知,num[2]已知
else if(p==n-) res=bin(,p);//num[n-1]未知,num[n-2]未知,num[n-3]已知
printf("%d\n",res);
}
}
return ;
}

2013 ACM/ICPC Asia Regional Changsha Online J Candies的更多相关文章

  1. 2013 ACM/ICPC Asia Regional Changsha Online - J

    原题戳这里. 题意: 有一未知列数a1,a2,a3.....an, 已知s[i]=a[i-1]+a[i]+a[i]  (1<i<n) s[1]=a[1]+a[2]; s[n]=a[n-1] ...

  2. 2013 ACM/ICPC Asia Regional Changsha Online G Goldbach

    比赛的时候,被题目误导了,题目最后说结果可能很大,要取模,那时就想直接求会TLE的!!! 赛后才知道,坑啊………… 代码如下: #include<iostream> #include< ...

  3. 2013 ACM/ICPC Asia Regional Changsha Online - G(DP)

    第一眼就想到DP,然后想了N久就想不到可以不重算的DP  最后没办法了 先算出来 再去重.. 因为最多只有三个 对于三个来说有三种组合情况 x+y+z, x*y*z, x*y+z 那要么 x,y,z都 ...

  4. [2013 ACM/ICPC Asia Regional Hangzhou Online J/1010]hdu 4747 Mex (线段树)

    题意: + ;];;;], seg[rt <<  | ]);)) * fa.setv;) * fa.setv;;], seg[rt <<  | ], r - l + );;,  ...

  5. 2013 ACM/ICPC Asia Regional Changsha Online - C Color Representation Conversion

    这个纯粹是一个细节题啊!!! 由于某个地方的浮点数比较写错了,WA了无数次啊…… 代码如下: #include<iostream> #include<cstdio> #incl ...

  6. 2013 ACM/ICPC Asia Regional Changsha Online - E

    第一个被板刷的题 取余 依次算在周几 #include <iostream> #include<cstdio> #include<cstring> #include ...

  7. 2013 ACM/ICPC Asia Regional Changsha Online–C (模拟)

    题目描述 略... 题解 注意控制精度即可....变量全部定义成double,结果round就行....妈蛋....被这题目恶心死了.... 代码: #include <iostream> ...

  8. 2013 ACM/ICPC Asia Regional Changsha Online – C题 Color Representation Conversion (坑爹模拟题)

    题意:给你三种颜色表示模式,RGB,HSV和HSL,实现任意模式之间两两转化. 1.最好别看题目中给的转化公式描述,我觉得叙述的一点也不清楚,看维基百科,把维基百科上的公式一句一句翻译过来就好 2.在 ...

  9. hduoj 4708 Rotation Lock Puzzle 2013 ACM/ICPC Asia Regional Online —— Warmup

    http://acm.hdu.edu.cn/showproblem.php?pid=4708 Rotation Lock Puzzle Time Limit: 2000/1000 MS (Java/O ...

随机推荐

  1. bzoj1084: [SCOI2005]最大子矩阵

    dp.状态转移方程在代码里 #include<cstdio> #include<algorithm> #include<cstring> using namespa ...

  2. 自定义一个compass可编译的目录结构

    在学习compass的过程中, 根绝文档说明,如果使用compass create myObject命令会创建一个标准的Compass项目目录结构,如下图: 此时如果使用compass compile ...

  3. SQL LEFT JOIN 关键字

    SQL LEFT JOIN 关键字 LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行. LEFT JOIN 关键 ...

  4. 【转】Android AlertDialog 点击对话框外部区域不关闭的设置

    原文网址:http://blog.sina.com.cn/s/blog_8f1c79dd0101a63u.html 在Android开发中,常常需要调用对话框,但会遇到这样一种情况,在显示对话框的时候 ...

  5. e8_4输出菲波拉契数列的前10项

    program fbnq;{输出菲波拉契数列的前10项} var a:..] of integer; i:integer; begin a[]:=; a[]:=; do a[i]:=a[i-]+a[i ...

  6. DNS(三)DNS SEC(域名系统安全扩展)

    工作需要今天了解了下DNS SEC,现把相关内容整理如下: 一.DNS SEC 简介 域名系统安全扩展(英语:Domain Name System Security Extensions,缩写为DNS ...

  7. [原]Java面试题-将字符串中数字提取出来排序后输出

    [Title][原]Java面试题-将字符串中数字提取出来排序后输出 [Date]2013-09-15 [Abstract]很简单的面试题,要求现场在纸上写出来. [Keywords]面试.Java. ...

  8. 如何实现CSS居中?–CSS居中常用方法

    来源:http://www.ido321.com/824.html 一.水平居中 1.内联元素居中:相对父级块级元素居中对齐 1: .center-children { 2: text-align: ...

  9. P2158 [SDOI2008]仪仗队 线性筛(欧拉函数和素数表)

    上三角行恰好是[1,n-1]的欧拉函数 http://www.luogu.org/problem/show?pid=2158#sub //#pragma comment(linker, "/ ...

  10. setBackgroundMusicLoop for cocos2dx

    给cocos2dx的SimpleAudioEngine加上设置背景音乐循环的方法,详见gist.