您的位置:首页 > 其它

csu1335区间更新,求单点

2017-08-24 15:35 120 查看
题目链接:点击打开链接

#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int maxn=1e5+10;
int n,cunt,k;
int sum[maxn<<2],col[maxn<<2];
void Pushup(int rt)
{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];

}
void Pushdown(int rt,int len)
{
if(col[rt])
{
col[rt<<1]+=col[rt];
col[rt<<1|1]+=col[rt];
sum[rt<<1]+=(len-(len>>1))*col[rt];
sum[rt<<1|1]+=(len>>1)*col[rt];
col[rt]=0;
}
}
void build(int l,int r,int rt)
{
col[rt]=0;
sum[rt]=0;
if(l==r)
return;
int m=(l+r)>>1;
build(lson);
build(rson);
Pushup(rt);
}
void update(int L,int R,int l,int r,int rt)
{
if(L<=l&&R>=r)
{
col[rt]+=1;
sum[rt]+=(r-l+1); //父节点是每次就更新,子节点才延迟更新
return ;
}
Pushdown(rt,r-l+1);
int m=(r+l)>>1;
if(L<=m)update(L,R,lson);
if(R>m)update(L,R,rson);
Pushup(rt);
}
void print(int l,int r,int rt,int n)
{
if(l==r)
{
if(sum[rt]>=k)cunt++;
return;
}
Pushdown(rt,r-l+1);
int m=(l+r)>>1;
print(lson,n);
print(rson,n);

}
int main()
{
int i,j,m,zhang,tui,pre,l,r;
int a[maxn];
int ans=0;
while(~scanf("%d %d %d",&n,&m,&k))
{

memset(sum,0,sizeof(sum));
memset(col,0,sizeof(col));
cunt=0;
for(i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+n+1);
int pre=0;
while(m--)
{
scanf("%d %d",&zhang,&tui);
r=lower_bound(a+1,a+n+1,zhang)-a;
l=lower_bound(a+1,a+n+1,pre)-a;
if(r==n)r--;
else if(a[r]!=zhang)r--;
if(a[l]==pre)l++;
update(l,r,1,n,1);
pre=tui;
}
print(1,n,1,i);
printf("Case %d: %d\n",++ans,cunt);
}
return 0;
}



树状数组
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int maxn=1e5+10;
int c[maxn];
int n;
int Lowbit(int x) // 2^k
{
return x&(-x);
}
void update(int i, int x)//i点增量为x
{
while(i <= n)
{
c[i] += x;
i += Lowbit(i);
}
}
int sum(int x)//区间求和 [1,x]
{
int sum=0;
while(x>0)
{
sum+=c[x];
x-=Lowbit(x);
}
return sum;
}

int Getsum(int x1,int x2) //求任意区间和
{
return sum(x2) - sum(x1-1);
}

int main()
{
int i,j,m,k,zhang,tui,pre,l,r;
int a[maxn];
int ans=0;
while(~scanf("%d %d %d",&n,&m,&k))
{

memset(c,0,sizeof(c));
int cunt=0;
for(i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+n+1);
int pre=0;
while(m--)
{
scanf("%d %d",&zhang,&tui);
r=lower_bound(a+1,a+n+1,zhang)-a;
l=lower_bound(a+1,a+n+1,pre)-a;
if(r==n)r--;
else if(a[r]!=zhang)r--;
if(a[l]==pre)l++;
update(l,1);
update(r+1,-1);
pre=tui;
}
for(i=1;i<=n;i++)if(sum(i)>=k)cunt++;
printf("Case %d: %d\n",++ans,cunt);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: