多校 2013 3

B

hash 把字符串看成数字插进去

#include<stdio.h>
#include<string.h>

using namespace std;

#define SEED 13331
#define MAXN  2007
#define HASH 10007

int head[HASH];
int cnt;
struct node
{
    int id,next;
    unsigned long long v;

}edge[MAXN];

char str[MAXN];
unsigned long long s[MAXN],p[MAXN];
int ans[MAXN][MAXN];

int ins(unsigned long long val,int id)
{
    int b=0;
    int h=val%HASH;
    for(int i=head[h];i!=-1;i=edge[i].next)
    {
        if(val==edge[i].v)
        {
            int a=edge[i].id;
            edge[i].id=id;
            return a;
        }

    }
    edge[cnt].id=id;
    edge[cnt].v=val;
    edge[cnt].next=head[h];
    head[h]=cnt++;
    return 0;
}

int main()
{
    int t;
    scanf("%d",&t);
    p[0]=1;
    for(int i=1;i<MAXN;i++)
        p[i]=p[i-1]*SEED;

    while(t--)
    {
        scanf("%s",str);
        s[0]=0;
        int len=strlen(str);
        for(int i=1;i<=len;i++)
            s[i]=s[i-1]*SEED+str[i-1];
        memset(ans,0,sizeof(ans));
       // printf("111\n");
        for(int l=1;l<=len;l++)
        {
            cnt=0;
            memset(head,-1,sizeof(head));
            for(int i=1;i+l-1<=len;i++)
            {
                int pos=ins(s[i+l-1]-s[i-1]*p[l],i);
                ans[i][i+l-1]++;
                ans[pos][i+l-1]--;
            }
        }

        for(int i=len;i>=1;i--)
            for(int j=i;j<=len;j++)
                ans[i][j]+=ans[i+1][j]+ans[i][j-1]-ans[i+1][j-1];
        int m;
        scanf("%d",&m);
        while(m--)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            printf("%d\n",ans[a][b]);
        }
    }

    return 0;
}

G

分奇数偶数讨论下

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>
#include<set>
#include<deque>
#include<queue>
#include<stack>

using namespace std;

#define inf 1000000007
#define MAXN 50010
#define ll long long

int gcd(int a,int b)
{
    return b?gcd(b,a%b):a;
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        ll a,b;
        if(n%2==1)
        {
            a=n/2;
            b=a+1;
        }
        else
        {
            int en=n/2;
            for(int i=en;i>=1;i--)
            {
                b=i;
                a=n-i;
                if(gcd(a,b)==1)
                {
                    break;
                }
            }
        }
        printf("%lld\n",a*b);

    }
    return 0;
}

H

状态压缩 dp  列举下子集

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>
#include<set>
#include<deque>
#include<queue>
#include<stack>

using namespace std;

#define inf 1000000007
#define MAXN 50010
#define ll long long

char s[30];
char s1[30];
bool jud[70000];
int dp[70000],len;

    bool check(int x){
        if(x == 0)return true;
        int i=0,j=len-1;
        while(i<j){
            while(!(x&(1<<i)))++i;
            while(!(x&(1<<j)))--j;
            if(s[i] != s[j])return false;
            ++i,--j;
        }
        return true;
    }

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",s);
        len=strlen(s);
        int en=1<<len;
        int en1=len/2;

        for(int i=0;i<en;i++)
        {
            jud[i]=check(i);
        }
        for(int i=0;i<en;i++)
            dp[i]=inf;
        dp[en-1]=0;
        for(int i=en-1;i>=0;--i)
        {
            for(int j=i;j>=1;j=((j-1)&i))
            {
                if(!jud[i^j])
                    continue;
                if(dp[j]>dp[i]+1)
                    dp[j]=dp[i]+1;
            }
            if(jud[i]&&dp[0]>dp[i]+1)
                dp[0]=dp[i]+1;
        }
        printf("%d\n",dp[0]);

    }
    return 0;
}

J

线段树维护每个位子最大的因子   然后维护下前面出现过的位子   查询的话 离线操作

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>

using namespace std;

#define MAXN  50010
int z[MAXN];
struct qu
{
    int l,r,id;
}q[MAXN];

struct node
{
    int l,r,w;
}tree[MAXN<<2];

bool cmp(qu a, qu b)
{
    return a.r<b.r;
}
int pre[MAXN];
int ans[MAXN];

void Build(int l,int r,int a)
{
    tree[a].l=l;
    tree[a].r=r;
    tree[a].w=0;
    if(l==r)
        return ;
    int mid=(l+r)>>1;
    Build(l,mid,a<<1);
    Build(mid+1,r,a<<1|1);
}

void update(int l,int r,int a1,int b1,int a)
{
    if(l==r)
    {
        tree[a].w=max(tree[a].w,b1);
        return ;
    }
    int mid=(l+r)>>1;
    if(a1<=mid)
        update(l,mid,a1,b1,a<<1);
    else
        update(mid+1,r,a1,b1,a<<1|1);
    tree[a].w=max(tree[a<<1].w,tree[a<<1|1].w);
}
int Ques(int l,int r,int a1,int b1,int a)
{
    if(a1<=l&&r<=b1)
        return tree[a].w;
    int ans=0;
    int mid=(l+r)>>1;
    if(a1<=mid)
        ans=max(ans,Ques(l,mid,a1,b1,a<<1));
    if(b1>mid)
        ans=max(ans,Ques(mid+1,r,a1,b1,a<<1|1));
    return ans;
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&z[i]);
        int m;
        scanf("%d",&m);
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&q[i].l,&q[i].r);
            q[i].id=i;
        }
        sort(q+1,q+m+1,cmp);
        memset(pre,-1,sizeof(pre));
        Build(1,n,1);
        int cnt=1;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j*j<=z[i];j++)
            {
                if(z[i]%j==0)
                {
                    if(z[i]%j==0&&pre[j]!=-1)
                        update(1,n,pre[j],j,1);
                    int b=z[i]/j;
                    if(j!=b&&z[i]%b==0&&pre[b]!=-1)
                        update(1,n,pre[b],b,1);
                    pre[j]=pre[b]=i;
                }
            }
            while(cnt<=m&&q[cnt].r==i)
            {
                ans[q[cnt].id]=Ques(1,n,q[cnt].l,q[cnt].r,1);
                cnt++;
            }
        }
        for(int i=1;i<=m;i++)
            printf("%d\n",ans[i]);
    }
    return 0;
}

时间: 2024-10-14 20:50:57

多校 2013 3的相关文章

多校 2013 1

HDU 4602 C 求n 的分解方式 k 出现了几次 先把 n 分解成 n个1   然后考虑  1        k 在边上  2*2^(n-k-1) 2        k 在中间  左边 t1 右边t2  个1  那么就是 2^(t1-1)*2^(t2-1)*(n-k-1) 加起来就是  有些特殊的判断下 #include <iostream> #include <cstdio> #include <cmath> #include <map> #incl

多校 2013 8

F 给你ABC三个串 让你求D串 D是AB的子序列 C是D的子串 求D的长度 求出C在AB中出现的位子记录开始位子和结束位子 n^2 枚举在A中位子和在B中位子 然后得到AB 开始位子之前的lcs 和AB结束位子的lcs 开始预处理一下lcs #include <iostream> #include <cstdio> #include <cmath> #include <map> #include <algorithm> #include <

多校 2013 10

I 求n的整数拆分有多少方法 2^(n-1) n太大  欧拉降幂+快速幂 #include<stdio.h> #include<algorithm> #include<string.h> using namespace std; typedef long long ll; #define inf 1e9+7 #define MAXN 100010 char s[MAXN]; ll Quick(ll a,ll b,ll c) { ll ans=1; while(b>

多校 2013 6

A n 然后n个数字 要求组合成的段数最大 低高 低高 ... (a *b -a) *(s/(ab)) #include<stdio.h> #include<string.h> #include<algorithm> #include<deque> #include<set> #include<map> using namespace std; #define ll __int64 #define MAXN 1000010 ll in

hdu 4603 Color the Tree 2013多校1-4

这道题细节真的很多 首先可以想到a和b的最优策略一定是沿着a和b在树上的链走,走到某个点停止,然后再依次占领和这个点邻接的边 所以,解决这道题的步骤如下: 预处理阶段: step 1:取任意一个点为根节点,找出父子关系并且对这个树进行dp,求出从某个节点出发往下所包含的所有边的权值总和  复杂度O(n) step 2:从tree dp 的结果中计算对于某个节点,从某条边出发所包含的边的综合,并且对其从大到小进行排序 复杂度O(n*logn) step 3:dfs求出这颗树的欧拉回路,以及每个点的

hdu 4601 Letter Tree 2013多校1-2

不容易啊..一个小错误让我wa死了,找了一个晚上,怎么都找不到 最后是对拍代码找到的错误,发现当步数比较小的时候答案就是对的,比较大的时候就不对了 想到一定是什么地方越界了... power[i] = (i64)(power[i - 1] * 26) % mod; 就是这行... 改成  power[i] = ((i64)power[i - 1] * 26) % mod; 就过了... 这道题总的来说就是非常综合,什么方面都涉及一点,核心部分还是把树转化成序列之后二分边界+RMQ,用dfn来确定

蒟蒻ACMer回忆录 &#183; 一段弱校ACM的奋斗史

三年半的ACM生涯终于迎来了终点,退役之时,感慨万分,故写此文以纪念逝去的时光,那些为ACM拼搏的日子,那段弱校ACM的奋斗史. 三年半的ACM生涯,窝见证了CUMT从打铁到铜牌的突破,又见证了从铜牌到银牌的突破:见证了集训队员从3人发展到10余人,又见证了ACM实验室的落实. 三年半的ACM生涯,窝经历了太多,有Accepted时的欢笑,有Wrong Answer时的沮丧,有Time Limit Exceeded时的无奈,有Runtime Error时的尴尬,有打铁的失落,有拿牌的惊喜. 13

Word 2013安裝字典

不必從內建的字典中開始,Word 2013 可將您連結到 Office 市集,方便您挑選免費的字典,或從包括多語字典的字典集合中購買. 若要選擇並安裝您想要的字典,請以滑鼠右鍵按一下任何單字,並按一下 [定義]. 或者,按一下 [校閱] > [定義]. 如果系統提示您登入則請登入,並查看字典清單中的選項,然後按一下 [下載] 以安裝您想要的字典. 下載完成後,字典會自動在 Word 中開啟.此後,每次按一下 [定義] 時就會開啟字典. 提示: 如果您要尋找相似詞,請以滑鼠右鍵按一下文件中的任何單

ActiveReports 9实战教程(1): 手把手搭建好开发环境Visual Studio 2013 社区版

ActiveReports9刚刚公布3天.微软就公布了 Visual Studio Community 2013 开发环境. Visual Studio Community 2013 提供完整功能的 IDE ,可开发 Windows.Android 和 iOS 应用.支持:C++, Python, HTML5, JavaScript, 和 C#,VB, F# 语言的开发.提供设计器.编辑器.调试器和诊断工具. 最牛逼的在于你全然能够免费使用该工具: 能够正大光明的免费使用visual studi