当前位置: 代码迷 >> 综合 >> 补题测验
  详细解决方案

补题测验

热度:90   发布时间:2024-01-28 04:10:58.0

这场测验其实我感觉出的几个题都还是我印象比较深的几个题。但是感觉作的效果还不是很好,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;
}

 

  相关解决方案