4
陆麟瑞
资深天翼
资深天翼
为什么爆零了?
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
struct Tree{
int l,r;
long long sum,size;
}tree[int(1e7+10)];
const int maxn=301000;
int a[maxn],s[maxn],t[maxn],times[maxn];
vector<int>G[maxn];
int tot=0;
inline int build(int l,int r)
{
tot++;
int num=tot;
int mid=(l+r)/2;
if(l<r)
{
tree[num].l=build(l,mid);
tree[num].r=build(mid+1,r);
}
return num;
}
inline int update(int pre,int l,int r,int k,int k2)
{
int num=++tot;
tree[num].l=tree[pre].l;
tree[num].r=tree[pre].r;
tree[num].size=tree[pre].size+k2;
tree[num].sum=tree[pre].sum+k;
int mid=(l+r)/2;
if(l<r)
{
if(max(k,-k)<=mid)
tree[num].l=update(tree[pre].l,l,mid,k,k2);
else
tree[num].r=update(tree[pre].r,mid+1,r,k,k2);
}
return num;
}
long long query(int x,int l,int r,int k)
{
if(l==r) return (long long)l*k;
int mid=(l+r)/2;
if(tree[tree[x].l].size>=k)
return query(tree[x].l,l,mid,k);
else
return tree[tree[x].l].sum+query(tree[x].r,mid+1,r,k-tree[tree[x].l].size);
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
{
scanf("%d%d%d",&s[i],&t[i],&a[i]);
G[s[i]].push_back(a[i]);
G[t[i]+1].push_back(-a[i]);
}
times[0]=build(1,n);
for(int i=1; i<=n; i++)
{
times[i]=times[i-1];
for(int j=0; j<G[i].size(); j++)
{
times[i]=update(times[i],1,n,G[i][j],G[i][j]>0?1:-1);
}
}
long long last=1;
for(int i=1; i<=m; i++)
{
long long x,a,b,c;
scanf("%lld%lld%lld%lld",&x,&a,&b,&c);
long long k=1+(a*last+b)%c;
long long t=0;
if(k>=tree[times[x]].size) t=tree[times[x]].sum;
else t=query(times[x],1,n,k);
printf("%lld\n",(last=t));
}
return 0;
}
陆麟瑞在2019-03-09 12:31:00追加了内容
是洛谷的3168,不是CDT的
1
1
1
0
王子逸
新手天翼
新手天翼
我不太清楚 但以我多次错误的经验来看 初始值 max要赋值与数组[1];
min也赋值与数组[1];
一般都是赋值错误 你找找吧
王子逸在2020-06-01 19:04:00追加了内容
你也可以输出过程 这样就知道哪的环节出问题了!!!
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0