HDU6047Maximum Sequence
来源:互联网 发布:电脑静默安装软件 编辑:程序博客网 时间:2024/06/16 22:52
题目连接
题意
给定长度为n的数列A和数列B,利用已经存在的两数列A,B生成A数列的后续
分析
要求取最大值,显然
代码
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<map>#include<cmath>#include<queue>using namespace std;#define LL long long#define MAXN 250250const int mod=1e9+7;struct Node{ int v,idx; Node(int _v,int _idx):v(_v),idx(_idx){} Node(){} friend bool operator<(Node n1,Node n2){ if(n1.v!=n2.v) return n1.v<n2.v; return n1.idx<n2.idx; }};int bin[MAXN];int a[MAXN];int b[MAXN];int lowbit(int x){ return x&-x;}int sum(int x){ int ret=0; while(x){ ret+=bin[x]; x-=lowbit(x); } return ret;}int add(int x){ while(x<MAXN){ bin[x]++; x+=lowbit(x); }}int query(int x,int y){ return sum(y)-sum(x-1);}int main(){ int n; while(~scanf("%d",&n)){ priority_queue<Node> q; memset(bin,0,sizeof(bin)); for(int i=1;i<=n;++i){ scanf("%d",&a[i]); q.push(Node(a[i]-i,i)); } for(int i=1;i<=n;++i){ scanf("%d",&b[i]); add(b[i]); } LL ans=0; int res=n,mx=0,pos=n+1; while(res && !q.empty()){ Node tmp=q.top(); q.pop(); if(tmp.idx<=mx) continue; if(tmp.idx>mx){ if(tmp.idx>n){ ans+=tmp.v*1ll*res; res=0; continue; } else{ int num=query(mx+1,tmp.idx); ans+=tmp.v*1ll*num; q.push(Node(tmp.v-pos,pos)); pos+=num; res-=num; mx=tmp.idx; continue; } } } ans%=mod; printf("%I64d\n",ans); }}
阅读全文
0 0
- HDU6047Maximum Sequence
- hdu6047Maximum Sequence(优先队列)
- 2017第二次多校联合hdu6047Maximum Sequence
- sequence
- SEQUENCE
- Sequence
- sequence
- sequence
- Sequence
- sequence
- sequence
- sequence
- Sequence
- Sequence
- Sequence
- Sequence
- sequence
- sequence
- bzoj3295树状数组套主席树
- Unity3D默认的快捷键
- 分布式配置管理平台disconf-初体验
- 基于Python检索系统(1)总体介绍
- Play framework自定义标签
- HDU6047Maximum Sequence
- easyui 实现动态表头
- java 多线程简单介绍
- -----dfs+思维 hdu 6060-RXD and dividing
- Android开发 第六课 ChexkBox
- FZU
- Linux之输出重定向
- ajax
- vue之表单验证