重走长征路---OI每周刷题记录---10月25日 2014

总目录详见https://blog.csdn.net/mrcrack/article/details/84471041

做题原则,找不到测评地址的题不做。2018-11-28

重走长征路---OI每周刷题记录---10月25日  2014

本周共计27题+题

测评地址:

状压dp+dijikstra:

1.「bzoj1097」[POI2007]旅游景点atr

贪心:

2.「cf480A」Exams 

3.「bzoj2079」[Poi2010]Guilds

拼数问题 

4.「bzoj1110」[POI2007]砝码Odw

5.「bzoj2014」[Usaco2010 Feb]Chocolate Buying

map:

6.「cf480B」Long Jumps

dp:

7.「cf480C」Riding in a Lift 

8.「bzoj2091」The Minima Game

9.「JoyOI1097」MM不哭 

10.「NOIP模拟赛」土豪聪要请客

zkw费用流:

11.「bzoj1520」[POI2006]Szk-Schools

二分+贪心:

12.「bzoj2016」[Usaco2010]Chocolate Eating

置换:

13.NOIP2005篝火晚会

dfs:

14.NOIP2004虫食算

map+bfs:

15.NOIP2002子串变换

二分+lca:

16.「bzoj2144」跳跳棋

dfs/规律:

17.「NOIP模拟赛」传教士

18.「NOIP模拟赛」分火腿

exgcd:

19.「NOIP模拟赛」jams倒酒

dijkstra:

20.「bzoj2143」飞飞侠

恺撒密码解密:

21.「bzoj2145」悄悄话

数学:

22.「NOIP模拟赛」分火腿

构造:

23.「cf482A」Diverse Permutation

状压:

24.「NOIP模拟赛」班服

莫比乌斯反演:

25.「vijos1889」天真的因数分解

26.「bzoj2440」[中山市选2011]完全平方数   //在线测评地址https://www.luogu.org/problemnew/show/P4318

线性规划+zkw费用流:

27.「vijos1891」学姐的逛街计划

题解:

 

状压dp+dijikstra:

1.「bzoj1097」[POI2007]旅游景点atr

贪心:

2.「cf480A」Exams 

3.「bzoj2079」[Poi2010]Guilds

拼数问题 

4.「bzoj1110」[POI2007]砝码Odw

5.「bzoj2014」[Usaco2010 Feb]Chocolate Buying

map:

6.「cf480B」Long Jumps

dp:

7.「cf480C」Riding in a Lift 

8.「bzoj2091」The Minima Game

9.「JoyOI1097」MM不哭 

10.「NOIP模拟赛」土豪聪要请客

zkw费用流:

11.「bzoj1520」[POI2006]Szk-Schools

二分+贪心:

12.「bzoj2016」[Usaco2010]Chocolate Eating

置换:

13.NOIP2005篝火晚会

dfs:

14.NOIP2004虫食算

map+bfs:

15.NOIP2002子串变换

二分+lca:

16.「bzoj2144」跳跳棋

dfs/规律:

17.「NOIP模拟赛」传教士

18.「NOIP模拟赛」分火腿

exgcd:

19.「NOIP模拟赛」jams倒酒

dijkstra:

20.「bzoj2143」飞飞侠

恺撒密码解密:

21.「bzoj2145」悄悄话

数学:

22.「NOIP模拟赛」分火腿

构造:

23.「cf482A」Diverse Permutation

状压:

24.「NOIP模拟赛」班服

莫比乌斯反演:

25.「vijos1889」天真的因数分解

26.「bzoj2440」[中山市选2011]完全平方数

//P4318 完全平方数
//在线测评地址https://www.luogu.org/problemnew/show/P4318  
//该题有些问题,1=1*1,按理来说,1应该是完全平方数  
//不过,如果1是,该题也就没法做了。  
//第13个,如下1,2,3,5,6,7,10,11,13,14,15,17,19.  19是第13个满足条件的数  
//从样例角度讲,朴素算法就难以通过。  
//用的是容斥原理,但计算时,碰到的却不是一整块一整块的数据  
//如遇到2^2,3^2,4^2,5^2,6^2,7^2,8^2,   
//2^2,3^2,5^2,7^2 可看成1个质数的平方的整数倍  
//4^2,6^2 可看成2个质数的平方的整数倍
//8^2 可看成3个质数的平方的整数倍
//T=50,K=10^9 二分 时间复杂度 50log10^9=50*30=1500,十分轻松
//此文代码写得不错https://blog.csdn.net/PoPoQQQ/article/details/42076037
//此刻转到noi linux下编写代码,目的是为了熟悉编写环境。2019-2-17 09:37
//找计算器是当务之急,在附件中找到计算器,发现功能还挺全。
//win下计算器有的功能,linux下都有,放心了。
//二分+容斥原理+莫比乌斯反演
//根据样例可以猜出,最后答案在2K范围以内。
//故T=50,2K=2×10^9 二分 时间复杂度 50log2×10^9=50*30=1500,十分轻松
//sqrt(2*10^9)=44721.4,故最大质数不超过44722
//线性筛出2-44722中的素数,会是构成i*i<=2×10^9中i的质因数
//线性筛编写完成,马上测试了1-20内的莫比乌斯系数,如下
//mu[1]=1 mu[2]=1 mu[3]=1 mu[4]=0 mu[5]=1 mu[6]=-1 mu[7]=1 mu[8]=0 mu[9]=0 mu[10]=-1
//mu[11]=1 mu[12]=0 mu[13]=1 mu[14]=-1 mu[15]=-1 mu[16]=0 mu[17]=1 mu[18]=0 mu[19]=1 mu[20]=0
//成功后,继续容斥原理+二分的编写。
//样例未通过,开始排查
//只针对13这个数据进行测试。因为熟悉,因为简单。
//测试中发现,线性筛中 莫比乌斯 系数 赋值错误
//线性筛编写完成,马上测试了1-20内的莫比乌斯系数,如下
//mu[1]=1 mu[2]=-1 mu[3]=-1 mu[4]=0 mu[5]=-1 mu[6]=1 mu[7]=-1 mu[8]=0 mu[9]=0 mu[10]=1
//mu[11]=-1 mu[12]=0 mu[13]=-1 mu[14]=1 mu[15]=1 mu[16]=0 mu[17]=-1 mu[18]=0 mu[19]=-1 mu[20]=0
//样例输出数据有变化,但还是不对
//继续测试,发现比较奇特的现象
//1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26中符合题意的非完全平方数是
//1 2 3    5 6 7       10 11      13 14 15      17      19      21 22 23 24 25 26
//读者发现了没有,1-19内有非完全平方数13个,第13个是19
//1-20内有非完全平方数13个,第13个是19,而非20.
//找到问题是关键,怎么解决,肯定能解决。
//对二分进行修改,if(judge(mid)>=x)right=mid;//此处写成if(judge(mid)>x)right=mid;
//再加一个特判,也即k=1的时候,作特判。
//删除测试语句
//手动,对1-26的所有数据进行测试,全数通过,放心了,
//再读了一遍题目,发现,没有什么遗漏,提交前,测试了1000000000
//程序卡死了,什么情况,好在多测试了一步
//发现for(i=1;i*i<=x;i++) ans+=x/(i*i)*mu[i];//for(i=1;i*i<=x;i++) ans+=x/(i*i)*mu[i];此句会溢出
//某些地方改成long long,还是有问题,嫌烦了,采用替换的办法,将LL全改成long long
//反复测试,还是有问题,怎么可能,突然想到,没有compile,这可是在noi linux下,不熟悉造成的。
//编译,测试
//1 1000000000
//输出
//1644934081
//程序通畅了,突然想到,没有noi linux下丰富的编程经验,还是不要轻易在考场中使用该系统。
//在想X/(i*i)!=X/i/i在计算机整数运算中,有这样的X与i吗。
//一开始,傻傻的手算,找不到,还是求助计算机吧,马上编了代码以下最多算x=10000,10000×sqrt(10000)=10^6次,1秒完成,试试看。
#include <stdio.h>
int main(){
    int x,i;
    for(x=1;x<=10000000;x++)
        for(i=1;i*i<=x;i++)
            if(x/(i*i)!=x/i/i){
                printf("x=%d i=%d\n",x,i);
                break;
            }
    return 0;
}
//在1-10000000内竟然没有找到反例。X/(i*i)!=X/i/i有这种X与i吗,暂时搁置。
//言归正传,提交0分,全WA。2019-2-17 12:53
//测试了程序,发现一些测试语句未删除,printf("judge(%lld)=%lld ",mid,judge(mid));此句未删除
//删除测试语句,样例通过,提交AC。2019-2-17 12:57
//程序AC,要求很苛刻。爆0,可能就是一点点失误。
#include <stdio.h>
#include <string.h>
#define LL long long
#define maxn 45000
LL prime[maxn],not_prime[maxn],mu[maxn],tot=0;//mu[i] i莫比乌斯系数
void linear_shaker(LL x){
    LL i,j;
    for(i=2;i<=x;i++){
        if(!not_prime[i])prime[++tot]=i,mu[i]=-1;//此处写成mu[i]=1//i由一个素数构成
        for(j=1;prime[j]*i<=x;j++){
            not_prime[prime[j]*i]=1;
            if(i%prime[j]==0){
                mu[prime[j]*i]=0;//此处写成mu[i]=0;//prime[j]*i至少由prime[j]*prime[j]构成
                break;
            }
            mu[prime[j]*i]=-mu[i];
        }
    }
}
LL judge(LL x){//容斥原理编写,1-x内的非完全平方数的个数
    LL i,ans=0;
    for(i=1;i*i<=x;i++) ans+=x/(i*i)*mu[i];//for(i=1;i*i<=x;i++) ans+=x/(i*i)*mu[i];此句会溢出//测试样例,不对,仔细想想,此种写法不妥ans+=x/i/i*mu[i];
    return ans;
}
LL bisection(LL x){//在1-2x范围内找第x个非完全平方数的位置
    LL left=1,right=x*2,mid;
    while(left+1<right){
        mid=(left+right)/2;
        if(judge(mid)>=x)right=mid;//此处写成if(judge(mid)>x)right=mid;
        else left=mid;
    }
    return right;
}
int main(){
    LL t,k;
    mu[1]=1,memset(not_prime,0,sizeof(not_prime));
    linear_shaker(44722);
    scanf("%lld",&t);
    while(t--){
        scanf("%lld",&k);
        if(k==1)printf("1\n");//特判
        else printf("%lld\n",bisection(k));
    }
    return 0;
}

线性规划+zkw费用流:

27.「vijos1891」学姐的逛街计划

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值