2017暑假石家庄一中

来源:互联网 发布:淘宝推广计划 编辑:程序博客网 时间:2024/04/28 13:44

礼物运送:

状压dp,用二进制表示这个点分别由谁走,floyed.

//先求一遍最短路,赋初始值dp[0][1]=0;for(int now=0;now<=S;now++){for(int i=1;i<=n;i++){if (dp[now][i]>inf) continue;for (int j=1;j<=n;j++)  if(now>>(j-1)&1)continue;  else dp[now|(1<<j-1)][j]=min(dp[now|(1<<j-1)][j],dp[now][i]+G[i][j]);if(ans[now]==-1)ans[now]=dp[now][i];else ans[now]=min(ans[now],dp[now][i]);}}//枚举各种状态,再进行dp

braveman:

贪心题,类似国王的游戏。


tree:

现在有一棵二叉树,所有非叶子节点都有两个孩子。在每个叶子节点上有一个权值(有n个叶子节点,满足这些权值为1..n的一个排列)。可以任意交换每个非叶子节点的左右孩子。

要求进行一系列交换,使得最终所有叶子节点的权值按照中序遍历写出来,逆序对个数最少。

本蒟蒻听了一中大佬解释才想到。。。好弱。。。

其实中xvbianli中序遍历就是dfs,求出最少逆序对就可以了(玄学)


maxval:

给出一个字符串S,求其所有前缀中,字符长度与出现次数的乘积的最大值。

我当时用的暴力,55分,不能再高了。

正解kmp(其实它就是来求循环节的)。

scanf("%s",a+1);    n=strlen(a+1);    for (int i=2;i<=n;i++)   {        while (t&&a[i]!=a[t+1]) t=nxt[t];        if (a[i]==a[t+1]) t++;        nxt[i]=t;         cnt[t]++;    }//kmp中nxt    long long ans=0;    for (int i=n;i>=1;i--)   {        ans=max(ans,(cnt[i]+1)*i);//更新答案        cnt[nxt[i]]+=cnt[i];    }    printf("%lld",ans);


数列(seq):

n个数,m次询问,每次问[l,r]区间有多少个数恰好出现正偶数次

第一眼想dp,但明显不是,绝对的后效性。

打了个暴力。。。

传说中的莫队算法%%%

分块,排序,在根号n范围内进行转移(左右)


改造二叉树:

这个还是比较好操作的。

dfs,求lis(不完全是,要进行玄学减法操作,确保不相等)

//dfs序是个好东西


仓库:

o(n)的树上转移还是可以的,但那个巨坑的xor,保留啊啊啊啊


打倒charlotte:

貌似一个树形dp.;


异或:

打的暴力。。。。。


虐题三角:

写过类似的~~一样的~~

按公式求,加gcd(double和int转换也很麻烦)

n^3暴力,正解要经过玄学预处理




原创粉丝点击