人品计算

    题目大意:n个数的a序列,m组询问。每次询问给出T,A,B,K。求在a序列的[A,B]的位置之内的K小值P,的$C_{T}^{P \% T} \% 10111$。

    注释:每组询问保证区间只相交,不包含。$1\le n \le 10^5$,$1\le m \le 10^4$。

      想法:卧槽?啥题啊??!get一波新知识点:权值线段树。

        权值线段树,就是在序列的桶里建线段树,维护balabala。修改就是在原序列上修改,等价在桶上进行修改,然后操作和线段树几乎相同,没啥区别。可以支持一些线段树并不能完成的操作:查询全局k最值等。特别地,我们并不用单独开一个桶的数组,只需要在权值线段树的底层修改、维护即可。

      关于这道题,由于题目中说明了区间和区间之间只有相交,没有包含,这就等价于离线,按区间左端点排序后右端点也是递增的,这样我们就可以将两个区间相交的地方保留,左边的全都将桶内元素-1,右边的+1,然后套版子查询k小值即可。

    最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define lson pos<<1
#define rson pos<<1|1
#define mod 10111
#define N 100010
using namespace std;
int before[N/100+1],change[N/100+1];
int s[N<<2],a[N];
int ans[N/10];
struct Node
{
int t,l,r,k;
int id;
Node(){t=id=l=r=k=0;}
}f[N];
bool cmp(Node a,Node b)
{
return a.l<b.l;
}
void fix(int pos,int l,int r,int x,int y)//在区间l到r中将x+y
{
int mid=(l+r)>>1;
s[pos]+=y;
if(l==r)
{
return;
}
if(x<=mid) fix(lson,l,mid,x,y);
else fix(rson,mid+1,r,x,y);
// s[pos]=s[lson]+s[rson];
}
int find(int pos,int l,int r,int k)//查询l到r之内的k小值
{
int mid=(l+r)>>1;
if(l==r) return r;
if(k<=s[lson]) return find(lson,l,mid,k);
else return find(rson,mid+1,r,k-s[lson]);
}
int quick_power(int x,int y,int z)//快速幂
{
int ans=1;
x%=z;
while(y)
{
if(y&1) ans=(ans*x)%z;
y>>=1;
x=(x*x)%z;
}
return ans;
}
int main()
{
freopen("rp.in","r",stdin);
freopen("rp.out","w",stdout);
int n,m;
cin >> n >> m;
before[1]=before[0]=change[0]=change[1]=1;
for(int i=2;i<=1000;i++)
{
before[i]=before[i-1]*i%mod;
change[i]=quick_power(before[i],mod-2,mod);
}
// cout << before[6] << endl ;
// cout << before[66]*change[66]%mod << endl ;
int minn=0x7f7f7f7f,maxn=0;//minn和maxn分别是整个线段树基层桶的下界和上界
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
minn=min(minn,a[i]);
maxn=max(maxn,a[i]);
}
for(int i=1;i<=m;i++)
{
scanf("%d%d%d%d",&f[i].t,&f[i].l,&f[i].r,&f[i].k);
f[i].id=i;
}
sort(f+1,f+m+1,cmp);
// for(int i=0;i<=m;i++)
// {
// cout << f[i].l << " " << f[i].r << endl ;
// }
for(int i=1;i<=m;i++)
{
// if(f[i-1].r<f[i].l)
// {
if(i!=1)
for(int j=f[i-1].l;j<=(f[i].l>f[i-1].r?f[i-1].r:f[i].l-1);j++)//注意边界
{
fix(1,minn,maxn,a[j],-1);
// cout << "Tiao del : " << j << endl ;
}
for(int j=(f[i].l>f[i-1].r?f[i].l:f[i-1].r+1);j<=f[i].r;j++)//注意边界
{
fix(1,minn,maxn,a[j],1);
// cout << "Tiao add : " << j << endl ;
}
// }
// else
// {
// }
int middle=find(1,minn,maxn,f[i].k)%f[i].t;
// cout << middle << endl ;
ans[f[i].id]=before[f[i].t]%mod*change[(f[i].t-middle)]%mod*change[middle]%mod;
}
for(int i=1;i<=m;i++)
{
printf("%d\n",ans[i]);
}
return 0;
}

    小结:错误:1.离散排序处理答案之后需要将它们按照读入的顺序输出!!!

          2.before函数记录的是阶乘,然后由于N是100010,所以N/10恰好为1000,导致before[1000]这个值没有取到,直接Gg

[jdoj1258]野生动物园(change by panxf)_权值线段树_组合数的更多相关文章

  1. [bzoj2733][HNOI2012]永无乡_权值线段树_线段树合并

    永无乡 bzoj-2733 HNOI-2012 题目大意:题目链接. 注释:略. 想法: 它的查询操作非常友善,就是一个联通块内的$k$小值. 故此我们可以考虑每个联通块建一棵权值线段树. 这样的话每 ...

  2. BZOJ_2161_布娃娃_权值线段树

    BZOJ_2161_布娃娃_权值线段树 Description 小时候的雨荨非常听话,是父母眼中的好孩子.在学校是老师的左右手,同学的好榜样.后来她成为艾利斯顿第二 代考神,这和小时候培养的良好素质是 ...

  3. BZOJ_3685_普通van Emde Boas树_权值线段树

    BZOJ_3685_普通van Emde Boas树_权值线段树 Description 设计数据结构支持: 1 x  若x不存在,插入x 2 x  若x存在,删除x 3    输出当前最小值,若不存 ...

  4. B20J_2733_[HNOI2012]永无乡_权值线段树合并

    B20J_2733_[HNOI2012]永无乡_权值线段树合并 Description:n座岛,编号从1到n,每座岛都有自己的独一无二的重要度,按照重要度可以将这n座岛排名,名次用1到 n来表示.某些 ...

  5. BZOJ_1503_[NOI2004]郁闷的出纳员_权值线段树

    BZOJ_1503_[NOI2004]郁闷的出纳员_权值线段树 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资. ...

  6. 3065: 带插入区间K小值_树套树_替罪羊树_权值线段树

    经过周六一天,周一3个小时的晚自习,周二2个小时的疯狂debug,终于凭借自己切掉了这道树套树题. Code: #include <cstdio> #include <algorit ...

  7. [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树

    二逼平衡树 bzoj-3196 Tyvj-1730 题目大意:请写出一个维护序列的数据结构支持:查询给定权值排名:查询区间k小值:单点修改:查询区间内定值前驱:查询区间内定值后继. 注释:$1\le ...

  8. BZOJ3110[Zjoi2013]K大数查询——权值线段树套线段树

    题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是 ...

  9. BZOJ2141排队——树状数组套权值线段树(带修改的主席树)

    题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家 乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别 ...

随机推荐

  1. 必会!Linux文件的管理

    1.1 创建一个目录 /data [root@liuhao ~]# mkdir /data 1.2 查看目录是否创建成功 <可以找到data即为创建成功> [root@liuhao ~]# ...

  2. CF1073C Vasya and Robot

    CF题目难度普遍偏高啊-- 一个乱搞的做法.因为代价为最大下标减去最小的下标,那么可以看做一个区间的修改.我们枚举选取的区间的右端点,不难发现满足条件的左端点必然是不降的.那么用一个指针移一下就好了 ...

  3. robotframework - 介绍&应用

    一.参考简书链接 :https://www.jianshu.com/p/c3a9d20db4e5 二.介绍 Robot Framework是一个基于Python的,可扩展的关键字驱动的测试自动化框架, ...

  4. vue-video-player视频播放插件

    安装依赖 npm install vue-video-player -S 引入配置 //main.js import 'video.js/dist/video-js.css' import 'vue- ...

  5. NS2学习笔记(五)

    对无线网络,生成nam文件要使用namtrace-all-wireless, 而不是namtrace-all: set nf [open test_1.nam w] $ns_ namtrace-all ...

  6. JavaScript--显示和隐藏(display属性)

    网页中经常会看到显示和隐藏的效果,可通过display属性来设置. 语法: Object.style.display = value 注意:Object是获取的元素对象,如通过document.get ...

  7. python值函数名的使用以及闭包,迭代器

    一.函数名的运用 函数名就是一个变量名,但它是一个特殊的变量名,是一个后面加括号可以执行函数的变量名. def func(): print("我是一个小小的函数") a = fun ...

  8. PHP 在线 编辑 解析

    http://www.w3schools.com/php/default.asp    http://www.w3schools.com/php/showphp.asp?filename=demo_s ...

  9. Java系列学习(七)-面向对象

    1.成员变量和局部变量的区别 (1)在类中的位置不同 成员变量:类中 方法外 局部变量:方法中 (2)在内存中的位置不同 成员变量:在堆中 局部变量:在栈中 (3)生命周期不同 成员变量:随着对象的创 ...

  10. Python语言之类

    1.一个空类 #Filename : emptyclass.py class Empty: pass e = Empty() print( e ) #<__main__.Empty object ...