这场测验其实我感觉出的几个题都还是我印象比较深的几个题。但是感觉作的效果还不是很好,D题确实有些细节没注意到,卡了很长时间,E题原来是我理解的有错,看来以后补题还是要踏踏实实的再做一遍,不能太自大,只有自己能很轻松的完整写出来了,才能算是掌握了,不这样做训练效果其实也不好。
E .cf1260 D
这个写法我还是不理解先记下来
#include<bits/stdc++.h>
const int maxn=0x3f3f3f3f;
const int minn=0xc0c0c0c0;
const int inf=99999999;
using namespace std;
const int N=2e5+5;int cmp(int a,int b){return a>b;
}
int m,n,k,t;
int a[N],vis[N],s[N];struct node{int u,v,p;
}b[N];int check(int x){int cnt=0;for(int i=0;i<k;i++){if(b[i].p>x){vis[b[i].u]++;vis[b[i].v+1]--;}}for(int i=1;i<=n+1;i++){vis[i]+=vis[i-1]; }for(int i=0;i<=n+1;i++){if(vis[i]){cnt++;vis[i]=0;}}if(cnt*2+n+1<=t)return 1;elsereturn 0;
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>m>>n>>k>>t;for(int i=1;i<=m;i++)cin>>a[i];sort(a+1,a+1+m,cmp);for(int i=0;i<k;i++){cin>>b[i].u>>b[i].v>>b[i].p;}int l=1,r=m;while(r>=l){int mid=(l+r)/2;if(check(a[mid])){l=mid+1;}else{r=mid-1;}}for(int i=r;i>=l-1;i--){if(check(a[i])){cout<<i<<endl;break;}if(i==0){cout<<0<<endl;break;}}return 0;
}