您的位置:首页 > 其它

16初出茅庐F题

2016-01-22 02:30 260 查看
F 奇怪的光照植物

Time Limit:500MS Memory Limit:65535K

题型: 编程题 语言: 无限制

描述

一种光照植物,用光照射一天就长1厘米。现在将这种植物种在一条直线型的

培养容器中,坐标从0到n-1,每一个整点位置种植一棵这种植物,即共n棵。

开始的时候所有植物的高度都为0。实验过程中,进行了m组,每组选择对范围为

[L,R]的植物进行光照a天,每组参数L、R、a由输入数据给出。

当所有实验结束后,我们想知道所有光照了奇数天的植物总的高度是多少(单位:厘米)。

输入格式

输入第一行包含一个整数T(T<=10),表示有T组测试数据。

对每一组测试数据,第一行是两个数n(1<=n<=10^6)和m(0<=m<=10^5),用空格分隔。

接下来的m行中每一行包含三个数L,R和a(0<=L<=R<=n-1,0<=a<=100),用空格分隔,表示一个操作。

输出格式

对于每组测试数据输出一行,所有实验操作后所有光照了奇数天的植物总的高度

输入样例

1

10 3

3 5 1

4 9 1

8 9 0

输出样例

5

Hint

一维区间覆盖问题,快去百度吧

Provider

admin

= =一开始查了查树状结构就直接用了,后面有简单的,刚好卡时间过了

树状结构:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int n,m,c[1000003];
int lowbit(int x)
{
return x&(-x);
}
int sum(int x)
{
int sum=0;
while(x>0)
{
sum+=c[x];
x-=lowbit(x);
}
return sum;
}
void inster(int x,int i)
{
while(x<=n)
{
c[x]+=i;
x+=lowbit(x);
}
}
int main()
{
int a,b,i,T,d;
scanf("%d",&T);
while(T--)
{
int count=0;
int ttt;
memset(c,0,sizeof(c));
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&d);
inster(b+2,-1*d);
inster(a+1,1*d);
}
for(i=1;i<=n;i++)
if((ttt=sum(i))%2==1)
count+=ttt;
printf("%d\n",count);
}
return 0;
}


还有一种,思路看代码:

#include<stdio.h>
#include<string.h>
int d[1000005];
int main()
{
int l,r,a;
int T,n,m;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
memset(d,0,sizeof(d));
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&l,&r,&a);
d[l]+=a;
d[r+1]-=a;
}
int ans=0,count=0;
for(int i=0;i<n;i++)
{
count+=d[i];
if(count%2==1)
ans+=count;
}
printf("%d\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  思维