【Codeforces700D】Huffman Coding on Segment
来源:互联网 发布:php企业网站源码 编辑:程序博客网 时间:2024/05/29 09:05
题意:
给你
我撕烤了大概很久线段树怎么维护。然后一看题解告诉我是莫队!(wtf??)
按出现次数分为大于
时间复杂度
#include <bits/stdc++.h>#define gc getchar()#define ll long long#define N 100009using namespace std;int n,a[N],Q,limit,block[N],num[N],number[N],Ans[N],Number[N];vector<int> Big;struct qry{ int l,r,pos; bool operator <(const qry &rhs) { return block[l]<block[rhs.l]||(block[l]==block[rhs.l]&&r<rhs.r); }}q[N];int read(){ int x=1; char ch; while (ch=gc,ch<'0'||ch>'9') if (ch=='-') x=-1; int s=ch-'0'; while (ch=gc,ch>='0'&&ch<='9') s=s*10+ch-'0'; return x*s;}void add(int x,int y){ number[num[x]]--; num[x]+=y; number[num[x]]++;}int calc(){ priority_queue<int,vector<int>,greater<int> > qq; for (int i=0;i<(int)Big.size();i++) if (num[Big[i]]>limit) qq.push(num[Big[i]]); for (int i=1;i<=limit;i++) Number[i]=number[i]; int ret=0,last=0; for (int i=1;i<=limit;i++) if (Number[i]) { if (last) { Number[i]--,ret+=last+i; if (last+i<=limit) Number[last+i]++; else qq.push(last+i); last=0; } if (Number[i]&1) Number[i]--,last=i; ret+=Number[i]*i; if (2*i<=limit) Number[2*i]+=Number[i]/2; else for (int j=1;j<=Number[i]/2;j++) qq.push(i*2); } if (last) qq.push(last); while ((int)qq.size()>1) { int x1=qq.top(); qq.pop(); int x2=qq.top(); qq.pop(); ret+=x1+x2,qq.push(x1+x2); } return ret;}int main(){ n=read(); limit=sqrt(n); for (int i=1;i<=n;i++) { a[i]=read(); if ((++num[a[i]])==limit) Big.push_back(a[i]); if (num[a[i]]==1) number[0]++; } memset(num,0,sizeof(num)); Q=read(); for (int i=1;i<=Q;i++) q[i].l=read(),q[i].r=read(),q[i].pos=i; for (int i=1;i<=n;i++) block[i]=i/limit+1; sort(q+1,q+Q+1); int l=1,r=0; for (int i=1;i<=Q;i++) { while (r<q[i].r) add(a[++r],1); while (l>q[i].l) add(a[--l],1); while (r>q[i].r) add(a[r--],-1); while (l<q[i].l) add(a[l++],-1); Ans[q[i].pos]=calc(); } for (int i=1;i<=Q;i++) printf("%d\n",Ans[i]); return 0;}
阅读全文
0 0
- 【Codeforces700D】Huffman Coding on Segment
- Codeforces 700D Huffman Coding on Segment 莫队算法
- CF 700D Huffman Coding on Segment(huffman编码分块+莫队)
- Huffman coding.
- coding Huffman。。。
- huffman coding
- Huffman coding
- Huffman Coding
- Huffman - coding with matlab
- <Sicily>Huffman coding
- Huffman coding length
- Huffman Coding V1
- 1003. Huffman Coding
- Sicily 3703. Huffman Coding V1
- 霍夫曼编码(Huffman Coding)
- huffmanTree build and huffman Coding
- <OJ_Sicily>Huffman coding哈夫曼编码
- 霍夫曼编码(Huffman Coding)
- Python 利用内置set函数对字符串和列表进行去重
- Twitter的分布式自增ID算法snowflake(Java版)
- java学习路线_java基础
- BZOJ5044 / 九月月赛B 岛屿生成【平面几何】
- java实现人脸识别源码【含测试效果图】——前台页面层(login.jsp)
- 【Codeforces700D】Huffman Coding on Segment
- 腾讯地图获取所选区域坐标
- 表示数值的字符串
- jeesite集群和负载均衡配置
- [ZJOI2007]棋盘制作
- lwip运行一段时间后ping时间延长
- (java)预约日期+时间
- AJAX应用实例_检测用户名是否唯一
- kmp学习笔记