补题测验

这场测验其实我感觉出的几个题都还是我印象比较深的几个题。但是感觉作的效果还不是很好,D题确实有些细节没注意到,卡了很长时间,E题原来是我理解的有错,看来以后补题还是要踏踏实实的再做一遍,不能太自大,只有自己能很轻松的完整写出来了,才能算是掌握了,不这样做训练效果其实也不好。

 

E .cf1260 D

这个写法我还是不理解先记下来

#include
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;ix){
			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;
	else
		return 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>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<

D2. Too Many Segments

#include
using namespace std;
struct node
{
    int s;
    int e;
    int id;
}a[200005];
int cmp(node p,node q)
{
    return p.s ans;
set > st;
int main()
{
    int n,k;
    scanf("%d%d",&n,&k);
    int maxn,minn;
    pairtmp;
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&a[i].s,&a[i].e);
        maxn=max(maxn,a[i].e);
        minn=min(minn,a[i].s);
        a[i].id=i;
    }
    sort(a+1,a+1+n,cmp);
    int pos=1;
    for(int i=minn;i<=maxn;i++)
    {
        while(pos<=n&&a[pos].s<=i)
        {
            st.insert(make_pair(a[pos].e,a[pos].id));
            pos++;
        }
        while(st.size()&& st.begin()->firstk)
        {
            tmp=*(--st.end());
            ans.push_back(tmp.second);
            st.erase(tmp);
        }
    }
    sort(ans.begin(),ans.end());
    printf("%d\n",ans.size());
    for(auto v:ans)
    {
        printf("%d ",v);
    }
    printf("\n");
}

Codeforces 1249C2 Good Numbers (hard version)

1.贪心算法~;
2.对于任意一个正整数n,它有两种可能:case1:3a ≤ n ≤ (3a+1-1)/2 和 case2:(3a+1-1)/2 < n < 3a+1(其中a为对应常数);
3. (3a+1-1)/2是如何求的呢,是30+31+…+3a,如果处在case2中的数,那大于等于它的good number肯定就是3a+1啦;
4. 处在case1中的数,那大于等于它的good number肯定有3a这个因子,我们只需将a保存下来,然后去递归求大于等于n-3a的good number就好啦;
5. 为了保证运行效率,我们可以提前将30 ~ 339的结果保存起来,也将(31-1)/2 ~ (339-1)/2的结果保存起来;

#include
using namespace std;
typedef long long ll;
ll power_3[40];
ll cil[40];
vector v;
void dfs(ll n){
	if(n<=0) return;
	int pos;
	for(pos=0;pos<=39&&n>=power_3[pos+1];pos++);
	if(n>cil[pos]) v.push_back(pos+1);
	else{
		v.push_back(pos);
		dfs(n-power_3[pos]);
	}
}
int main(){
	int q;
	cin>>q;
	ll power=1;
	for(int i=0;i<=39;i++,power*=3) power_3[i]=power;
	for(int i=0;i<=38;i++) cil[i]=(power_3[i+1]-1)>>1;
	for(int i=0;i>n;
		v.clear();
		dfs(n);
		ll ans=0;
		for(auto e:v) ans+=power_3[e];
		cout<

cf1251 E1

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
const int maxN = 2e5 + 7;
int N;
vector vt[maxn];
using namespace std;
int main()
{
    int T,m,p; 
	cin>>T;
    while(T--)
    {
        scanf("%d", &N);
        for(int i=0; i<=N; i++) vt[i].clear();
        for(int i=1; i<=N; i++) { scanf("%d%d", &m, &p); vt[m].push_back(p); }
        priority_queue, greater> Q;
        ll ans = 0;
        for(int i=N; i>=0; i--)
        {
            int len = (int)vt[i].size();
            for(int j=0; j N - i) { ans += Q.top(); Q.pop(); }
        }
        printf("%lld\n", ans);
    }
    return 0;
}

 

你可能感兴趣的:(补题测验)