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]+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的更多相关文章
- 2013 ACM/ICPC Asia Regional Changsha Online J Candies
AC了,但是不知道为什么,但是恶心的不得了~最近写代码,思路都非常清晰,但是代码各种bug~T.T~说说思路吧:二分~330ms~ 小队友fribbi的思路是离线250msAC~ 预处理solve函数 ...
- 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 ...
随机推荐
- css流光效果
css流光效果1: <!DOCTYPE html> <html> <head> <title>ww</title> </head> ...
- STL源码分析之迭代器
前言 迭代器是将算法和容器两个独立的泛型进行调和的一个接口. 使我们不需要关系中间的转化是怎么样的就都能直接使用迭代器进行数据访问. 而迭代器最重要的就是对operator *和operator-&g ...
- 学习MPI并行编程记录
简单的MPI程序示例 首先,我们来看一个简单的MPI程序实例.如同我们学习各种语言的第一个程序一样,对于MPI的第一个程序同样是"Hello Word". /* Case 1 he ...
- C C++ POSIX 的一些 IO 操作
一些 C C++ POSIX 的 IO 操作总结 文件-内存之间 内存-内存之间 POSIX 有无缓冲的 IO 操作 对文件的操作,读文件至内存,从内存写至文件 // 读文件至内存buf中 void ...
- 1.scrapy爬取的数据保存到es中
先建立es的mapping,也就是建立在es中建立一个空的Index,代码如下:执行后就会在es建lagou 这个index. from datetime import datetime fr ...
- IE7浏览器下去除flash动画边框问题
<object width="100%" height="100%" data="/templates/default/swf/guide.sw ...
- springboot优雅关机
Spring boot 2.0 之优雅停机 rabbitGYK 关注 2018.05.20 18:41* 字数 1794 阅读 2638评论 0喜欢 22 spring boot 框架在生产环境使用 ...
- Introduction(本书简介)
本书简介 本书将从三个方面权威的阐述如何提高.net app 性能问题: 验证.测量性能指标,然后辨别它是否超过度量 从内存管理.网络.I/O.并发等方面提高应用程序的性能 通过CLR的详细的设计细节 ...
- Linxu用户管理(转)
说明:用户管理的操作涉及root权限,所以以下实例中应该使用sudo或者root用户进行操作. 背景: Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管 ...
- find -perm命令
http://www.2cto.com/os/201205/130125.html find -perm,根据文件的权限来查找文件,有三种形式: find -perm mode find -perm ...