http://codeforces.com/contest/462

A:Appleman and Easy Task

要求是否全部的字符都挨着偶数个'o'

  1. #include <cstdio>
  2. using namespace std;
  3. char maz[][];
  4. int n;
  5. int cnt[][];
  6. const int dx[]={,,-,};
  7. const int dy[]={,-,,};
  8. int main(){
  9. scanf("%d",&n);
  10. gets(maz[]);
  11. for(int i=;i<n;i++){
  12. gets(maz[i]);
  13. }
  14. for(int i=;i<n;i++){
  15. for(int j=;j<n;j++){
  16. if(maz[i][j]=='o'){
  17. for(int k=;k<;k++){
  18. int nx=i+dx[k];
  19. int ny=j+dy[k];
  20. if(nx<n&&ny<n&&nx>=&&ny>=){cnt[nx][ny]++;}
  21. }
  22. }
  23. }
  24. }
  25. for(int i=;i<n;i++){
  26. for(int j=;j<n;j++){
  27. if(cnt[i][j]&){puts("NO");return ;}
  28. }
  29. }
  30. puts("YES");
  31. return ;
  32. }

B:Appleman and Card Game

贪心

  1. #include <cstdio>
  2. #include <algorithm>
  3. using namespace std;
  4. long long n,k;
  5. long long cnt[];
  6. char maz[];
  7. int main(){
  8. scanf("%I64d%I64d",&n,&k);
  9. gets(maz);
  10. gets(maz);
  11. for(int i=;i<n;i++)cnt[maz[i]-'A']++;
  12. sort(cnt,cnt+);
  13. long long ans=;
  14. for(int i=;i>=;i--){
  15. if(cnt[i]>=k){
  16. ans+=k*k;
  17. k=;
  18. }
  19. else {
  20. k-=cnt[i];
  21. ans+=cnt[i]*cnt[i];
  22. }
  23. if(k==)break;
  24. }
  25. printf("%I64d\n",ans);
  26. return ;
  27. }
  1. 题解意思:
    这是一道霍夫曼编码的反问题,把所有边权取反就是霍夫曼树问题,详细证明请看算法导论,大概证明一下:
    可以把每次的拿来拆分的每一段的都作为树上的节点,长度为1的值必然是叶节点,会在统计一次后被抛出,这时父节点权值则是子节点权值之和,而且必然是一颗二叉树,这与题目是符合的,也就是说深度越大的叶节点加和的次数越多,那么把最大的那两个节点先放在树里,那么它们的父节点就拥有两个节点之和的性质,那么再添加次大的,如此构建就形成了整棵最优树,(算法导论可以严格证明这是棵最优树,通过反证法),于是除了最大的两个点加了n次,其余的点分别加了n-1,n-2,....2
  1. #include <cstdio>
  2. #include <algorithm>
  3. using namespace std;
  4. const int maxn=;
  5. int n;
  6. long long a[maxn];
  7. int main(){
  8. scanf("%d",&n);
  9. long long ans=,sum=;
  10. for(int i=;i<n;i++){scanf("%I64d",a+i);sum+=a[i];}
  11. sort(a,a+n);
  12. ans=sum;
  13. for(int i=;i<n;i++){
  14. ans+=sum;
  15. sum-=a[i-];
  16. }
  17. printf("%I64d\n",ans);
  18. return ;
  19. }
  1. D:Appleman and Tree
  1. 树形dp
    这是一道树形dp,我一开始想到奇怪的地方去了,什么连通域之类的
    对每个点,dp记录使其的所有子树成为单黑或纯白的方式,最后再加上自身的黑/白属性
    具体来说
    初始化:子树单黑=0,子树纯白=1
    单黑=现有单黑*子树纯白+子树单黑*现有纯白
    纯白=现有纯白*子树纯白
    然后加入自身的属性
    如果自身为黑,那么单黑=子树纯白(现有黑:切掉所有子节点成为0)
    如果自身为白,那么纯白*=子树纯白(切掉本身使得孤立的方式更多)
  1. #include<cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <vector>
  5. using namespace std;
  6. const int maxn=;
  7. const long long mod= ;
  8. long long dp[maxn][];
  9. int color[maxn];
  10. vector<int> G[maxn];
  11. bool vis[maxn];
  12. void dfs(int s){
  13. dp[s][]=;
  14. dp[s][]=;
  15. vis[s]=true;
  16. for(int i=;i<G[s].size();i++){
  17. int t=G[s][i];
  18. if(vis[t])continue;
  19. dfs(t);
  20. dp[s][]=(dp[s][]*dp[t][]+dp[s][]*dp[t][])%mod;
  21. dp[s][]=dp[s][]*dp[t][]%mod;
  22. }
  23. if(color[s]==){
  24. dp[s][]=dp[s][];
  25. }
  26. else dp[s][]+=dp[s][];
  27. dp[s][]%=mod;
  28. dp[s][]%=mod;
  29. }
  30. int main(){
  31. int n;
  32. scanf("%d",&n);
  33. for(int i=;i<n;i++){
  34. int temp;
  35. scanf("%d",&temp);
  36. G[temp].push_back(i);
  37. }
  38. for(int i=;i<n;i++)scanf("%d",color+i);
  39. dfs();
  40. printf("%I64d\n",dp[][]);
  41. return ;
  42. }

E:Appleman and a Sheet of Paper

  1. 线段树
    翻折,当长度>len/2的时候那么就反向翻折,这时候相当于反向了一次,需要反着来统计
    看上去思路很清晰但是很麻烦
  1. #include<cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <vector>
  5. using namespace std;
  6. const int maxn=;
  7. const int maxnode=;
  8. long long w[maxnode];
  9. int cur,s,e,len,n,q;
  10. int num(int i){//返回正确的标号,传入的是从开始的端点所需经过距离
  11. if(cur==){return s+i;}
  12. return e-i;
  13. }
  14. void update(int k,int d){//更新线段树
  15. int tk=k;
  16. k+=n-;
  17. w[k]+=d;
  18. while(k>){
  19. k=(k-)/;
  20. w[k]+=d;
  21. }
  22. }
  23. void inv(int l){//翻转
  24. int tl;
  25. if(l*>len){tl=len-l;cur^=;}//翻转统计的同时就要反向更新了
  26. else tl=l;
  27. for(int i=;i<tl;i++){
  28. int td=num(tl*--i);
  29. int td2=num(i);
  30. update(td,w[td2+n-]);
  31. update(td2,-w[td2+n-]);
  32. }
  33. if(cur)e-=tl;else s+=tl;
  34. len=e-s+;
  35. }
  36. long long query(int a,int b,int k,int l,int r){
  37. if(r<=a||l>=b||l>=r)return ;
  38. if(a<=l&&r<=b){
  39. return w[k];
  40. }
  41. else {
  42. long long v1=query(a,b,k*+,l,(l+r)/);
  43. long long v2=query(a,b,k*+,(l+r)/,r);
  44. return v1+v2;
  45. }
  46. }
  47. int main(){
  48. scanf("%d%d",&n,&q);int tn=n,ttn=n;n=;
  49. while(tn>){n<<=;tn>>=;}
  50. for(int i=;i<ttn;i++)update(i,);
  51. s=;e=ttn-;len=ttn;
  52. while(q--){
  53. int op;
  54. scanf("%d",&op);
  55. if(op==){
  56. int l;
  57. scanf("%d",&l);
  58. inv(l);
  59. }
  60. else{
  61. int l,r;
  62. scanf("%d%d",&l,&r);
  63. if(cur){
  64. l=num(l-);//这里卡我半天因为题目给的是从s开始的序号所以从e开始就要+1,传进的参数要-1
  65. r=num(r-);
  66. }
  67. else {
  68. l=num(l);
  69. r=num(r);
  70. }
  71. if(l>r)swap(l,r);
  72. long long ans=query(l,r,,,n);
  73. printf("%I64d\n",ans);
  74. }
  75.  
  76. }
  77. }

CF 463A && 463B 贪心 && 463C 霍夫曼树 && 463D 树形dp && 463E 线段树的更多相关文章

  1. Alink漫谈(十六) :Word2Vec源码分析 之 建立霍夫曼树

    Alink漫谈(十六) :Word2Vec源码分析 之 建立霍夫曼树 目录 Alink漫谈(十六) :Word2Vec源码分析 之 建立霍夫曼树 0x00 摘要 0x01 背景概念 1.1 词向量基础 ...

  2. 赫夫曼\哈夫曼\霍夫曼编码 (Huffman Tree)

    哈夫曼树 给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离 ...

  3. C# 霍夫曼二叉树压缩算法实现

    知道有的人比较懒,直接贴全部代码. 一开始一次性Code完了压缩部分代码.只调试了2,3次就成功了. 一次性写150行代码,没遇到什么bug的感觉还是蛮爽的. 写解压代码,才发现压缩代码有些细节问题. ...

  4. 基于python的二元霍夫曼编码译码详细设计

    一.设计题目 对一幅BMP格式的灰度图像(个人证件照片)进行二元霍夫曼编码和译码 二.算法设计 (1)二元霍夫曼编码: ①:图像灰度处理: 利用python的PIL自带的灰度图像转换函数,首先将彩色图 ...

  5. word2vec 中的数学原理二 预备知识 霍夫曼树

    主要参考:    word2vec 中的数学原理详解                 自己动手写 word2vec 编码的话,根是不记录在编码中的 这一篇主要讲的就是霍夫曼树(最优二叉树)和编码.  ...

  6. 霍夫曼编码(Huffman Coding)

    霍夫曼编码(Huffman Coding)是一种编码方法,霍夫曼编码是可变字长编码(VLC)的一种. 霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符 ...

  7. 采用霍夫曼编码(Huffman)画出字符串各字符编码的过程并求出各字符编码 --多媒体技术与应用

    题目:有一个字符串:cabcedeacacdeddaaaba,问题: (1)采用霍夫曼编码画出编码的过程,并写出各字符的编码 (2)根据求得的编码,求得各编码需要的总位数 (3)求出整个字符串总编码长 ...

  8. word2vec中关于霍夫曼树的

    再谈word2vec 标签: word2vec自然语言处理NLP深度学习语言模型 2014-05-28 17:17 16937人阅读 评论(7) 收藏 举报  分类: Felven在职场(86)    ...

  9. 霍夫曼编码(Huffman)

    题目:有一个字符串:cabcedeacacdeddaaaba,问题: (1)采用霍夫曼编码画出编码的过程,并写出各字符的编码 (2)根据求得的编码,求得各编码需要的总位数 (3)求出整个字符串总编码长 ...

随机推荐

  1. Easyui 官网网址

    http://www.jeasyui.com/download/list.php 下载版本1.5.2的easyui中文API,可在CSDN网站http://download.csdn.net/down ...

  2. js中拼接HTML方式方法及注意事项

    博主原创:未经博主允许,不得转载 在前端应用中,经常需要在js中动态拼接HTML页面,比如应用ajax进行局部刷新的时候,就需要在js中拼接HTML页面. 主要规则是将HTML页面的标签拼接为标签字符 ...

  3. samba基本应用24-4及示例

    samba smb:service message block(137/udp, 138/udp, 139/tcp, 445/tcp) 协议是:CIFS:Common Internet File Sy ...

  4. UVa 1354 天平难题

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  5. ThreadPool开启多线程时支持最大连接200个(默认为2个),不加则会超时

    //ThreadPool System.Net.ServicePointManager.DefaultConnectionLimit = 200;

  6. 常见dos命令汇总

    常用的内部命令有md.cd.rd.dir.path.copy.type.edit.ren.del.cls.ver.date.time.prompt.常用的外部命令有deltree.format.dis ...

  7. 解决在nginx+php环境下$_SERVER['PHP_SELF']获取不到值的问题

    Tp3.2. __APP__获取值不正确.$_SERVER['PHP_SELF']为空导致. 原来是php.ini的问题. sudo vim /usr/local/php/etc/php.ini 重启 ...

  8. LIBS+=

    ZC: “LIBS+=”是要结合“LIBPATH += ”一起使用的?类似下面的用法: ZC: “LIBS+=”指明lib文件的名称,“LIBPATH += ”指明lib文件的路径.最后还要把DLL文 ...

  9. 《F4+2》β冲刺第二天

    β冲刺第二天 1.每个成员今日完成的任务: 马仲山:系统代码和开发总结文档的完善 马婧(12):完善需求文档 马婧(13):完善设计文档 马世芳:对部分功能实现进行测试 张俊逸:针对测试出现的问题完善 ...

  10. 《剑指offer》第二十八题(对称的二叉树)

    // 面试题28:对称的二叉树 // 题目:请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和 // 它的镜像一样,那么它是对称的. #include <iostream> ...