人品计算

    题目大意: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. E20170930-hm

    parse   vt. 从语法上描述或分析(词句等);

  2. php实现下载

    PHP实现下载文件的两种方法.分享下,有用到的朋友看看哦. 方法一: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <?php /** * 下载文件 * ...

  3. php获得文件的属性

    PHP获取文件属性可以用到多种函数,来实现我们对文件各种不同信息的获取需求.在这里我们就简单的介绍了这些获取方式的实现方法. 详细解读PHP获取远程图片技巧 详细介绍PHP读取目录函数 如何运用相关函 ...

  4. 洛谷P1396营救(最小生成树)

    题目描述 “咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动的热泪盈眶,开起了门…… 妈妈下班回家,街坊邻居说小明被一群陌生人强行押上了警车!妈妈丰富的经验告诉她小 ...

  5. [Swift通天遁地]八、媒体与动画-(6)使用开源类库快速实现滑入动画

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  6. jmeter中对于各类时间格式的设置

    最普通的设置为使用 函数助手中的__time, 设置好需要使用的类型,并设置接收参数即可 YMD = yyyyMMdd HMS = HHmmss YMDHMS = yyyyMMdd-HHmmss 第二 ...

  7. setjmp和longjmp函数

    关于setjmp函数和longjmp函数有话要说,是UNIX高级环境变成看到了10.10信号那章用到了,研究一下,这里作为补充. setjmp(jmp_buf env_buf) 函数可以将当前的运行环 ...

  8. No operations allowed after connection closed--转

    https://www.jianshu.com/p/1626d41572f2 Spring boot的单数据源配置比较简单,只需要在application.properties配置相关的jdbc连接的 ...

  9. Ch03 React/JSX/Component 簡介

    Facebook 本身有提供 Test Utilities,但由于不够好用,所以目前主流开发社群比较倾向使用 Airbnb 团队开发的 enzyme,其可以与市面上常见的测试工具(Mocha.Karm ...

  10. Win32最简单的程序

    #include<tchar.h> #include<stdio.h> #include<windows.h> LRESULT CALLBACK WinSunPro ...