送分题

(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)的做法。

/*
先用前缀和维护原序列
然后将p与序列中的每个数做差形成新的序列,用st表维护新序列的区间最大值
枚举序列的左右端点,然后用原序列的区间和加上新序列的区间最大值更新答案
*/
#include<iostream>
#include<cstdio>
using namespace std;
#define maxn 1010
int n,p,a[maxn],q[maxn],mx[maxn][],sum[maxn];
int query(int l,int r){
int k=;
while(<<k+<=(r-l+))k++;
return max(mx[l][k],mx[r-(<<k)+][k]);
}
int main(){
//freopen("Cola.txt","r",stdin);
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]);
sum[i]=sum[i-]+a[i];
q[i]=p-a[i];
mx[i][]=q[i];
}
int ans=-0x7fffffff;
for(int j=;(<<j)<=n;j++)
for(int i=;i<=n;i++)
mx[i][j]=max(mx[i][j-],mx[i+(<<(j-))][j-]);
for(int i=;i<=n;i++){
for(int j=i;j<=n;j++){
ans=max(ans,sum[j]-sum[i-]);
int now=sum[j]-sum[i-]+query(i,j);
ans=max(ans,now);
}
}
cout<<ans;
return ;
}

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。

#include<iostream>
#include<cstdio>
using namespace std;
#define maxn 100010
#define mod 1000000007
int n;
long long a[maxn];
long long ans;
long long qread(){
long long i=;
char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch<=''&&ch>=''){i=i*+ch-'';ch=getchar();}
return i;
}
int main(){
freopen("lowbit.in","r",stdin);
freopen("lowbit.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++)a[i]=qread();
for(int i=;i<=n;i++){
for(int j=i+;j<=n;j++){
long long x=a[i]^a[j];
ans=(ans+(x&-x))%mod;
}
}
ans=(ans+ans)%mod;
cout<<ans;
return ;
}

30分 暴力

/*
分治
二进制最后一位是0的放左边,最后一位是1的放右边,对答案的贡献为两者个数的乘积* 2^0
对于左边的和右边的,分别做:
二进制倒数第二位是0的放左边,倒数第二位是1的放右边,对答案的贡献为两者个数的乘积* 2^1
……
边界条件1: 没有数了
边界条件2:二进制位数>30 (非常重要,他保证了最多分治30层,高效解决应重复出现的数)
*/
#include<iostream>
#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);
}

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。

/*
二分+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这段区间能满足条件 只管修改了多少个数,至于改成了什么,不关心
最大的差最小,就是让数均匀分布,那么二分最大的差,条件就是差*个数>= | 区间右边-左边 |
也就是假设区间左右端点都不改变,而区间内部都改变
区间内部都改变是最差的情况,他会随着区间左端点的移动而变小
*/
#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-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. linux 防火墙配置与REJECT导致没有生效问题

    1.进入到/etc/sysconfig 如图 2.使用vi命令对iptables进行编辑."vi iptables",然后显示如图 # Firewall configuration ...

  2. IC卡、ID卡、M1卡、射频卡的区别是什么【转】

    本文转载自:https://www.cnblogs.com/najifu-jason/p/4122741.html IC卡.ID卡.M1卡.射频卡都是我们常见的一种智能卡,但是很多的顾客还是不清楚IC ...

  3. BZOJ3295 [Cqoi2011]动态逆序对 —— CDQ分治

    题目链接:https://vjudge.net/problem/HYSBZ-3295 3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 1 ...

  4. ansible mysql模块的使用今年

    摘自: https://www.ibm.com/developerworks/cn/linux/1502_lih_ansible/

  5. android程序的真正入口

    代码出自MtAndroid 3.1.2完全开发手册,适用于Android平台. 概述 android程序的真正入口是Application类的onCreate方法.它的继承关系如下所示: java.l ...

  6. 勤于思考:jQuery Validation 在IE7(兼容模式)下出现“找不到成员”的脚本错误

    今天在调试IE10下使用IE6判断脚本出现错误,处理后说IE7也不行,调试后则会出现以下错误: SCRIPT3: 找不到成员. jquery171.js, 行2582 字符4 其实开始我认为是jque ...

  7. linux命令学习笔记(54):ping命令

    Linux系统的ping命令是常用的网络命令,它通常用来测试与目标主机的连通性,我们经常会说“ping一下某机器, 看是不是开着”.不能打开网页时会说“你先ping网关地址192.168.1.1试试” ...

  8. linux 进程学习笔记-信号semaphore

    信号灯(信号量)不是进程通信手段,其是用于控制和协调在进程间通信过程中的共享资源访问,就如同互斥锁(两者的区别可以参考这里) 可以将简单地将信号灯想象成一个计数器,初始时计数器值为n(有n个资源可供使 ...

  9. Java中的访问控制

    修饰符 同一个类 同一个包 子类 整体 private Yes       default Yes Yes     protected Yes Yes Yes   public Yes Yes Yes ...

  10. android自定义控件(四) View中的方法

    onFinishInflate() 当View中所有的子控件 均被映射成xml后触发 onMeasure(int, int) 确定所有子元素的大小 onLayout(boolean, int, int ...