2013 ACM/ICPC Asia Regional Changsha Online J Candies
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的更多相关文章
- 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] ...
- 2013 ACM/ICPC Asia Regional Changsha Online G Goldbach
比赛的时候,被题目误导了,题目最后说结果可能很大,要取模,那时就想直接求会TLE的!!! 赛后才知道,坑啊………… 代码如下: #include<iostream> #include< ...
- 2013 ACM/ICPC Asia Regional Changsha Online - G(DP)
第一眼就想到DP,然后想了N久就想不到可以不重算的DP 最后没办法了 先算出来 再去重.. 因为最多只有三个 对于三个来说有三种组合情况 x+y+z, x*y*z, x*y+z 那要么 x,y,z都 ...
- [2013 ACM/ICPC Asia Regional Hangzhou Online J/1010]hdu 4747 Mex (线段树)
题意: + ;];;;], seg[rt << | ]);)) * fa.setv;) * fa.setv;;], seg[rt << | ], r - l + );;, ...
- 2013 ACM/ICPC Asia Regional Changsha Online - C Color Representation Conversion
这个纯粹是一个细节题啊!!! 由于某个地方的浮点数比较写错了,WA了无数次啊…… 代码如下: #include<iostream> #include<cstdio> #incl ...
- 2013 ACM/ICPC Asia Regional Changsha Online - E
第一个被板刷的题 取余 依次算在周几 #include <iostream> #include<cstdio> #include<cstring> #include ...
- 2013 ACM/ICPC Asia Regional Changsha Online–C (模拟)
题目描述 略... 题解 注意控制精度即可....变量全部定义成double,结果round就行....妈蛋....被这题目恶心死了.... 代码: #include <iostream> ...
- 2013 ACM/ICPC Asia Regional Changsha Online – C题 Color Representation Conversion (坑爹模拟题)
题意:给你三种颜色表示模式,RGB,HSV和HSL,实现任意模式之间两两转化. 1.最好别看题目中给的转化公式描述,我觉得叙述的一点也不清楚,看维基百科,把维基百科上的公式一句一句翻译过来就好 2.在 ...
- 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 ...
随机推荐
- function 的声明
<?php function test() { echo "abc"; } test(); ?> 结论: 一 编译 a.对 函数声明进行词法分析和语法分析:在语法分析中 ...
- 【MySql存储过程】DATE_ADD用法
定义和用法 DATE_ADD() 函数向日期添加指定的时间间隔. 语法 DATE_ADD(date,INTERVAL expr type) date 参数是合法的日期表达式.expr 参数是您希望添加 ...
- linux shell if 参数
shell 编程中使用到得if语句内判断参数 –b 当file存在并且是块文件时返回真 -c 当file存在并且是字符文件时返回真 -d 当pathname存在并且是一个目录时返回真 -e 当path ...
- liunx环境下安装mysql数据库
一:如果你的机器上之前安装有mysql数据库,先进行卸载 (1)需要先将它的文件删除 (2)同时注意删除老板本的etc/my.cnf文件和/etc/mysql目录,这两个文件控制的是mysql的一些配 ...
- 【转】10分钟搭建NDK的Android开发环境
原文网址:http://blog.csdn.net/u012176591/article/details/23018913 作者:金良(golden1314521@gmail.com) csdn博客: ...
- 常用高度——获取浏览器窗口的高度(jquery和js)
一:针对浏览器的常用高度 jquery的用法: <script type="text/javascript"> $(document).ready(function() ...
- AngularJS with MVC4 CRUD
CRUD using MVC Web API and AngularJS In this article I am going to demonstrate about how can we crea ...
- [C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例
本文我们来学习一下在Entity Framework中使用Context删除多对多关系的实体是如何来实现的.我们将以一个具体的控制台小实例来了解和学习整个实现Entity Framework 多对多关 ...
- Asp.Net 高性能框架 SqlSugar.ORM 2.3
一.前言 SqlSugar从去年到现在已经一年了,版本从1.0升到了现在的2.3 ,这是一个稳定版本 ,有数家公司已经项目上线,在这里我将SqlSugar的功能重新整理成一篇新的贴子,希望大家喜欢. ...
- alibaba笔试3
16.C 17.这道的取值范围应该是1到1023.这样就选择A 18.B 圆桌问题1个人拿出来当key 19.D 类似于https://apollozhao.wordpress.com/categor ...