【题目分析】

主席树,维护区间大小以及权值之和。

但是细节确实要琢磨很久,WA了几次。

【代码】

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>

#include <set>
#include <map>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue>

using namespace std;

#define maxn 300005
#define mlog 40
#define inf (0x3f3f3f3f)
#define ll long long

ll read()
{
    ll x=0,f=1; char ch=getchar();
    while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
    while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}

ll llread()
{
    ll x=0,f=1; char ch=getchar();
    while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
    while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}

ll rt[maxn],ls[maxn*mlog],rs[maxn*mlog],siz[maxn*mlog],tot=0,n,m;
struct eve{ll p,opt;}a[maxn];
vector <eve> v[maxn];
ll sum[maxn*mlog];
ll b[maxn],top=0,cnt=0;
ll pre=1;

/*
void ins(ll o1,ll &o2,ll l,ll r,ll x,ll f)
{
    o2=++tot;
    siz[o2]=siz[o1]+f;
    sum[o2]=sum[o2]+(ll)b[x]*f;
    if (l==r) return ;
    ll mid=(l+r)/2;
    if (x<=mid)  ins(ls[o1],ls[o2],1,mid,x,f),rs[o2]=rs[o1];
    else ins(rs[o1],rs[o2],mid+1,r,x,f),ls[o2]=ls[o1];
//  sum[o2]=sum[ls[o1]]+sum[ls[o2]];
}
*/

ll ins (ll o1,ll l,ll r,ll x,ll f)
{
    ll now=++tot;
    siz[now]=siz[o1]+f;
    sum[now]=sum[o1]+b[x]*f;
    if (l==r) return now;
    ll mid=(l+r)/2;
    if (x<=mid) ls[now]=ins(ls[o1],l,mid,x,f),rs[now]=rs[o1];
    else rs[now]=ins(rs[o1],mid+1,r,x,f),ls[now]=ls[o1];
    return now;
}

ll query(ll o,ll l,ll r,ll x)
{
    if (x>=siz[o]) return sum[o];
    if (l==r) return min(x,siz[o])*b[l];
    ll tmp=siz[ls[o]];
    if (tmp>=x) return query(ls[o],l,(l+r)/2,x);
    else return sum[ls[o]]+query(rs[o],(l+r)/2+1,r,x-tmp);
}

int main()
{
    n=read();m=read();
    for (ll i=1;i<=n;++i)
    {
        ll x=read(),y=read(),z=read();
        if (x<=m)
        {
            a[++cnt].p=z;
            a[cnt].opt=1;
            v[x].push_back(a[cnt]);
        }
        if (y+1<=m)
        {
            a[++cnt].p=z;
            a[cnt].opt=-1;
            v[y+1].push_back(a[cnt]);
        }
        b[++top]=z;
    }
    sort(b+1,b+top+1);
    top=unique(b+1,b+top+1)-b-1;
    for (ll i=1;i<=m;++i)
    {
        rt[i]=rt[i-1];
        for (ll j=0;j<v[i].size();++j)
            rt[i]=ins(rt[i],1,top,lower_bound(b+1,b+top+1,v[i][j].p)-b,v[i][j].opt);
    }
    for (ll i=1;i<=m;++i)
    {
        ll k,x,a,b,c;
        x=llread();a=llread();b=llread();c=llread();
        k=1+(a*pre+b)%c;
//      if (i==m) k++;
        printf("%lld\n",pre=query(rt[x],1,top,k));
    }
}

  

最新文章

  1. [deviceone开发]-do_SegmentView和do_SlideView联动的示例
  2. 原生js实现Ajax
  3. POJ3083Catch That Cow[BFS]
  4. 【Visual Lisp】Visual Lisp属性与方法
  5. Yii1 控制前端载入文件
  6. android中解析文件的三种方式
  7. DotNetCore跨平台~linux上还原自主nuget包需要注意的问题
  8. mysql数据库的三范式的设计与理解
  9. [USACO 13DEC]Vacation Planning(gold)
  10. 微信跳转,手机WAP浏览器一键超级跳转微信指定页面
  11. sql sever基本命令
  12. Java加密算法
  13. Eclipse中如何打开Map/Reduce Locations窗口
  14. SolrJ的入门
  15. .NET 线程池编程技术
  16. windows远程以及文件共享方法总结
  17. 使用STM32CubeMX生成USB_HOST_HID工程
  18. Dlib机器学习指南图翻译
  19. Java基础之理解封装,继承,多态三大特性
  20. double类型四舍五入保留两位小数

热门文章

  1. HTML简历表格
  2. Mac 安装 eclipse
  3. Eclipse CDT launch failed.Binary not found in Linux/Ubuntu
  4. NYOJ题目100 1的个数
  5. Java中常见数据结构:list与map -底层如何实现
  6. 重温WCF之WCF中可靠性会话(十四)
  7. java 泛型 -- 泛型类,泛型接口,泛型方法
  8. html5 Canvas绘制图形入门详解
  9. WPF QuickStart系列之样式和模板(Style and Template)
  10. HorizontalScrollView