原题戳这里

题意: 有一未知列数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. Python 不定长参数、全局变量、局部变量 day4

    一.不定长参数 在函数定义中,经常会碰到*args 和**kwargs作为参数. 事实上在函数中,*和**才是必要的,args和kwargs可以用其他名称代替 *args 是指不定数量的非键值对参数. ...

  2. BUPT2017 springtraining(16) #3 ——搜索与动态规划

    题目在这里啊 A.最长上升子序列,范围很小所以写了简单的O(n^2)算法 #include <iostream> #define rep(i, j, k) for(int i = j;i ...

  3. ReportNG 替换testng获得测试报告

    1.导入reportng相关jar包

  4. sql server的数据库个数、表个数及表的数据量统计

    sql server的数据库个数.表个数及表的数据量统计   --由于今天要监控数据,急需统计实例中1有多少库2库里有多少表3每个表有多少数据 --将写好的代码贴出来,用到如下的: --sysobje ...

  5. 对SPI、IIC、IIS、UART、CAN、SDIO、GPIO的解释

    SPI SPI(Serial Peripheral Interface:串行外设接口); SPI总线由三条信号线组成:串行时钟(SCLK).串行数据输出(SDO).串行数据输入(SDI).SPI总线可 ...

  6. RPC框架分析

    RPC框架分析 常用的框架 .net(WCF)  .net中分布式框架集大成者,提供多种通信方式,多种安全策略的调用(配置繁琐). java 1.RMI JDK原生(严格的说来算不上框架). 2.Du ...

  7. 使用汇编分析c代码的内存分布

    arm平台下使用反汇编分析c内存分布: arm:使用arm-linux-objdump命令将编译完毕之后的elf文件,进行反汇编. 之后重定向到tmp.s文件里. 第一步变量例如以下c文件. vim ...

  8. 【搜索】 HDU 3533 Escape BFS 预处理

    要从0,0 点 跑到m,n点  路上会有k个堡垒发射子弹.有子弹的地方不能走,子弹打到别的堡垒就会消失,或者一直飞出边界(人不能经过堡垒 能够上下左右或者站着不动 每步都须要消耗能量  一共同拥有en ...

  9. HashMap源代码剖析

    大部分思路都是一样的 .仅仅是一些细节不一样.源代码中都标了出来.jdk容器源代码还是挺简单的. public class HashMap<K,V> extends AbstractMap ...

  10. 《解读window核心编程》 之 注冊表

    1 注冊表的作用及组织形式 Windows系统使用注冊表来存储系统和应用程序配置数据.非常多系统和应用程序重要的配置的信息都存储在注冊表中. 注冊表是一种以树型结构组织的数据库.树的每个节点称 作键( ...