题目大意:给出n个地点和q个询问。其中每个地点有距离和权值,每个询问给出l,r,k,表示在[l,r]区间内不取最小点的情况下任取k个,求所有情况权值之积之和(n,q<=1e5,k<=6)。

能看出来是区间操作,先考虑树状数组,发现维护比较难。于是用线段树维护。

每个节点记录7个值,分别为minv和不算minv任取1~6个所得值。dalao的正解用了RMQ+容斥,但我都没用。

#include<cstdio>
#include<algorithm>
using namespace std;
#define N 100050
#define ui unsigned int
int n,Q;
struct pla
{
int d,v;
}p[N];
bool cmp(pla a,pla b)
{
return a.d<b.d;
}
struct segtree
{
ui mn;
ui v[];
}tr[*N];
segtree operator * (segtree s0,segtree s1)
{
segtree ret;
for(int i=;i<=;i++)
{
ret.v[i]=s0.v[i]+s1.v[i];
for(int j=;j<i;j++)ret.v[i]+=s0.v[j]*s1.v[i-j];
}
ret.mn = min(s0.mn,s1.mn);
ui mx = max(s0.mn,s1.mn);
for(int i=;i>=;i--)
{
ret.v[i]+=ret.v[i-]*mx;
}
ret.v[]+=mx;
return ret;
}
void update(int u)
{
tr[u] = tr[u<<] * tr[u<<|];
}
void build(int l,int r,int u)
{
if(l==r)
{
tr[u].mn=(ui)p[l].v;
return ;
}
int mid = (l+r)>>;
build(l,mid,u<<);
build(mid+,r,u<<|);
update(u);
}
segtree query(int l,int r,int u,int ql,int qr)
{
if(l==ql&&r==qr)return tr[u];
int mid = (l+r)>>;
if(ql>mid)return query(mid+,r,u<<|,ql,qr);
else if(qr<=mid) return query(l,mid,u<<,ql,qr);
else
{
segtree s0=query(l,mid,u<<,ql,mid);
segtree s1=query(mid+,r,u<<|,mid+,qr);
segtree ret = s0 * s1;
return ret;
}
}
ui jc[];
int mi[];
int findl(int d)
{
int a = n;
for(int i=;i>=;i--)
{
if(a-mi[i]<=)continue;
if(p[a-mi[i]].d>=d)a-=mi[i];
}
return a;
}
int findr(int d)
{
int a = ;
for(int i=;i>=;i--)
{
if(a+mi[i]>n)continue;
if(p[a+mi[i]].d<=d)a+=mi[i];
}
return a;
}
int main()
{
// freopen("c.in","r",stdin);
// freopen("c.out","w",stdout);
scanf("%d%d",&n,&Q);
jc[]=,jc[]=,jc[]=,jc[]=,jc[]=,jc[]=;
mi[]=;
for(int i=;i<=;i++)mi[i]=mi[i-]<<;
for(int i=;i<=n;i++)scanf("%d",&p[i].d);
for(int i=;i<=n;i++)scanf("%d",&p[i].v);
sort(p+,p++n,cmp);
build(,n,);
for(int ll,rr,l,r,k,i=;i<=Q;i++)
{
scanf("%d%d%d",&ll,&rr,&k);
l = findl(ll);
r = findr(rr);
if(l>r)
{
printf("0\n");
continue;
}
segtree ans;
ans = query(,n,,l,r);
printf("%u\n",ans.v[k]*jc[k]);
}
fclose(stdin);
fclose(stdout);
return ;
}

最新文章

  1. Android Weekly Notes Issue #237
  2. 【Java心得总结一】Java基本类型和包装类型解析
  3. Android开发中的输入合法性检验
  4. Repeater分页代码
  5. 苹果Xcode帮助文档阅读指南
  6. Linux学习之CentOS--CentOS6.4下Mysql数据库的安装与配置【转】
  7. mongo db安装和php,python插件安装
  8. ubuntu删除openjdk,安装 Sun JDK
  9. [转] 关于UIView
  10. 具体解说Android的图片下载框架UniversialImageLoader之磁盘缓存的扩展(二)
  11. Object-c 单例模式中的 allocWithZone作用
  12. uestc Palindromic String
  13. mysql 统计某个月每天的数据
  14. 了解Java基本数据类型的取值范围
  15. [转帖] infiniband的协议速度
  16. [C++]求解三元一次方程组
  17. Linux服务器性能评估
  18. 阿里云服务器用smtp发送邮件返失败
  19. 1)HDFS分布式文件系统 2)HDFS核心设计 3 )HDFS体系结构
  20. 很不错的python 机器学习博客

热门文章

  1. Android笔记---常用控件以及用法
  2. python 基本类型的创建方法
  3. bzoj 3676: [Apio2014]回文串【回文自动机】
  4. bzoj 1207: [HNOI2004]打鼹鼠【dp】
  5. AtCoder Beginner Contest 058 ABCD题
  6. toLocaleSting()
  7. Java基础学习-一切皆为对象
  8. Java报表之JFreeChart
  9. jsapi4加载的首个图层的范围被默认作为地图范围,且不能修改的解决
  10. Android基础夯实--重温动画(二)之Frame Animation