codeforces 700D 哈夫曼树 莫队
来源:互联网 发布:尼康 调焦软件 d7100 编辑:程序博客网 时间:2024/06/02 19:30
题意:给一个长度为n的数列a,q组询问,每组询问求将li到ri的区间中的数哈夫曼编码的长度。
莫队,对于每一个询问处理该区间内出现次数为x的字符个数。
对于次数小于
对于出现次数大于
时间复杂度
能过。。。。
#include <bits/stdc++.h>using namespace std;#define N 110000int n,q,size;vector<int>st;int a[N],cnt[N],num[N],c[N],ans[N],num1[N];struct node{ int l,r,bel; friend bool operator < (const node &r1,const node &r2) { if(r1.l/size==r2.l/size)return r1.r<r2.r; return r1.l<r2.l; };}b[N];void update(int x,int v){ num[c[x]]--; c[x]+=v; num[c[x]]++;}int cal(){ int pre=0,ret=0; priority_queue<int,vector<int>,greater<int> >que; for(int i=0;i<st.size();i++) if(c[st[i]]>size)que.push(c[st[i]]); for(int i=1;i<=size;i++)num1[i]=num[i]; for(int i=1;i<=size;i++) if(num1[i]) { if(pre) { num1[i]--; if(pre+i>size)que.push(pre+i); else num1[pre+i]++; ret+=pre+i;pre=0; } if(num1[i]&1) num1[i]--,pre=i; ret+=num1[i]*i; if(i*2>size) for(int j=1;j<=num1[i]/2;j++)que.push(i*2); else num1[i*2]+=num1[i]/2; } if(pre)que.push(pre); while(que.size()>1) { int r1=que.top();que.pop(); int r2=que.top();que.pop(); que.push(r1+r2);ret+=r1+r2; } return ret;}int main(){ //freopen("tt.in","r",stdin); scanf("%d",&n); size=sqrt(n)+1; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); cnt[a[i]]++; if(cnt[a[i]]==size) st.push_back(a[i]); } scanf("%d",&q); for(int i=1;i<=q;i++) { scanf("%d%d",&b[i].l,&b[i].r); b[i].bel=i; } sort(b+1,b+1+q); int r=0,l=1; for(int i=1;i<=q;i++) { while(l<b[i].l)update(a[l],-1),l++; while(l>b[i].l)l--,update(a[l],1); while(r<b[i].r)r++,update(a[r],1); while(r>b[i].r)update(a[r],-1),r--; ans[b[i].bel]=cal(); } for(int i=1;i<=q;i++) printf("%d\n",ans[i]); return 0;}
0 0
- codeforces 700D 哈夫曼树 莫队
- codeforces 86 D. Powerful array (莫队)
- Codeforces 86D Powerful Array 莫队
- codeforces 884D Boxes And Balls (哈夫曼树)
- CodeForces 617D CodeForces 617D
- CodeForces 101D
- CodeForces 103D
- CodeForces 222D Olympiad
- codeforces 242d
- CodeForces 111D
- 【codeforces】3D
- CodeForces 127D Password
- codeforces 257D. Sum
- Codeforces 292D
- Codeforces 275D
- Codeforces 126D
- Codeforces 337d
- Codeforces D. Points
- JZOJ4714公约数
- HTML5与CSS3的新特性
- 2015湖南省acm省赛赛题解(部分)
- Ubuntu虚拟机下一些常见问题解决[待续]
- RasCustomDial
- codeforces 700D 哈夫曼树 莫队
- IQKeyboardManager的用法
- AlertDialog使用和自定义
- 最简单的基于FFMPEG+SDL的视频播放器:拆分-解码器和播放器
- 监督学习和无监督学习
- Javase常见面试题目的学习笔记、知识点整理(边学边补充)
- 剑指Offer:链表中环的入口节点
- 台式机win8.1下装ubuntu16.04双系统,并解决启动项Windows系统消失的问题。
- 如何使用Python写一个爬虫软件