【FOJ】1608 Huge Mission

 1 #include<cstdio>

 2 #include<cstring>

 3 #include<algorithm>

 4 using namespace std;

 5 #define MAXN 50010

 6 struct time

 7 {

 8     int s,t,ef;

 9     friend bool operator<(time a,time b)

10     {

11         return a.ef>b.ef;

12     }

13 };

14 struct node

15 {

16     int sum,lazy;

17 };

18 time p[MAXN*10];

19 node tree[MAXN<<2];

20 void Build(int L,int R,int rt)

21 {

22     tree[rt].lazy=0;

23     tree[rt].sum=R-L+1;

24     if(L!=R)

25     {

26         int mid=(L+R)>>1;

27         Build(L,mid,rt<<1);

28         Build(mid+1,R,rt<<1|1);

29     }

30 }

31 inline void PushDown(int rt)

32 {

33     if(tree[rt].lazy)

34     {

35         tree[rt].lazy=0;

36         tree[rt<<1].lazy=tree[rt<<1|1].lazy=1;

37         tree[rt<<1].sum=tree[rt<<1|1].sum=0;

38     }

39 }

40 inline void PushUp(int rt)

41 {

42     tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum;

43 }

44 int Query(int x,int y,int L,int R,int rt)

45 {

46     if(x<=L&&R<=y)

47         return tree[rt].sum;

48     int ans=0,mid=(L+R)>>1;

49     PushDown(rt);

50     if(x<=mid)

51         ans+=Query(x,y,L,mid,rt<<1);

52     if(y>mid)

53         ans+=Query(x,y,mid+1,R,rt<<1|1);

54     return ans;

55 }

56 void Update(int x,int y,int L,int R,int rt)

57 {

58     if(x<=L&&R<=y)

59     {

60         tree[rt].lazy=1;

61         tree[rt].sum=0;

62     }

63     else

64     {

65         int mid=(L+R)>>1;

66         PushDown(rt);

67         if(x<=mid)

68             Update(x,y,L,mid,rt<<1);

69         if(y>mid)

70             Update(x,y,mid+1,R,rt<<1|1);

71         PushUp(rt);

72     }

73 }

74 int main()

75 {

76     int i,n,m,ans;

77     while(~scanf("%d%d",&n,&m))

78     {

79         Build(0,n-1,1);

80         for(i=0;i<m;i++)

81             scanf("%d%d%d",&p[i].s,&p[i].t,&p[i].ef);

82         sort(p,p+m);

83         for(i=ans=0;i<m;i++)

84         {

85             ans+=p[i].ef*Query(p[i].s,p[i].t-1,0,n-1,1);

86             Update(p[i].s,p[i].t-1,0,n-1,1);

87         }

88         printf("%d\n",ans);

89     }

90     return 0;

91 }

你可能感兴趣的:(SSI)