2022.07.12 暑假集训 个人排位赛

Posted 晁棠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022.07.12 暑假集训 个人排位赛相关的知识,希望对你有一定的参考价值。

2022.07.12 暑假集训 个人排位赛(七)

赛后反省

不至于,真不至于,被两道题卡死之后完全不去想其他题目了。背包那题确实简单,补题过了。当时J题看漏了还能有黑色Queen,H题一直认为自己的想法是正确的,而且根据提交结果反馈一直认为是精度问题。不够努力吧只能说,而且有一题优先队列水题用线段树去码,中间还写错了一点,笑麻了。

Problem C

出处

Codeforces-851B

题解

判断三个点不共线并且长度相等即可。


// Good Good Study, Day Day AC.
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
#define ffor(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define rrep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f
#define PII pair<int,int>
#define int long long

using namespace std;

int n, T = 1, m;


void ready()




int dis(int ax,int ay,int bx,int by)
    return (by-ay)*(by-ay)+(bx-ax)*(bx-ax);


void work()

    int ax,ay,bx,by,cx,cy;
    cin>>ax>>ay>>bx>>by>>cx>>cy;
    if(dis(ax,ay,bx,by)!=dis(bx,by,cx,cy) || (by-ay)*(cx-bx)==(cy-by)*(bx-ax))
        cout<<"No";
    
    else
        cout<<"Yes";
    


signed main()

	IOS;
    ready();
	//cin>>T;
	while (T--) 
		work();
	
	return 0;






Problem D

出处

Codeforces-854C

题解

首先处理损失最大的。每个飞机不能提前飞,那么就是在该时间之后找第一个能够起飞的点。

将能起飞的点作为数组,每个点存k+1,k+2,…,k+n,然后建线段树,每次从一个时间点起飞之后,把这个点变成INF,最后问题就变成了单点修改,区间求最小值的问题。

代码


// Good Good Study, Day Day AC.
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
#define ffor(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define rrep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f
#define PII pair<int,int>
#define int long long

using namespace std;

const int N=3e5+5;
int n, T = 1, m;
int k;

struct Air
    int val,tim,st;
a[N];
bool f[N];
int cn[N];
int t[N];
vector<int> loc;

struct Tree
    int l,r,minn;
tr[N*4];

void pushup(Tree& u,Tree& l,Tree& r)
    u.minn=min(l.minn,r.minn);


void build(int u,int l,int r)
    if(l==r) tr[u]=l,r,t[l];
    else
        tr[u]=l,r;
        int mid=tr[u].l+tr[u].r>>1;
        build(u<<1,l,mid); build(u<<1|1,mid+1,r);
        pushup(tr[u],tr[u<<1],tr[u<<1|1]);
    


void modify(int u,int x)
    if(x==tr[u].l && tr[u].l==tr[u].r) tr[u].minn=INF;
    else
        int mid=tr[u].l+tr[u].r>>1;
        if(x<=mid) modify(u<<1,x);
        if(mid<x) modify(u<<1|1,x);
        pushup(tr[u],tr[u<<1],tr[u<<1|1]);
    


int query(int u,int l,int r)
    if(l<=tr[u].l && tr[u].r<=r) return tr[u].minn;
    int mid=tr[u].l+tr[u].r>>1;
    int lmin=INF,rmin=INF;
    if(l<=mid) lmin=query(u<<1,l,r);
    if(mid<r) rmin=query(u<<1|1,l,r);
    return min(lmin,rmin);



bool cmp(Air i,Air j)
    if(i.val==j.val)
        return i.tim<j.tim;
    
    return i.val>j.val;


void ready()

    cin>>n>>k;
    ffor(i,1,n)
        int c;
        cin>>c;
        a[i]=c,i;
        t[i]=i+k;
        loc.push_back(i+k);
    
    sort(a+1,a+n+1,cmp);
    ffor(i,1,n)
        a[i].st=lower_bound(loc.begin(),loc.end(),a[i].tim)-loc.begin()+1;
        //cout<<a[i].tim<<' '<<a[i].st<<'\\n';
    
    build(1,1,n);
    int ans=0;
    //cout<<query(1,3,5);
    ffor(i,1,n)
        int id=query(1,a[i].st,n);
        modify(1,id-k);
        ans+=(id-a[i].tim)*a[i].val;
        cn[a[i].tim]=id;
       // cout<<a[i].val<<' '<<a[i].tim<<' '<<a[i].st<<' '<<id<<'\\n';
       // cout<<query(1,1,n)<<'\\n';
    
    cout<<ans<<'\\n';
    ffor(i,1,n) cout<<cn[i]<<' ';



void work()





signed main()

	IOS;
    ready();
	//cin>>T;
	while (T--) 
		work();
	
	return 0;






Problem E

出处

Codeforces-864E

题解

背包问题的变形。

首先,先按紧急程度排序,按照d从小到大排。如果相等,让t大的排前面。背包容量为最大的d。

d p [ i ] dp[i] dp[i]表示在第i个时间点能够获得的最大价值。

每次从后往前看,如果一个 d p [ i ] dp[i] dp[i]能够获得价值,并且 i + t < d i+t<d i+t<d,说明当前的物品可以放入背包。数据量比较小,每次保存后更新第i+t个时间获得最大价值的物品顺序即可。

代码



// Good Good Study, Day Day AC.
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
#include <vector>
#include <map>
#include <algorithm> 
#include <unordered_map>
#include <unordered_set>
#define ffor(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define rrep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f
#define PII pair<int,int>
#define int long long

using namespace std;

const int N = 105;

int n, T = 1, maxn;
struct Baby 
	int t, d, p, id;
a[N];
vector<int> ans[3005];
bool f[3005];
int dp[3005];

bool cmp(Baby i, Baby j) 
	if (i.d == j.d) return i.t > j.t;
	return i.d < j.d;


void ready()

	cin >> n;
	ffor(i, 1, n)
	
		cin >> a[i].t >> a[i].d >> a[i].p;
		maxn = max(maxn, a[i].d);
		a[i].id = i;
	
	sort(a + 1, a + n + 1, cmp);
	f[0] = true;
	ffor(i, 1, n) 
		int t = a[i].t, d = a[i].d, p = a[i].p, id = a[i].id;
		rrep(j, maxn, 0) 
			if (f[j] && j + t < d) 
				f[j + t] = true;
				if (dp[j + t] <= dp[j] + p) 
					dp[j + t] = dp[j] + p;
					if(ans[j + t以上是关于2022.07.12 暑假集训 个人排位赛的主要内容,如果未能解决你的问题,请参考以下文章

2022.07.12 暑假集训 个人排位赛

2022.07.15 暑假集训 个人排位赛

2022.07.13 暑假集训 个人排位赛

2022.07.14 暑假集训 个人排位赛

2022.07.14 暑假集训 个人排位赛

2022.07.14 暑假集训 个人排位赛