【CH】【弱省胡策】Round #7 高精度+组合数+set+主席树+题答题+密码学

在CH上找了套题…
60滚粗啦!

T1的暴力懒得写,T3的提答好恶心…嘛就算都写上也就100分左右…我不会告诉你最后一个半小时左右我弃赛了…

Magic

背景

wys是TKD的妹子。

wys听说TKD总把题面写得很长很长;

于是这一次她要求TKD把题面写得很短很短。

描述

统计N个点N条边的简单无向连通图个数。

输入格式

一行一个整数N。

输出格式

输出一行一个整数,描述答案。

样例输入1

3

样例输出1

1

样例输入2

4

样例输出2

15

数据范围与约定

对于30%的数据:1<=N<=10;
对于60%的数据:1<=N<=50;
对于100%的数据:1<=N<=5000

暴力?

我想了这么几种暴力的写法:

1.先生成一棵树,然后再枚举第n条边怎么连,然后把环缩了,然后跑一遍prufer序列,然后判重…
2.枚举环的大小,然后再在环上的点上挂树

…算了我说不下去了…
总之…丧心病狂…

30分算法:
暴力+打表

60分算法:

用prufer序列知道有根树的大小是 nn1 ,然后枚举环的大小,组合数瞎搞…然而并不会瞎搞…

100分算法:

公式:

枚举环的大小k:

nnk1k(k1)!2Ckn

前两个是树的个数:现在只有n-k个节点可以选,但这n-k个节点要从n个节点中选,一共是 nnk1 棵有根树,还要乘k,表示挂在k个节点上。

后两个是环的个数:一个序列的全排列是 k! ,因为环是首尾相接的,重复了k次,所以是 (k1)! 个。环可以翻转,所以要除以2。从n个节点中选出k个节点,要乘以组合数。

然后这式子化简一下就是…

(n1)!+n!+n!(n12!+n23!+...+nn4(n3)!) (n>3)

好吧我弱我只能推出来n>3的,剩下的只能打表了

不推的话会因为高精T掉…别问我怎么知道的

高精除不能写高精除高精,会T,写高精除int,别问我怎么知道的

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;

typedef long long LL;
const int SZ = 5010;
const int INF = 1000000010;

const int BASE = 1000000000;
const int WIDTH = 9;

struct bign{
    int num[3000],len;
    bign() { memset(num,0,sizeof(num)); len = 1;}
    bign (LL x)
    {
        memset(num,0,sizeof(num)); len = 0;
        do{
            num[++ len] = x % BASE;
            x /= BASE;
        }while(x);
    }
};

bool operator <(const bign &a,const bign &b)
{
    if(a.len != b.len) return a.len < b.len;
    for(int i = a.len;i >= 1;i --)
        if(a.num[i] != b.num[i])
            return a.num[i] < b.num[i];
    return false;
}

bign operator +(const bign &a,const bign &b)
{
    bign ans;
    int i = 1,x = 0;
    while(i <= a.len || i <= b.len)
    {
        x += a.num[i] + b.num[i];
        ans.num[i ++] = x % BASE;
        x /= BASE;
    }
    ans.num[i] = x;
    ans.len = i;
    while(ans.len > 1 && !ans.num[ans.len]) ans.len --;
    return ans;
}

bign operator -(const bign &a,const bign &b)
{
    bign ans;
    ans.len = a.len;
    int x = 0;
    for(int i = 1;i <= a.len;i ++)
    {
        x = x + a.num[i] - b.num[i] + BASE;
        ans.num[i] = x % BASE;
        x = x / BASE - 1;
    }
    while(ans.len > 1 && !ans.num[ans.len]) ans.len --;
    return ans;
}

bign operator *(const bign &a,const bign &b)
{
    bign ans;
    ans.len = a.len + b.len;
    for(int i = 1;i <= a.len;i ++)
    {
        LL x = 0;
        for(int j = 1;j <= b.len;j ++)
        {
            x = x + (LL)a.num[i] * b.num[j] + ans.num[i + j - 1];
            ans.num[i + j - 1] = x % BASE;
            x /= BASE;  
        }
        ans.num[i + b.len] = x;
    }
    while(ans.len > 1 && !ans.num[ans.len]) ans.len --;
    return ans;
}

bign operator /(const bign &a,const int &b)
{
    bign ans;
    ans.len = a.len;
    LL x = 0;
    for(int i = ans.len;i >= 1;i --)
    {
        x = x * BASE + a.num[i];
        ans.num[i] = x / b;
        x %= b;
    }
    while(ans.len > 1 && !ans.num[ans.len]) ans.len --;
    return ans;
}



void print(const bign &ans)
{
    printf("%d",ans.num[ans.len]);
    for(int i = ans.len - 1;i >= 1;i --)
        printf("%09d",ans.num[i]);
}

bign fac[SZ];

int main()
{
    int n;
    scanf("%d",&n);

    if(n <= 2) { puts("0"); return 0; }
    if(n == 3) { puts("1"); return 0; }

    bign tmp = 1,ans;

    for(int i = 1;i <= n - 1;i ++) 
        tmp = tmp * i; //(n - 1)!
    ans = tmp; 
    tmp = tmp * n; //n!
    ans = ans + tmp;//(n - 1)! * n!
    for(int i = 1;i <= n - 4;i ++)
    {
        tmp = tmp * n / (i + 1);
        ans = ans + tmp;
    }

    print(ans / 2);

    return 0;
}
/* 4999 */

Rectangle

背景

wys是TKD的妹子。

wys听说TKD总把题面写得很长很长;

于是这一次她要求TKD把题面写得很短很短。

描述

给定一排n个柱子,第i个位置的高度为a_i

现在有m个操作,每次选择一个位置,将这个位置的高度减掉1

所有操作之前以及每次操作后输出当前的最大子矩形的大小

强制在线

输入格式

第一行两个正整数n,m,含义如题目中所示

接下来一行n个非负整数,第i个数a_i表示第i个位置的高度

接下来m行每行一个非负整数pos_i,代表将位置pos_i\oplus last_ans的柱子高度-1

last_ans表示上一次询问的答案,初始值为一开始的最大子矩形大小

输出格式

m+1行,每行一个正整数,代表第i-1次操作后的最大子矩形大小

样例输入

7 3
2 2 4 5 3 3 3
10
12
15

样例输出

15
14
10
8

数据范围与约定

对于30%的数据:1\leq n,m\leq 1000
对于另外20%的数据:1\leq n,m\leq10^5,a_i\leq 1
对于100%的数据:1\leq n,m\leq10^5,a_i\leq10^6

数据保证任何时刻所有位置的高度\geq 0

样例解释

四次询问的答案如下图所示:

data:image/png;base64,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

来源

原创

提示

请注意输入和输出可能超过32位整型范围

//CH的图片地址好诡异…

三十分单调栈+二十分线段树,普及组都拿得到的分数

然后我不会做了,看不懂题解,弃疗

直接粘官方题解:

【100 分做法 1】
考虑将 50 分做法中的线段树改为可持久化线段树,每行维护一个
再用一个 set 维护一下所有行的最大连续区间*高度的最大值
由于每次修改只会修改一个位置,因此时空复杂度都是
O((n+m)log2h+h)
【100 分做法 2】
考虑将所有的连续最大子区间缩成一个 pair< int,int >扔进对应行的 set 里
这样就不需要可持久化线段树了
时间复杂度
O((n+m)log2h+h) ,空间复杂度 O(n+h)
【P.S.】
如果 h 很大怎么办?
由于有用的行数只有 n+m 行,离散化一下就好了 0.0

50分代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;

typedef long long LL;
const int SZ = 1000010;
const int INF = 1000000010;
const double eps = 1e-6;

int n,m;
LL num[SZ];

struct haha{
    LL w,h;
}S[SZ];

int top = 0;

LL getans()
{
    LL ans = 0;
    for(int i = 1;i <= n;i ++)
    {
        LL d = 0;
        while(top && S[top].h > num[i]) 
            d += S[top].w,ans = max(ans,S[top].h * d),top --;
        S[++ top] = (haha){d + 1,num[i]};
    }
    LL d = 0;
    while(top) 
        d += S[top].w,ans = max(ans,S[top].h * d),top --;
    return ans;
}

struct segment{
    int l,r;
    LL lx,rx,sum,mx;
}tree[SZ << 2];

void update(int p)
{
    int lch = p << 1,rch = p << 1 | 1;
    tree[p].sum = tree[lch].sum + tree[rch].sum;
    tree[p].lx = max(tree[lch].lx,tree[lch].sum + tree[rch].lx);
    tree[p].rx = max(tree[rch].rx,tree[rch].sum + tree[lch].rx);
    tree[p].mx = max(max(tree[lch].mx,tree[rch].mx),tree[lch].rx + tree[rch].lx);
}

void build(int p,int l,int r)
{
    tree[p].l = l; tree[p].r = r;
    if(l == r)
    {
        tree[p].lx = tree[p].rx = max(0ll,num[l]);
        tree[p].mx = tree[p].sum = num[l];
        return ;
    }
    int mid = l + r >> 1;
    build(p << 1,l,mid);
    build(p << 1 | 1,mid + 1,r);
    update(p);
}

void change(int p,int pos,LL x)
{
    if(tree[p].l == tree[p].r)
    {
        tree[p].lx = tree[p].rx = max(0ll,x);
        tree[p].mx = tree[p].sum = x;
        return ;
    }
    int mid = (tree[p].l + tree[p].r) >> 1;
    if(pos <= mid) change(p << 1,pos,x);
    else change(p << 1 | 1,pos,x);
    update(p);
}


int main()
{
// freopen("T2.in","r",stdin); 
// freopen("out.txt","w",stdout); 
    scanf("%d%d",&n,&m);
    bool flag = 0;
    for(int i = 1;i <= n;i ++)
    {
        scanf("%lld",&num[i]);
        if(num[i] > 1) 
            flag = 1;
    }
    if(!flag)
    {
        for(int i = 1;i <= n;i ++)
            if(num[i] == 0) num[i] = -INF;
        build(1,1,n);
        LL lastans = tree[1].mx;
        printf("%lld\n",lastans);
        while(m --)
        {
            LL pos;
            scanf("%d",&pos);
            pos ^= lastans;
            change(1,pos,-INF);
            lastans = tree[1].mx == -INF ? 0 : tree[1].mx;
            printf("%lld\n",lastans);
        }       
    }
    else
    {
        LL lastans = getans();
        printf("%lld\n",lastans);
        while(m --)
        {
            LL pos;
            scanf("%lld",&pos);
            pos ^= lastans;
            num[pos] --;
            lastans = getans();
            printf("%lld\n",lastans);
        }
    }
    return 0;
}
/* */


Secret

背景

wys是TKD的妹子。

wys听说TKD总把题面写得很长很长;

于是这一次她要求TKD把题面写得很短很短。

描述

这次的题面是有故事的>w<

有一天,TKD给wys发了一份密码,然后就默默地去码题了;

wys当然很不理解啊,发一串密码是个啥玩意儿;

然后呢,TKD很良心地给wys发了一份解密程序;

于是wys就能成功看懂了TKD发的东西了!

但是wys还是不满足,

她还想知道TKD是怎样把字符串加密的,

wys发现自己想不出来,所以想请你来帮帮她的忙。

帮wys写出加密程序的话,wys是会给你奖励的哦~

输入格式

第一行一个整数表示数据编号

接下来四行表示每一组数据的四个字符串。

输出格式

第一行一个整数表示数据编号

接下来四行表示每一组数据加密之后的密文。

TKD一共有五种加密方法,每种加密方法有10组数据。

wys已经收集到了全部的字符串,但是密文只收集到了一半。

即给选手的明文和输入文件完全相同(5行),密文只有输出文件中密文的一半(3行)。

提示

密文的格式是由若干个01串组成的;

01串的长度固定为8,两个01串之间用一个空格隔开;

每一个01串代表一个二进制数字;

也就是说这5种加密都是字符串→数字串的加密方式;

因为8位01串代表的是0~255之间的数,所以也可以理解为字符串→字符串的加密方式。

另外输入的字符串全部由字母数字空格以及常用字符&标点符号组成,不包括\0和\n。

对于给出的加密程序模板,

保证只会调用一次Srand();

保证不会调用无用的Rand();

不保证Len不变;

不保证交换两行输入字符串的顺序,得到的密文和原来一样;

即一个字符串对应的密文可能和上一个字符串有关;

并且仅可能和自己以及上一个字符串有关。

加密程序模板

#include<cstdio>
#include<cstdlib>
#include<cstring>

#include<iostream>
#include<algorithm>
using namespace std;

void _gets(char *UseS)
{
    gets(UseS);
    static int Len_of_U;
    Len_of_U=strlen(UseS);
    if(UseS[Len_of_U-1]=='\r')
        UseS[Len_of_U-1]=0;
}

namespace Random_Number
{
    unsigned Seed;

    void Srand(unsigned GetSeed)
    {
        Seed=GetSeed;
    }

    unsigned Rand(void)
    {
        Seed=Seed*1103515245+12345;
        return (Seed/65536)%32768;
    }
}

namespace Case0
{
    unsigned char GetC[_L];

    void Print(unsigned char Out)
    {
        static bool Save[8];
        for(int i=0;i<8;i++)
        {
            if(Out&1)
                Save[i]=true;
            else
                Save[i]=false;
            Out>>=1;
        }
        for(int i=7;i>=0;i--)
            if(Save[i])
                printf("1");
            else
                printf("0");
    }

    void Main()
    {
        static int Len;
        for(int Now=0;Now<4;Now++)
        {
            _gets((char*)GetC);
            Len=strlen((char*)GetC);
            ...
            for(int i=0;i<Len;i++)
                Print(GetC[i]),printf("%c",i^(Len-1)?' ':'\n');
        }
    }
}

namespace Case1
{
    unsigned char GetC[_L];

    void Print(unsigned char Out)
    {
        static bool Save[8];
        for(int i=0;i<8;i++)
        {
            if(Out&1)
                Save[i]=true;
            else
                Save[i]=false;
            Out>>=1;
        }
        for(int i=7;i>=0;i--)
            if(Save[i])
                printf("1");
            else
                printf("0");
    }

    void Main()
    {
        static int Len;
        for(int Now=0;Now<4;Now++)
        {
            _gets((char*)GetC);
            Len=strlen((char*)GetC);
            ...
            for(int i=0;i<Len;i++)
                Print(GetC[i]),printf("%c",i^(Len-1)?' ':'\n');
        }
    }
}

namespace Case2
{
    unsigned char GetC[_L];

    void Print(unsigned char Out)
    {
        static bool Save[8];
        for(int i=0;i<8;i++)
        {
            if(Out&1)
                Save[i]=true;
            else
                Save[i]=false;
            Out>>=1;
        }
        for(int i=7;i>=0;i--)
            if(Save[i])
                printf("1");
            else
                printf("0");
    }

    void Main()
    {
        static int Len;
        for(int Now=0;Now<4;Now++)
        {
            _gets((char*)GetC);
            Len=strlen((char*)GetC);
            ...
            for(int i=0;i<Len;i++)
                Print(GetC[i]),printf("%c",i^(Len-1)?' ':'\n');
        }
    }
}

namespace Case3
{
    unsigned char GetC[_L];

    void Print(unsigned char Out)
    {
        static bool Save[8];
        for(int i=0;i<8;i++)
        {
            if(Out&1)
                Save[i]=true;
            else
                Save[i]=false;
            Out>>=1;
        }
        for(int i=7;i>=0;i--)
            if(Save[i])
                printf("1");
            else
                printf("0");
    }

    void Main()
    {
        static int Len;
        for(int Now=0;Now<4;Now++)
        {
            _gets((char*)GetC);
            Len=strlen((char*)GetC);
            ...
            for(int i=0;i<Len;i++)
                Print(GetC[i]),printf("%c",i^(Len-1)?' ':'\n');
        }
    }
}

namespace Case4
{
    unsigned char GetC[_L];

    void Print(unsigned char Out)
    {
        static bool Save[8];
        for(int i=0;i<8;i++)
        {
            if(Out&1)
                Save[i]=true;
            else
                Save[i]=false;
            Out>>=1;
        }
        for(int i=7;i>=0;i--)
            if(Save[i])
                printf("1");
            else
                printf("0");
    }

    void Main()
    {
        static int Len;
        for(int Now=0;Now<4;Now++)
        {
            _gets((char*)GetC);
            Len=strlen((char*)GetC);
            ...
            for(int i=0;i<Len;i++)
                Print(GetC[i]),printf("%c",i^(Len-1)?' ':'\n');
        }
    }
}

int main()
{
    int Case;
    Random_Number::Srand(1);
    scanf("%d",&Case);
    static char Empty[10];
    gets(Empty);
    printf("%d\n",Case);
    Case/=10;
    if(Case==0)
        Case0::Main();
    if(Case==1)
        Case1::Main();
    if(Case==2)
        Case2::Main();
    if(Case==3)
        Case3::Main();
    if(Case==4)
        Case4::Main();
    return 0;
}

样例下载密码: ezv1

数据下载密码: c5y8

很容易看出来二十分是字符和数字一一对应的…只要抠出来就行了…好吧我也就到这个水平了233

直接粘官方题解:

首先我要自豪地说一句:
‘这是一道 wys 都只能拿 60 分的题! ’

并没有部分分算法
我们来分析一下加密算法吧。 。 。

首先拿到第一种加密方法,你可以发现:
‘这 NM 不就是一 SB 映射吗?’
然后要么打表,要么找到我是怎么随机全排列的,你就可以 A 掉了。

再看第二种加密,你可以稍微试试;
第一个数加密之后增加了一个定值,第二个数也同样。 。 。
这不就是把每个数都加了一个 Rand 吗?
一对比可以发现,的确加密就是直接顺着加 Rand。

第三种加密:
233 对应的密文有一个 0,2333 对应的密文有两个 0。
貌似只要做差就可以了。 。 。
然而第一个字母怎么做差?
观察一下,每次只用加一个 Rand 就好咯~

第四种加密:
啊这货有点难呢。 。 。 。然后你多试了几遍。 。 。
发现。 。 。咦?貌似对于每一位,结果都是一一对应的啊。 。 。
然后渐渐又能发现。 。 。对于每一位,明文每加 1,密文就会加一个定值。
然而那个定值只会是 3 or 53 or 101。
所以大胆猜测,加密方法为 X=X*P[Rand()%3]+Rand();
P 为{3,53,101}。
然后你就发现你猜对了。

第五种加密:
咦?密文都是一样长的?
那么长度一定的序列会是什么呢?
prufer 序列!
对了就是这货~
我们首先把输入的串的长度增长。 。 。增长到 254
然后再把这个序列看成一个 256 个节点的树的 prufer 序列
我们把它还原
假设根是 0,输出除了 0 之外所有节点的父亲。
我们就可以得到密文了~

这尼玛能做?…

你可能感兴趣的:(【CH】【弱省胡策】Round #7 高精度+组合数+set+主席树+题答题+密码学)