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. 1837. Isenbaev's Number(floyd)

    1837 被数据结构部分打击的不行了 换地 刷点简单的 图论第一题 floyd水过 #include <iostream> #include<cstdio> #include& ...

  2. [POJ 2356] Find a multiple

    Find a multiple Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6535   Accepted: 2849   ...

  3. ZOJ 2760 How Many Shortest Path (不相交的最短路径个数)

    [题意]给定一个N(N<=100)个节点的有向图,求不相交的最短路径个数(两条路径没有公共边). [思路]先用Floyd求出最短路,把最短路上的边加到网络流中,这样就保证了从s->t的一个 ...

  4. acdream 小晴天老师系列——晴天的后花园 (暴力+剪枝)

    小晴天老师系列——晴天的后花园 Time Limit: 10000/5000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) ...

  5. 【 随笔 】 D3 难吗?

    有不少朋友说学 D3 挺难的.为什么呢?想写一篇文章分析分析. 1. D3 出现的背景 D3.js 是 Github 上的一个开源项目,用于数据可视化.作者是 Mike Bostock,纽约时报的工程 ...

  6. Oracle查看LogMiner的详解

    Oracle数据库查看日志的方法很多,我们可以根据SQL语句来实现,也可以通过日志查看工具LogMiner来实现,本文我们主要就介绍了这一过程,接下来就让我们一起来了解一下吧.        一.Or ...

  7. 【转】iOS 宏(define)与常量(const)的正确使用-- 不错

    原文网址:http://www.jianshu.com/p/f83335e036b5 在iOS开发中,经常用到宏定义,或用const修饰一些数据类型,经常有开发者不知怎么正确使用,导致项目中乱用宏与c ...

  8. android Bitmap getByteCount和getRowBytes

    今天做图像缓存需要计算Bitmap的所占的内存空间,于是研究了下Bitmap关于内存占用的API 1.getRowBytes:Since API Level 1,用于计算位图每一行所占用的内存字节数. ...

  9. android和ios的系统特性区别

    1.  删除:android是长按,ios为滑动/或者进入编辑模式 2.  android:应用内返回键,保证用户停留在应用程序中:硬件返回键可以让用户退出应用程序 3.  剪切/粘贴/选择等文本操作 ...

  10. bzoj 1835 [ZJOI2010]base 基站选址(DP+线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1835 [题意] 有n个村庄,每个村庄位于d[i],要求建立不多于k个基站,在第i个村庄 ...