又完美错过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;
}