人品计算

    题目大意: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. Antenna Placement(二分图的最大匹配)

    http://poj.org/problem?id=3020 题意: 一个矩形中,有N个城市'*',现在这n个城市都要覆盖无线,若放置一个基站,它至多可以覆盖相邻的两个城市.问至少放置多少个基站才能使 ...

  2. codevs1669 运输装备(背包dp)

    1669 运输装备  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond   题目描述 Description 德国放松对英国的进攻后,把矛头指向了东北——苏联 ...

  3. 关于postman软件的安装与使用

    1.这个软件是一个模拟发请求的软件 2.这个软件和这个网站的 json 格式数据有着很好的关系  https://www.json.cn/ 他能帮助我们分解代码, 3.在使用(修改的)过程中发现了一个 ...

  4. Scaffold-DbContext-EFCore DB First

    在使用 Scaffold-DbContext迁移数据库的时候会遇到两个问题. 一.文件已存在,其实报错很明显,增加 -force即可. 二.大小写转换,不和数据库一样了,如果要保持和数据库一致.增加  ...

  5. $tsinsenA1067$

    \(problem\) 这种题目需要一个定理 \(a[1]+a[2]+a[3]+a[4]...=(a[1]%mod)+...\) 本人出奇的懒 然后 动态规划?(恰似枚举) #include < ...

  6. jmeter中beanshell断言的使用

    简单使用beanshell的内容,进行测试内容的判断 这里通过断言内容,修改if的条件,达到发送警报邮件的功能 beanshell 代码如下:     SampleResult 等效于 prev lo ...

  7. BZOJ 4304 tarjan+topsort+bitset

    我就是想骗一骗访问量 先Tarjan搞出来所有的强连通分量 正向连边 反向连边 topsort一发  搞出来每个点可以到哪些点 和哪些点可以到这个点 对于每条边 与一下  就是答案 //By Siri ...

  8. 【Codeforces576E_CF576E】Painting Edges(可撤销并查集+线段树分治)

    题目 CF576E 分析: 从前天早上肝到明天早上qwq其实颓了一上午MC ,自己瞎yy然后1A,写篇博客庆祝一下. 首先做这题之前推荐一道很相似的题:[BZOJ4025]二分图(可撤销并查集+线段树 ...

  9. 题解报告:hdu 1142 A Walk Through the Forest

    题目链接:acm.hdu.edu.cn/showproblem.php?pid=1142 Problem Description Jimmy experiences a lot of stress a ...

  10. 关于将电脑背景+chrome等网页改成护眼豆沙绿

    常用电脑的人都知道,白色等其他对比度大的颜色对眼伤害大,所以需换成柔和的豆沙绿,可长时间保证眼睛的不疲劳 windows浏览器: >>>>在桌面点右键,依次选属性(proper ...