又完美错过CF哈哈哈我疯啦。
看到比赛的时候已经开始二十分钟了没敢教,但是把a,b写了写。
C题想到了二分但是太不熟练了,瓦好菜。
D A Game with Traps (二分,贪心)
m个士兵能力值为ai,有k个陷阱,每个陷阱有l,r,d三个属性,l代表陷阱的位置,r是可以使陷阱失效的位置,
士兵能力值小于d的不可以经过l,现在你和n个士兵位于坐标轴0点,boss位于n+1点,每次单独移动和带士兵移动一格(左右)花费的时间为1,
求在时间t内最多能带多少个士兵到boss点。
带过去的肯定是能力值最大的一堆,士兵,
二分带过去的士兵中能力最小值(也就是二分士兵数目),
最终花费的时间是:消除陷阱所用的时间(有来回)+ 把士兵从0位置带到n+1位置所用的时间(恒等于n+1)。
消除陷阱时,贪心肯定走完连续一整段陷阱,然后继续下一段陷阱(否则没有陷阱的地方你也会走两遍,时间花费大)
如图。。绿色为陷阱覆盖范围。黄色从小上到下为每一段走的路。
然后是不知道对不对的代码,,CF炸了交不上去哭
int a[N]; struct IN{int l,r,d;}b[N]; int main() { int n,k,m,t; cin>>n>>k>>m>>t; rpp(i,n) cin>>a[i]; sort(a+1,a+1+n); rpp(i,m) cin>>b[i].l>>b[i].r>>b[i].d; sort(b+1,b+1+m,[](IN aa,IN bb){return aa.l<bb.l; }); int ans=0,l=1,r=n; while(l<=r) { int mid=(l+r)>>1,lst=0,sum=0; int mn=a[n-mid+1];//最小能力值 rpp(i,m) { if(b[i].r<=lst||b[i].d<=mn) continue; if(lst<b[i].l) lst=b[i].l-1; sum+=b[i].r-lst; lst=b[i].r; } ll cnt=2ll*sum+k+1; if(cnt<=t) ans=mid,l=mid+1; else r=mid-1; } cout<<ans<<endl; //stop; return 0; }