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 ...
随机推荐
- URAL1501. Sense of Beauty(记忆化)
链接 dfs+记忆化 对于当前状态虽然满足和差 但如果搜下去没有满足的情况也是不可以的 所以需要记忆化下 #include <iostream> #include<cstdio> ...
- LeeCode Algorithm #3 Longest Substring Without Repeating Characters
一开始以为是不连续的,其实要求子串是连续的.想法:two-pointer O(n)时间,再借助256大小的int数组.两个下标i,j(i<=j).对于i=0,找到最右侧的字符不重复的下标的后一位 ...
- NLog 传递参数
用NLog记文件日志,一般都用{$basedir}变量,把日志记在运行的目录或者它的子目录下,遇到要写在其他目录的下,看了下Nlog找到用环境变量传参数. .net 里写 Environment.Se ...
- bzoj1098 1301
这两题很类似,都是在补图上搜索 但是由于补图太大我们不能建出来 考虑先从一个点搜,每次搜可以搜的点, 然后维护一个链表,记录当前还没有搜过的点,搜过之后从链表中删除即可 type node=recor ...
- bzoj1084: [SCOI2005]最大子矩阵
dp.状态转移方程在代码里 #include<cstdio> #include<algorithm> #include<cstring> using namespa ...
- [POJ 3420] Quad Tiling
Quad Tiling Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3495 Accepted: 1539 Des ...
- http://www.cnblogs.com/youfan/articles/3216816.html
我对 CodeFirst 的理解,与之对应的有 ModelFirst与 DatabaseFirst ,三者各有千秋,依项目实际情况自行选择. 1.开发过程中先行设计数据库并依此在项目中生成 *.dbm ...
- MS-SQL索引类型
一.索引的概念 索引就是加快检索表中数据的方法.数据库的索引类似于书籍的索引.在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息.在数据库中,索引也允许数据库程序迅速地找到表中的 ...
- MSP430F149流水灯闪烁以及数码管的显示
今天下午写了一个流水灯闪烁的实验,总的来说,不难,因为这块板子集合的电路图没有上一块那么复杂,所以总的来说,还是比较顺手,开始的时候,出现流水灯没有流转的现象,原来是没有加入延时函数,后来经过调整,结 ...
- IGT一道笔试题
1到n连续的n个数 输入m 得出m个有序序列 比如 输入为n=5 ,m=3 则输出 543 542 541 532 531 521 432 431 421 321 当前长度为i,每个位上的取之范围为 ...