其实就是一道普普通通的模拟题,但是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; }
(虽然不考普及组,但是水水模拟题还是可以的)