原题戳这里

题意: 有一未知列数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]+a[n]

还知道a数列中一些数的值(可以全部不知道)

   询问一些数 可能的最大值是多少。

首先,可以根据s数组求出a[i]的值(i为3 的倍数) answer[3k]=s[3k-1]-s[3k-2]+a[3k-3];

其次,要是知道连续两个数a[i] ,a[i+1],或者a[i],a[i+1],那么就能确定整个序列。,问题解决,直接回复 询问即可。

最后,要是不能确定整个序列,那么所有a[i]都是未知的(i不为3 的倍数)。下面求这些未知a[i]的可能最大值。

     求a中i=3k+1位上的最大值

1.设a[1]=s[1],则a[2]=0;

2.根据a[i]=s[i-1]-a[i-1]-a[i-2],暂时求出一个可能非法(出现负值)的序列temp。

3.找到i=3k+2位上的最小值min(min<=0) (min必不大于0是因为a[2]=0)

4.为了让a[3k+2]上的数合法,把temp[3k+1] 的数降低-min(min为负数),temp[3k+1]的数上升-min。

    这样temp就合法,且temp[3k+1]为最大,temp[3k+2]为最小,取temp[3k+1]作为3k+1位上的答案。

answer[3k+1]=temp[3k+1]+min;

    求a中i=3k+2位上的最大值

1.设a[1]=0;a[2]=s[1];

2.上同

3.找到i=3k+1位上的最小值min

4.answer[3k+2]=temp[3k+2]+min;

    一个answer数组就能离线地处理这些询问了。

 PWW学姐问这么算出来为什么是最大而且合法的,当初给她的解释是在求i=3k+1时,先把temp[3k+1]做成最大,temp[3k+2]略显非法,(这时temp[3k+1]肯定是最大的),同时把temp[3k+1]做最小地牺牲(即降低一个值),使得temp[3k+2]也是合法的。同时这个牺牲显然也是最小的。所以temp[3k+1]经过调整后肯定是最大的。因为是最大的,所以temp[3k+1]肯定是非负的,否则肯定是数据错了。

当然这样是毛估估的。。。(懂“毛估估”这个词么?就是在简单得在心里蹭蹭。“蹭蹭”:=“想一想”)

证明最大性质的证明过程:

 假设在3k+1这个位置的最大值不是temp[3k+1] ,而是m,则设dis=m-temp[3k+1] (dis>0)。

此时在3k+2这个位置的值应该为temp[3k+2]-dis   (temp[3k+1]+temp[3k+2] 为定值)

同理3k+4,这个位置的值应该为temp[3k+2]+dis  (temp[3k+2]+temp[3k+4]为定值)

即每个位置的值是temp中所有3k+1位加dis,3k+2位减dis.

而temp[3k+2]至少有一个数为0(算法流程里体现了),这是这个位置的数为-dis,负数,矛盾,非法,不成立。

证毕。

PS:看到我的两个小队友的blog了,感觉略感落伍,以前以为大牛才能有blog。谨以此文,纪念我的第一篇公开解题报告。

代码略难看。。。(羞涩)

#include <stdio.h>
#include <string.h>
#define MAXN 100005
#define max(a,b) a>b? a:b
int n,m;
int tell[MAXN],s[MAXN];
int query[];
int a[MAXN];
int ansmax[MAXN],ansmin[MAXN];
int temp[MAXN];
void fuck() //这种情况最恶心了,比赛就是写这种情况来不及了。。诅咒之
{
temp[]=s[];// 3k+1位最大
temp[]=;
int i;
for (i =; i<=n; i++)
temp[i]=s[i-]-temp[i-]-temp[i-];
int min=0x7ffffff;
for (i=; i<=n; i=i+)
if (min > temp[i])
min = temp[i];
for (i=; i<=n; i=i+)
ansmax[i]=temp[i]+min;
temp[n]=s[n];//3k+2位最大
temp[n-]=;
for (i =n-; i>=; i--)
temp[i]=s[i+]-temp[i+]-temp[i+];
min=0x7ffffff;
for (i=; i<=n; i=i+)
if (min > temp[i])
min = temp[i];
for (i=; i<=n; i=i+)
ansmax[i]=temp[i]+min;
for (i = ; i<n; i=i+)
ansmax[i]=temp[i];
ansmax[n]=max(ansmax[n],temp[n]+min);
for (i=; i<=m; i++)
printf("%d\n",ansmax[query[i]+]);
}
void work()
{
int i=,j=,k;
memset(a,-,sizeof(a));
a[]=;
while (j<=n) //顺序3k位置的值
{
a[j] = s[j-]-s[j-]+a[j-];
j+=;
}
j = n-;
a[n+]=;
while ( j>=) //逆序3k位置的值
{
a[j] = s[j+]-s[j+] +a[j+];
j-=;
}
for (i=; i<=n; i++)
if (tell[i] != -)
a[i]=tell[i];
int flag=true;
printf("\n");
for (i= ;i+ <= n; i++) //a[i],a[i+2]已知,求a[i+1]
if ( a[i] != - && a[i+] != -)
a[i+]=s[i+]-a[i]-a[i+];
for ( i = ; i <n && flag; i++)//检测是否有连续两个数存在的情况
if (a[i]!= - && a[i+] !=-)
{
flag=false;
j=i;
for (k=i-; k>=; k--)
a[k] =s[k+]-a[k+]-a[k+];
for (k=i+; k<=n; k++)
a[k]= s[k-]-a[k-]-a[k-];
}
if (!flag) //如果有就ok了
for (k=; k<=m; k++)
printf("%d\n",a[query[k]+]);
if ( flag )//没有连续两个数。
fuck();
int main()
{
int i,j;
while (scanf("%d",&n)!=EOF)
{
for (i=; i<=n; i++)
scanf("%d",&tell[i]);
for (i=; i<=n; i++)
scanf("%d",&s[i]);
scanf("%d",&m);
for (i=; i <=m; i++)
scanf("%d",&query[i]);
work();
}
return ;
}

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

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

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

  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. sublime右键菜单,anaconda设置

    1.sublime_addright.inf [Version]Signature="$Windows NT$" [DefaultInstall]AddReg=SublimeTex ...

  2. strcpy & memcpy区别

    这两个经常使用的函数,主要区别有: strcpy 返回值是char *, strcpy(x1, x2); x1 x2必须都是char* 类型 memcpy(x1, x2, sizeof(xx)); m ...

  3. 原型链、构造函数、箭头函数、se6数组去重

    原型链 例子如下: var arr = [1, 2, 3]; 其原型链为:arr ----> Array.prototype ----> Object.prototype ----> ...

  4. Luogu P2922 秘密消息

    原题 P2922 [USACO08DEC]秘密消息Secret Message 题目描述 Bessie is leading the cows in an attempt to escape! To ...

  5. 46.颜色+品牌下钻分析时按最深层metric进行排序

    主要知识点: 在做下钻分析时的排序     需求,以颜色进行bucket,这里bucket里面的doc以其各品牌的平均价格排序,     GET /tvs/sales/_search { " ...

  6. -------------Django-----URLS路由

    一.相约Django. 1.Django的特点:Django定义了服务分布.路由映射.模板编程.数据处理的一套完整的功能. (1)集成数据访问组件:Django的model层自带数据库ORM组件. ( ...

  7. mongoDB全文索引

    相关文章:php使用Coreseek实现全文索引 Introduction Mongo provides some functionality that is useful for text sear ...

  8. 洛谷 P4198 BZOJ 2957 楼房重建

    题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些事件发生在一个 ...

  9. mysql :=和=的区别

    :=和=的区别 = 只有在set和update时才是和:=一样,赋值的作用,其它都是等于的作用.鉴于此,用变量实现行号时,必须用:= := 不只在set和update时时赋值的作用,在select也是 ...

  10. codevs 1700 施工方案第二季

    1700 施工方案第二季 2012年市队选拔赛北京  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description c国边防 ...