P5103 [JOI 2016 Final] 断层 题解
提高 T1 难度 远古 JOI 题。这东西能评黑???
- 题目链接
干什么
有两个长度为
怎么做
发现
代码:
#include<bits/stdc++.h>
#define ll long long
#define mxn 200003
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define rept(i,a,b) for(int i=a;i<b;++i)
#define drep(i,a,b) for(int i=a;i>=b;--i)
using namespace std;
struct node{
ll x,d,l;
}a[mxn];
int n,q;
struct tree{
ll c[mxn];
void add(int x,int y){for(;x<=n;x+=x&-x)c[x]+=y;}
ll ask(int x){
ll s=0;
for(;x;x-=x&-x)s+=c[x];
return s;
}
}c1,c2;
signed main(){
scanf("%d%d",&n,&q);
rep(i,1,q)scanf("%lld%lld%lld",&a[i].x,&a[i].d,&a[i].l),a[i].l<<=1;
rep(i,1,n)c1.add(i,1),c2.add(i,1);
drep(j,q,1){
if(a[j].d==1){
int l=1,r=n;
while(l<r){
int mid=(l+r+1)>>1;
if(c1.ask(mid)<=a[j].x)l=mid;
else r=mid-1;
}
if(c1.ask(l)<=a[j].x)c2.add(1,-a[j].l),c2.add(l+1,a[j].l);
}else{
int l=1,r=n;
while(l<r){
int mid=(l+r)>>1;
if(c2.ask(mid)>a[j].x)r=mid;
else l=mid+1;
}
if(c2.ask(l)>a[j].x)c1.add(l,a[j].l);
}
}
rep(i,1,n)printf("%lld\n",(c1.ask(i)-c2.ask(i))>>1);
return 0;
}