noip2019(普及组) 公交换乘 (不剪枝见祖宗题)

luogu题目传送门

其实就是一道普普通通的模拟题,但是1e5的数据让很多不看数据范围和不加优化的小伙伴们莫名其妙的T了。(包括我

因此,论减枝的重要性!!

于是乎,最重要的一点也就出来了。早就过期的票还有什么要搜的必要呢!!

#include<bits/stdc++.h>
using namespace std;
#define N 666666

struct piao{
    int t,price,vis;
} p[N];

namespace work{
    int ans = 0,cac = 0;
    int last = 1;

    int read(){//数据有点大,打快读保险一点
        char c;
        int x = 0,s = 1;
        c = getchar();
        while(c < '0' || c > '9'){
            if(c == '-')s = -1;
            c = getchar();
        }
        while(c >= '0' && c <= '9')x = x * 10 + c - '0',c = getchar();
        return x * s;
    }

    void main(int n){
        for(int i = 1;i <= n;i++){
            int time,price,a;
            a = read(),price = read(),time = read();
            ans += price;
            if(a == 0){
                p[++cac].price = price;
                p[cac].t = time;
            }
            if(a == 1){
                for(int i = last;i <= cac; i++){
                    if(time - p[i].t > 45)last = i;//这句话最重要,把早就超时的全部剪掉,剪掉这一部分也足够AC了
                    if(!p[i].vis && time - p[i].t <= 45 && p[i].price >= price){
                        ans -= price;
                        p[i].vis = 1;//已经使用过了,不再使用
                        break;
                    }
                }
            }

        }
        printf("%d",ans);
    }
}

int main(){
    int n = work::read();
    work::main(n);
    return 0;
}

(虽然不考普及组,但是水水模拟题还是可以的)

猜你喜欢

转载自www.cnblogs.com/wondering-world/p/12642418.html
今日推荐