送分题(songfen)

Time Limit:1000ms   Memory Limit:128MB

题目描述

LYK喜欢干一些有挑战的事,比如说求区间最大子段和。它知道这个题目有O(n)的做法。于是它想加强一下。

也就是说,LYK一开始有n个数,第i个数字是ai,它找来了一个新的数字P,并想将这n个数字中恰好一个数字替换成P。要求替换后的最大子段和尽可能大。

LYK知道这个题目仍然很简单,于是就扔给大家来送分啦~

注:最大子段和是指在n个数中选择一段区间[L,R](L<=R)使得这段区间对应的数字之和最大。

输入格式(songfen.in)

第一行两个数n,P。

接下来一行n个数ai。

输出格式(songfen.out)

一个数表示答案。

输入样例

5 3

-1 1 -10 1 -1

输出样例

5

样例解释

将第三个数变成3后最大子段和为[2,4]。

数据范围

对于30%的数据n<=100。

对于另外30%的数据ai,P>=0。

对于100%的数据n<=1000,-1000<=ai,P<=1000。

Note:提前AK的同学可以想一想O(n)的做法。

枚举改哪个,再做O(n)的最大子段和。总复杂度:O(n²)

O(n)做法用栈,不会。。。。。。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,p,ans,tmp,out=-1e8;
int dp[],a[];
int main()
{
freopen("songfen.in","r",stdin);
freopen("songfen.out","w",stdout);
scanf("%d%d",&n,&p);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
int x;
for(int k=;k<=n;k++)
{
tmp=a[k]; a[k]=p;
for(int i=;i<=n;i++)
{
x=a[i];
if(dp[i-]+x>=x) dp[i]=dp[i-]+x;
else dp[i]=x;
if(dp[i]>ans) ans=dp[i];
}
out=max(out,ans);
a[k]=tmp;
memset(dp,,sizeof(dp));
ans=-1e8;
}
printf("%d",out);
}

错误的O(n):

dp[i][0]到了第i个,第i个没有改

dp[i][1]到了第i个,第i个改了

dp[i][]=max(dp[i-][]+x,dp[i-][]+x);
dp[i][]=max(dp[i][],x);
dp[i][]=max(dp[i-][]+p,p);
ans=max(ans,dp[i][]);
ans=max(ans,dp[i][]);

错因:不能保证之修改一次

第i个改了,第i+1个的不改由第i个的改和不改转移,第i+2个的改由第i+1个的不改转移,这就改了两次

树状数组(lowbit)

Time Limit:1000ms   Memory Limit:128MB

题目描述

这天,LYK在学习树状数组。

当它遇到一个叫lowbit的函数时有点懵逼。lowbit(x)的意思是将x分解成二进制,它的值就是 ,其中k是最小的满足(x & )>0的数。(&是二进制中的and运算)

LYK甚至知道lowbit(x)=(x&-x)。但这并没什么用处。

现在LYK有了n个数字,为了使自己更好的理解lowbit是什么意思。它想对所有n^2个二元组求lowbit。具体的,对于一个二元组(ai,aj),它的值为lowbit(ai xor aj) (xor表示异或的意思),那么总共有n^2对二元组,LYK想知道所有二元组的值加起来是多少。

这个答案可能很大,你只需输出这个值对1000000007取模后的结果就可以了。

输入格式(lowbit.in)
    第一行一个数n,表示有n个这样的数字。

第二行n个数ai。

输出格式(lowbit.out)

一个数表示答案。

输入样例

5

1 2 3 4 5

输出样例

32

数据范围

对于30%的数据n<=1000。

对于另外10%的数据ai<=1。

对于再另外10%的数据ai<=3。

对于再再另外20%的数据ai<1024。

对于100%的数据1<=n<=100000,0<=ai<2^30。

分治

二进制最后一位是0的放左边,最后一位是1的放右边,对答案的贡献为两者个数的乘积* 2^0

对于左边的和右边的,分别做:

二进制倒数第二位是0的放左边,倒数第二位是1的放右边,对答案的贡献为两者个数的乘积* 2^1

。。。。。。

边界条件1: 没有数了

边界条件2:二进制位数>30 (非常重要,他保证了最多分治30层,高效解决应重复出现的数)

#include<cstdio>
#define mod 1000000007
#define N 100001 using namespace std;
int n;
int a[N],b[N];
long long ans;
void divide(int l,int r, int k)
{
if(l>=r || k>) return;
int L=l,R=r;
for(int i=l;i<=r;i++)
if(a[i] & (<<k)) b[L++]=a[i];
else b[R--]=a[i];
ans=(ans+1ll*(L-l)*(r-R)*(<<k))%mod;
for(int i=l;i<=r;i++) a[i]=b[i];
if(l!=L) divide(l,L-,k+);
if(r!=R) divide(R+,r,k+);
}
int main()
{
freopen("lowbit.in","r",stdin);
freopen("lowbit.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
divide(,n,);
printf("%I64d",(ans<<)%mod);
}

防AK好题(fangak)

Time Limit:1000ms   Memory Limit:128MB

题目描述

LYK觉得,这场比赛到目前为止,题目都还太简单了。

于是,它有意在最后一题为难一下大家。它定义了一个非常复杂的运算。具体的,一开始它有n个数ai。令c表示最大的相邻两个数的差。也就是说c=max{| |}(i∈[2,n])。这个值显然是一个常数。

但是问题来了,LYK为了刁难你们,它想改变其中k个数,也就是说将其中至多k个数变成任意的数,并且LYK要求这么做完后c的值尽可能小。

输入格式(fangak.in)

第一行两个数n,k。

接下来一行n个数表示ai。

输出格式(fangak.out)

一个数表示最小的k的值。

输入样例

6 3

1 2 3 7 8 9

输出样例

1

数据范围

对于20%的数据n<=8。1<=ai<=8。

对于另外20%的数据k=1。

对于再另外20%的数据ai一开始是单调递增的。

对于再再另外20%的数据n<=100。

对于100%的数据1<=k<=n<=1000,-10^9<=ai<=10^9。

二分+DP

dp[i] 表示 到第i个数, 在满足条件(任意两个相邻的数,差<=mid)的情况下,并且i没有被改变,最少改变多少数字。

状态转移: dp[i]=dp[k]+(i-k-1)    k=0~i-1  表示 k+1~i-1 都被改变了

转移条件:mid*(k-i)>=abs(a[k]-a[i])  k~i这段区间能满足条件

只管修改了多少个数,至于改成了什么,不关心

最大的差最小,就是让数均匀分布,那么二分最大的差,条件就是差*个数>= | 区间右边-左边 |

也就是假设区间左右端点都不改变,而区间内部都改变

区间内部都改变是最差的情况,他会随着区间左端点的移动而变小

个人感觉:这是一道区间DP

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1001
using namespace std;
int n,k,maxn=-2e9,minn=2e9;
int a[N],dp[N+];
bool check(int mid)
{
dp[]=;
for(int i=;i<=n;i++)
{
dp[i]=n+;
for(int j=i-;j>=;j--)
if(!j || mid*(i-j)>=abs(a[i]-a[j])) dp[i]=min(dp[i],dp[j]+i-j-);
}
for(int i=;i<=n;i++)
if(dp[i]+n-i<=k) return true;
return false;
}
int main()
{
freopen("fangak.in","r",stdin);
freopen("fangak.out","w",stdout);
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++) scanf("%d",&a[i]),maxn=max(maxn,a[i]),minn=min(minn,a[i]);
int l=,r=maxn-minn,mid,ans;
while(l<=r)
{
mid=l+r>>;
if(check(mid)) ans=mid,r=mid-;
else l=mid+;
}
printf("%d",ans);
}

2017 济南综合班 Day 1的更多相关文章

  1. 2017 济南综合班 Day 7

     a 两个指针L.R R开始指向恰好[R,n]有不超过k个逆序对的地方 随着L的右移,R指针只会右移 逆序对有2部分 1.L左侧与其他位置形成的逆序对 2.R右侧与其他位置形成的逆序对 用树状数组分别 ...

  2. 2017 济南综合班 Day 6

    循环移动 (cyclic.cpp/c/pas) (1s/256M) 问题描述 给出一个字符串S与N个操作.每个操作用三元组(L, R, K)进行描述:操作将字符串第L个到第R个位置构成的子串循环移动K ...

  3. 2017 济南综合班 Day 5

    毕业考试 (exam.cpp/c/pas) (1s/256M) 问题描述 快毕业了,Barry希望能通过期末的N门考试来顺利毕业.如果他的N门考试平均分能够达到V分,则他能够成功毕业.现在已知每门的分 ...

  4. 2017 济南综合班 Day 4

    T1 外星人 二维前缀和 #include<cstdio> #define N 1001 using namespace std; bool v[N][N]; int sum[N][N]; ...

  5. 2017 济南综合班 Day 3

    T1  黑化 题意: 求一个字符串是否可能包含另一个字符串 字符串中的?可以匹配任意字母 可能输出 God bless You! 一定不可能 输出 Game Over! 计算fail数组时,fail数 ...

  6. 2017 济南综合班 Day 2

    木棍(stick) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有很多木棍,具体的,总共有n根,且每根木棍都有一个长度.为了方便起见,我们可以用一个正 ...

  7. 2017 济南精英班 Day1

    不管怎么掰都是n*m-1 #include<cstdio> using namespace std; int main() { freopen("bpmp.in",&q ...

  8. JavaScript脚本语言基础(四)

    导读: JavaScript和DOM DOM文档对象常用方法和属性 DOW文档对象运用 JSON数据交换格式 正则表达式 1.JavaScript和DOM [返回] 文档对象模型(Document O ...

  9. JeeSite(2):导入数据,进入系统

    本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/50954485 未经博主同意不得转载. 博主地址是:http://blog.csd ...

随机推荐

  1. 衡量生活成本:消费者价格指数(CPI, Consumer Price Index)

    经济学家应该如何把经济中的许多价格加总成一个单一指数,从而能够衡量价格的总体水平呢?他们可以简单地计算所有产品与服务价格的平均值,但是这种方法的不足之处是把所有的产品与服务等同处理.由于人们购买的鸡比 ...

  2. java通过控制鼠标实现屏幕广播

    在java实现屏幕共享的小程序中提到截取屏幕时是没鼠标,为了看到教师端界面上的鼠标,可以在截取屏幕的时候,把鼠标绘制到每一张截图上去,但是由于截图的时候是一张张截取的,所以看到的鼠标难免会有点卡,之前 ...

  3. 搭建独立域名博客 -- 独立域名博客上线了 www.hanshuliang.com

    博客是安装在阿里云的服务器上. 小结 : -- 进入数据库命令 :mysql -uroot -p123456 ; -- 检查nginx配置语法 :.../nginx/sbin/nginx -t; -- ...

  4. java—连连看GUI

    1.连连看棋盘图形化 package Link; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; impo ...

  5. lintcode-197-排列序号

    197-排列序号 给出一个不含重复数字的排列,求这些数字的所有排列按字典序排序后该排列的编号.其中,编号从1开始. 样例 例如,排列 [1,2,4] 是第 1 个排列. 思路 参考http://www ...

  6. dpr dproj 扩展名区别,dprdproj

    这段时间用xe6,看了下目录下生成的一些文件,因为隐藏了扩展名,看到两个名字一样的文件,右键属性看了下,同名但扩展名不同,百度了下区别,没有找到答案,问群里的朋友才知道区别,特此记录下来: dpr:D ...

  7. Spring MVC实践

    MVC 设计概述 在早期 Java Web 的开发中,统一把显示层.控制层.数据层的操作全部交给 JSP 或者 JavaBean 来进行处理,我们称之为 Model1: 出现的弊端: JSP 和 Ja ...

  8. matlab eval【转】

    Matlab 简单谈谈EVAL函数的用法 EVAL(s)相当于把字符串s的内容作为语句来执行. 比如:eval('a=3*5') 和直接在command 窗口中输入 a=3*5 等效 eval 一个经 ...

  9. 配置ssh

    1. 实现只允许特定用户ssh登录   1.1. 直接配置ssh来实现 编辑/etc/ssh/sshd_config,在末尾添加如下一行 AllowUsers user1 user2 user3 然后 ...

  10. 【刷题】BZOJ 1717 [Usaco2006 Dec]Milk Patterns 产奶的模式

    Description 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠.我们称之为一个"模式". ...