送分题

(songfen)
e Time Limit: 10 00ms y 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)的做法。

  1. /*
  2. 先用前缀和维护原序列
  3. 然后将p与序列中的每个数做差形成新的序列,用st表维护新序列的区间最大值
  4. 枚举序列的左右端点,然后用原序列的区间和加上新序列的区间最大值更新答案
  5. */
  6. #include<iostream>
  7. #include<cstdio>
  8. using namespace std;
  9. #define maxn 1010
  10. int n,p,a[maxn],q[maxn],mx[maxn][],sum[maxn];
  11. int query(int l,int r){
  12. int k=;
  13. while(<<k+<=(r-l+))k++;
  14. return max(mx[l][k],mx[r-(<<k)+][k]);
  15. }
  16. int main(){
  17. //freopen("Cola.txt","r",stdin);
  18. freopen("songfen.in","r",stdin);
  19. freopen("songfen.out","w",stdout);
  20. scanf("%d%d",&n,&p);
  21. for(int i=;i<=n;i++){
  22. scanf("%d",&a[i]);
  23. sum[i]=sum[i-]+a[i];
  24. q[i]=p-a[i];
  25. mx[i][]=q[i];
  26. }
  27. int ans=-0x7fffffff;
  28. for(int j=;(<<j)<=n;j++)
  29. for(int i=;i<=n;i++)
  30. mx[i][j]=max(mx[i][j-],mx[i+(<<(j-))][j-]);
  31. for(int i=;i<=n;i++){
  32. for(int j=i;j<=n;j++){
  33. ans=max(ans,sum[j]-sum[i-]);
  34. int now=sum[j]-sum[i-]+query(i,j);
  35. ans=max(ans,now);
  36. }
  37. }
  38. cout<<ans;
  39. return ;
  40. }

100分 前缀和+st表

树状数组

(lowbit)
e Time Limit:1 1 000ms y 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。

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. #define maxn 100010
  5. #define mod 1000000007
  6. int n;
  7. long long a[maxn];
  8. long long ans;
  9. long long qread(){
  10. long long i=;
  11. char ch=getchar();
  12. while(ch<''||ch>'')ch=getchar();
  13. while(ch<=''&&ch>=''){i=i*+ch-'';ch=getchar();}
  14. return i;
  15. }
  16. int main(){
  17. freopen("lowbit.in","r",stdin);
  18. freopen("lowbit.out","w",stdout);
  19. scanf("%d",&n);
  20. for(int i=;i<=n;i++)a[i]=qread();
  21. for(int i=;i<=n;i++){
  22. for(int j=i+;j<=n;j++){
  23. long long x=a[i]^a[j];
  24. ans=(ans+(x&-x))%mod;
  25. }
  26. }
  27. ans=(ans+ans)%mod;
  28. cout<<ans;
  29. return ;
  30. }

30分 暴力

  1. /*
  2. 分治
  3. 二进制最后一位是0的放左边,最后一位是1的放右边,对答案的贡献为两者个数的乘积* 2^0
  4. 对于左边的和右边的,分别做:
  5. 二进制倒数第二位是0的放左边,倒数第二位是1的放右边,对答案的贡献为两者个数的乘积* 2^1
  6. ……
  7. 边界条件1: 没有数了
  8. 边界条件2:二进制位数>30 (非常重要,他保证了最多分治30层,高效解决应重复出现的数)
  9. */
  10. #include<iostream>
  11. #include<cstdio>
  12. #define mod 1000000007
  13. #define N 100001
  14. using namespace std;
  15. int n;
  16. int a[N],b[N];
  17. long long ans;
  18. void divide(int l,int r, int k){
  19. if(l>=r || k>) return;
  20. int L=l,R=r;
  21. for(int i=l;i<=r;i++)
  22. if(a[i] & (<<k)) b[L++]=a[i];
  23. else b[R--]=a[i];
  24. ans=(ans+1ll*(L-l)*(r-R)*(<<k))%mod;
  25. for(int i=l;i<=r;i++) a[i]=b[i];
  26. if(l!=L) divide(l,L-,k+);
  27. if(r!=R) divide(R+,r,k+);
  28. }
  29. int main(){
  30. freopen("lowbit.in","r",stdin);
  31. freopen("lowbit.out","w",stdout);
  32. scanf("%d",&n);
  33. for(int i=;i<=n;i++) scanf("%d",&a[i]);
  34. divide(,n,);
  35. printf("%I64d",(ans<<)%mod);
  36. }

100分 分治

防 AK 好题

(fangak)
e Time Limit: 10 00ms y Memory Limit:128MB
题目描述
LYK 觉得,这场比赛到目前为止,题目都还太简单了。
于是,它有意在最后一题为难一下大家。它定义了一个非常复杂的运算。具体的,一开
始它有 n 个数 ai。令 c 表示最大的相邻两个数的差。也就是说 c=max{|a[i]-a[i-1]|}(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。

  1. /*
  2. 二分+DP
  3. dp[i] 表示 到第i个数, 在满足条件(任意两个相邻的数,差<=mid)的情况下,并且i没有被改变,最少改变多少数字。
  4. 状态转移: dp[i]=dp[k]+(i-k-1) k=0~i-1 表示 k+1~i-1 都被改变了
  5. 转移条件:mid*(k-i)>=abs(a[k]-a[i]) k~i这段区间能满足条件
  6.  
  7. 只管修改了多少个数,至于改成了什么,不关心
  8. 最大的差最小,就是让数均匀分布,那么二分最大的差,条件就是差*个数>= | 区间右边-左边 |
  9. 也就是假设区间左右端点都不改变,而区间内部都改变
  10. 区间内部都改变是最差的情况,他会随着区间左端点的移动而变小
  11. */
  12. #include<cstdio>
  13. #include<cstring>
  14. #include<algorithm>
  15. #define N 1001
  16. using namespace std;
  17. int n,k,maxn=-2e9,minn=2e9;
  18. int a[N],dp[N+];
  19. bool check(int mid){
  20. dp[]=;
  21. for(int i=;i<=n;i++){
  22. dp[i]=n+;
  23. for(int j=i-;j>=;j--)
  24. if(!j || mid*(i-j)>=abs(a[i]-a[j])) dp[i]=min(dp[i],dp[j]+i-j-);
  25. }
  26. for(int i=;i<=n;i++)
  27. if(dp[i]+n-i<=k) return true;
  28. return false;
  29. }
  30. int main(){
  31. freopen("fangak.in","r",stdin);
  32. freopen("fangak.out","w",stdout);
  33. scanf("%d%d",&n,&k);
  34. for(int i=;i<=n;i++) scanf("%d",&a[i]),maxn=max(maxn,a[i]),minn=min(minn,a[i]);
  35. int l=,r=maxn-minn,mid,ans;
  36. while(l<=r){
  37. mid=l+r>>;
  38. if(check(mid)) ans=mid,r=mid-;
  39. else l=mid+;
  40. }
  41. printf("%d",ans);
  42. }

还不会呢

2017-9-14 NOIP模拟赛的更多相关文章

  1. 2017.6.11 NOIP模拟赛

    题目链接: http://files.cnblogs.com/files/TheRoadToTheGold/2017-6.11NOIP%E6%A8%A1%E6%8B%9F%E8%B5%9B.zip 期 ...

  2. 2017 10.25 NOIP模拟赛

    期望得分:100+40+100=240 实际得分:50+40+20=110 T1 start取了min没有用,w(゚Д゚)w    O(≧口≦)O T3 代码3个bug :数组开小了,一个细节没注意, ...

  3. 2017.5.27 NOIP模拟赛(hzwer2014-5-16 NOIP模拟赛)

    期望得分:100+100+60+30=290 实际得分:100+20+60+0=180 当务之急:提高一次正确率 Problem 1 双色球(ball.cpp/c/pas) [题目描述] 机房来了新一 ...

  4. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  5. 2017-9-22 NOIP模拟赛[xxy][数论]

    XXY 的 的 NOIP 模拟赛 4 4 —— 数学专场 A Description定义 f(x)表示 x 的约数和,例:f(12)=1+2+3+4+6+12=28给出 x,y,求Σf(i),i∈[x ...

  6. 2014-10-31 NOIP模拟赛

        10.30 NOIp  模拟赛   时间 空间 测试点 评测方式 挖掘机(dig.*) 1s 256M 10 传统 黑红树(brtree.*) 2s 256M 10 传统 藏宝图(treas. ...

  7. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  8. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  9. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  10. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

随机推荐

  1. PHP生成图片太慢了。。有些都不出来、

    现在为了使用不同宽高的图片,做了个动态生成的程序.每次根据图片传入的宽高来输出图片,然后 html 页面里用 <img src="xxx.com/img?src=c8d997dae15 ...

  2. ME01 创建货源清单function

    CALL FUNCTION 'ME_DIRECT_INPUT_SOURCE_LIST' Function module IDOC_INPUT_SRCLST FUNCTION IDOC_INPUT_SR ...

  3. 【zabbix】Windows服务器获取IIS站点以及程序池状态

    在使用zabbix做Windows服务器监控的时候遇到一个比较棘手的问题,检测IIS站点状态. 普通情况下,只要用浏览器访问iis站点测试一下返回码是不是200即可判断状态,但是我这次遇到的是iis使 ...

  4. client , offset , scroll 系列 及百度导航栏案例

    1. client 系列 示例 : <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  5. Database: key

    super-key: Any key that has more columns than necessary to uniquely identify each row in the table i ...

  6. JavaMail发送和接收邮件

    一.JavaMail概述:        JavaMail是由Sun定义的一套收发电子邮件的API,不同的厂商可以提供自己的实现类.但它并没有包含在JDK中,而是作为JavaEE的一部分. 厂商所提供 ...

  7. ActiveMQ之发布、订阅使用

    maven依赖 <dependencies> <dependency> <groupId>org.apache.activemq</groupId> & ...

  8. 前端多媒体(2)—— xhr异步接收处理二进制数据

    有时我们需要把远程的视频.图片数据异步下载下来,然后在js里进行特殊处理.比如把VR的图片特殊处理,把不同封装格式的视频做一次 转封装 处理等等,这类操作都要先获取二进制数据,然后特殊处理. 这个时候 ...

  9. 《java编程思想》:第五章,初始化与清理

    知识点整理: 1.从概念上讲,‘初始化’与‘创建’是彼此独立的,但是在Java中,两者被捆绑在一起,不可分离. 2.区分重载的方法:每个重载的方法都有一个独一无二的参数类型列表. 甚至参数顺序的不同也 ...

  10. 【Lintcode】074.First Bad Version

    题目: The code base version is an integer start from 1 to n. One day, someone committed a bad version ...