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

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

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

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

本周共计 题+题

测评地址:

后缀数组:

1.「codevs3160」最长公共子串

dp:

2.NOIP2001统计单词个数

后缀自动机:

3.「spoj1812」Longest Common Substring II 

4.「codevs3160」最长公共子串

5.「spoj7258」Lexicographical Substring Search

扫描线+set:

6.「poj2932」Coneology

扫描线+set+树上删边游戏:

7.「FJOI2013」圆形游戏

结论:

8.「bzoj3706」「FJ2014集训」反色刷

最小环:

9.「poj1734」Sightseeing trip

gcd:

10.「codechefSUBGCD」Subarray GCD

模拟:

11.「codechefGRID」Sherlock and the Grid 「cf471A」MUH and Sticks

素数筛法:

12.「codechefSUBLCM」Subarray LCM   //在线测评地址https://vjudge.net/problem/CodeChef-SUBLCM

后缀自动机+link cut tree:

13.「bzoj2555」SubString

贪心:

14.「bzoj3433」[Usaco2014 Jan]Recording the Moolympics

15.「cf471B」MUH and Important Things

dfs+树形dp:

16.「bzoj3631」[JLOI2014]松鼠的新家

dijkstra:

17.「bzoj3402」[Usaco2009 Open]Hide and Seek 捉迷藏

点分治:

18.「bzoj3697」「FJ2014集训」采药人的路径

规律:

19.「cf471C」MUH and House of Cards

kmp:

20.「cf471D」MUH and Cube Walls

bfs:

21.「NOIP模拟赛」栅栏迷宫

dfs:

22.「NOIP模拟赛」人偶师(60分)

dfs+map:

23.「NOIP模拟赛」人偶师

tarjan+树形dp:

24.「NOIP模拟赛」交通(70分)

题解:

后缀数组:

1.「codevs3160」最长公共子串

dp:

2.NOIP2001统计单词个数

后缀自动机:

3.「spoj1812」Longest Common Substring II 

4.「codevs3160」最长公共子串

5.「spoj7258」Lexicographical Substring Search

扫描线+set:

6.「poj2932」Coneology

扫描线+set+树上删边游戏:

7.「FJOI2013」圆形游戏

结论:

8.「bzoj3706」「FJ2014集训」反色刷

最小环:

9.「poj1734」Sightseeing trip

gcd:

10.「codechefSUBGCD」Subarray GCD

模拟:

11.「codechefGRID」Sherlock and the Grid 「cf471A」MUH and Sticks

素数筛法:

12.「codechefSUBLCM」Subarray LCM

//Subarray LCM CodeChef - SUBLCM
//在线测评地址https://vjudge.net/problem/CodeChef-SUBLCM
//没想到CodeChef是一个印度OJ
//通过https://blog.csdn.net/shuxiao9058/article/details/7633054学习了Emacs使用
//上文中C-x指的是ctrl+x,C-f指的是ctrl+f,M-x指的是alt+x
//决定还是在noi linux下使用gedit编写C++代码
//该题,英文版写得比中文版好,请做如下对比
//Example case 2.The subarrays A2 to A3 and A3 to A4 are the maximum size possible.
//样例二:A1,A2,A3,A4 最大。
//所以,在此套OJ上,还是读英文版比较可靠。
//目前体会,同是Mac OS下的虚拟系统,linux比windows快多了
//该题核心,质因数分解,将当前该数的各个质因数,与之前数的质因数进行比较,若找不到,序列均有效。
//线性筛,目的,找到每个数的最小质因数。
//上述思想来自http://hzwer.com/4515.html不是讲懂的,而是代码看懂的2019-2-16 16:19
//开了控制台,编写一段代码,测试一段g++ lcm.cpp -o lcm
//not_prime[i]最终用来存储i对应的最小质因数
//在noi linux下安全感十足,不用担心爆0了,少什么头文件,编译的时候会提示。2019-2-26 22:09
//noi linux真是太好了,一编译就发现漏了头文件
//思路有些类最长上升子序列。
//样例通过,提交Language Rejected。那么好吧,先将中文注释删除
//再次提交,还是Language Rejected。啥情况。
//翻看他人提交情况,发现中文注释无需删除
//只需将Submit中的Language中的C++(gcc 6.3)改成C++14(gcc 6.3)即可。
//提交AC。2019-2-16 23:05
#include <stdio.h>
#include <string.h>
#define maxn 1000100
int prime[maxn],not_prime[maxn],tot=0,last[maxn];//last[i]质数i最后出现的位置。
void linear_shaker(int x){//线性筛,目的,找到每个数的最小质因数。
    int i,j;
    for(i=2;i<=x;i++){
        if(!not_prime[i])prime[++tot]=i,not_prime[i]=i;
        for(j=1;prime[j]*i<=x;j++){
            not_prime[prime[j]*i]=prime[j];
            if(i%prime[j]==0)break;
        }
    }
}
int max(int a,int b){
    return a>b?a:b;
}
int main(){
    int t,n,i,x,ans,pos,b;
    linear_shaker(1000000);
    scanf("%d",&t);
    while(t--){
        memset(last,0,sizeof(last)),ans=0,pos=0;//忘记了ans=0的初始化 pos=0放错位置,之前放到了for(i=1;i<=n;i++)之内。
        scanf("%d",&n);
        for(i=1;i<=n;i++){//以i位置的数字为结尾的最长序列计算
            scanf("%d",&x);
            while(x!=1){//分解x对应的质因数
                b=not_prime[x];
                pos=max(pos,last[b]);//找以离i位置数字最近的质因数b的位置,以及之前没有重复质因数的位置。
                last[b]=i;
                while(x%b==0)x/=b;//分解质因数
            }
            ans=max(ans,i-pos);
        }
        if(ans==1)printf("-1\n");
        else printf("%d\n",ans);
    }
    return 0;
}

后缀自动机+link cut tree:

13.「bzoj2555」SubString

贪心:

14.「bzoj3433」[Usaco2014 Jan]Recording the Moolympics

15.「cf471B」MUH and Important Things

dfs+树形dp:

16.「bzoj3631」[JLOI2014]松鼠的新家

dijkstra:

17.「bzoj3402」[Usaco2009 Open]Hide and Seek 捉迷藏

点分治:

18.「bzoj3697」「FJ2014集训」采药人的路径

规律:

19.「cf471C」MUH and House of Cards

kmp:

20.「cf471D」MUH and Cube Walls

bfs:

21.「NOIP模拟赛」栅栏迷宫

dfs:

22.「NOIP模拟赛」人偶师(60分)

dfs+map:

23.「NOIP模拟赛」人偶师

tarjan+树形dp:

24.「NOIP模拟赛」交通(70分)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值