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 暑假集训 个人排位赛的主要内容,如果未能解决你的问题,请参考以下文章