PocketMoney

PocketMoney
( Money.pas/cpp/c)
Description
学校为了表彰tsoi的优异成绩, m个领导每人都决定给tsoi的一些人发一些小红包。
于是n个Tsoier排成一排,等待着收钱。不过由于各种原因,每个人最多只可以收一个红
包,所以原因你懂的,每个人都会选择最大的那个红包收下- -。
Input
第一行两个整数n,m
接下来m行,每行三个整数l r c。即这个领导计划给第l至r个Tsoier价值为c的红包
Output
由于数据较大, 为了减少输出所用的不必要的时间, 请采取以下方法输出: 假如a[i]为第i
个Tsoier最终收到的钱
ans := (ans * 1200007 + a[i]) mod 999911659;( 1in)
SampleInput
3 2
1 2 1
2 2 2
SampleOutput
146411103
Hint
30% n,m<=5000
50% n,m <= 10000
80% n,m <= 500000tsoi Day1 2011.10.6
100% n <= 1000000, m <= 2000000
本题时限为4s

我打的暴力,60分

正解贪心,然后跳就过掉了。

先按value由大到小排序,贪心,因为只收最大的。
用一个数组记录当前有值的右端点,这个右端点意味着从当前的i到右端点已经放了红包,所以直接跳过这一段即可,i=a[i].r。

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<cstring>
#define mod 999911659
#define base 1200007
#define inf 2147483647
#define For(i,a,b) for(register long long i=a;i<=b;i++)
#define p(a) putchar(a)
#define g() getchar()
//by war
//2017.10.15
using namespace std;
long long ans;
long long n,m;
struct packet
{
    long long l,r,v;
    bool operator<(const packet&aa)const
    {
        return v>aa.v;
    }
}e[2000010];

struct money
{
    long long r,v;
}a[1000010];

void in(long long &x)
{
    long long y=1;
    char c=g();x=0;
    while(c<'0'||c>'9')
    {
    if(c=='-')
    y=-1;
    c=g();
    }
    while(c<='9'&&c>='0')x=x*10+c-'0',c=g();
    x*=y;
}
void o(long long x)
{
    if(x<0)
    {
        p('-');
        x=-x;
    }
    if(x>9)o(x/10);
    p(x%10+'0');
}
int main()
{
    freopen("money.in","r",stdin);
    freopen("money.out","w",stdout);    
    in(n),in(m);
    For(i,1,m)
    in(e[i].l),in(e[i].r),in(e[i].v);
    sort(e+1,e+m+1);
    For(j,1,m)
    {
    for(long long i=e[j].l;i<=e[j].r;i++)
    {
        if(a[i].v!=0)
        {
            i=a[i].r;
        }
        else
        {
        a[i].v=e[j].v;
        a[i].r=e[j].r;
        }
    }
    }
    For(i,1,n)
    ans=(ans*base+a[i].v)%mod;
    o(ans);
     return 0;
}

 

posted @ 2017-10-15 21:34  WeiAR  阅读(419)  评论(0编辑  收藏  举报