链接:Dashboard - Codeforces Round 914 (Div. 2) - Codeforces
A. Forked!
题意:对于给出的俩个坐标点,在平面内有多少个点的同时与这俩个点,在符合纵移动a、横移动b或者横移动a、纵移动b可以到达。
思路:暴力枚举其中一个点的4个方向,共8种可能,再对另外一个点做判断
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
//#define endl '\n'
const int N = 2e5 + 10;
const int mod = 1e9 + 7;
int dx[4]={1,1,-1,-1};
int dy[4]={1,-1,1,-1};
int a,b;
int x1,x2,y1,y2;
bool check(int x,int y){
if((abs(x-x2)==a&&abs(y-y2)==b)||abs(x-x2)==b&&abs(y-y2)==a){
return true;
}
return false;
}
void solve()
{
cin>>a>>b;
cin>>x1>>y1;
cin>>x2>>y2;
int ans=0;
set<pair<int,int>> q;
for(int i=0;i<4;i++){
if(check(x1+dx[i]*a,y1+dy[i]*b)){
q.insert({x1+dx[i]*a,y1+dy[i]*b});
//cout<<x1+dx[i]*a<<" "<<y1+dy[i]*b<<endl;
//ans++;
}
if(check(x1+dx[i]*b,y1+dy[i]*a)){
q.insert({x1+dx[i]*b,y1+dy[i]*a});
//cout<<x1+dx[i]*b<<" "<<y1+dy[i]*a<<endl;
//ans++;
}
}
cout<<q.size()<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int t;
// cin>>t;
cin>>t;
while (t--)
{
solve();
}
return 0;
}
B. Collecting Game
题意:一个包含n个数字的序列,从一个点出发,初始分数就是这个点的值,当分数大于另外某一个点的时候,可以移除这个点同时使得分数增加这个点的值,问从每一个点出来的时候各个最终能移除多少个数字。
思路:对点排序后从后往前判断,先求一个排序后的前缀和,判断该点的前缀和是否大于上一个点的值,是那么就可以等于上一个点所能移除的个数,不是就是当前点的位置。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
//#define endl '\n'
const int N = 2e5 + 10;
const int mod = 1e9 + 7;
int n;
ll ans[N],pre[N];
bool cmp(pair<int,int> a,pair<int,int> b){
return a.first>b.first;
}
void solve()
{
cin>>n;
vector<pair<ll,ll> > a;
for(int i=0;i<n;i++){
ll x;cin>>x;
a.emplace_back(make_pair(x,i));
}
sort(a.begin(),a.end());
// for(auto it:a){
// cout<<it.first<<" "<<it.second<<endl;
// }
pre[0]=a[0].first;
for(int i=1;i<n;i++){
pre[i]=pre[i-1]+a[i].first;
}
ans[a[n-1].second]=n-1;
//cout<<a[n-1].first<<" "<<a[n-1].second<<endl;
for(int i=n-2;i>=0;i--){
if(pre[i]>=a[i+1].first){
ans[a[i].second]=ans[a[i+1].second];
}
else{
ans[a[i].second]=i;
}
//cout<<a[i].first<<" "<<a[i].second<<" "<<ans[a[i].second]<<endl;
}
for(int i=0;i<n;i++){
cout<<ans[i]<<" ";
}
cout<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int t;
// cin>>t;
cin>>t;
while (t--)
{
solve();
}
return 0;
}
C. Array Game
题意:对于一个序列的一个操作:可以选择俩个不同的下标,使得俩个下标所在位置的值相减取绝对值然后放到序列的最后。问经过k次操作后,序列中最小的值是多少?
思路:当k>=3的时候,任选俩个值减俩次然后使这个俩个结果相减,答案是0;k=1的时候,只能是排序后相邻数字的差和序列的最小值比较;k=2的时候,就是多次k=1的时候。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl '\n'
const int N = 2e4 + 10;
const int mod = 1e9 + 7;
int n,k;
ll a[N];
void solve()
{
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
if(k>=3){
cout<<0<<endl;
return;
}
sort(a+1,a+n+1);
ll minn=a[1];
for(int i=2;i<=n;i++){
minn=min(minn,a[i]-a[i-1]);
}
if(k==1){
cout<<minn<<endl;
return;
}
for(int i=1;i<n;i++){
for(int j=i+1;j<=n;j++){
ll de=a[j]-a[i];
int p=lower_bound(a+1,a+n+1,de)-(a);
if(p<n){
minn=min(minn,a[p]-de);
}
if(p>0){
minn=min(minn,de-a[p-1]);
}
}
}
cout<<minn<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int t;
// cin>>t;
cin>>t;
while (t--)
{
solve();
}
return 0;
}
D1. Set To Max (Easy Version)
题意:操作:可以选择一个区间,将区间所有值修改为该区间中最大的那个数字,问是否能将序列a改为序列b。
思路:当ai>bi的时候,此时可以直接输出no,因为没法达到这个效果;其他情况的时候,应该是找离他最近的一个大于他的bi的数字,前后都找一次试试看,Easy版本的n可以使用O(n^2)的算法暴力查找。
D2. Set To Max (Hard Version)
和d1只有数据范围和时间的差别。
采用st表来标定区间,利用倍增的思想使得区间查找最大值可以缩短到O(1),代码中对于区间长度的lg可以提前预处理。
#include <bits/stdc++.h>
#define ll long long
#define endl '\n'
using namespace std;
const ll mod=998244353;
const int N=2e5+7;
const int N2=1000;
int a[N],b[N];
int st[20][N];
int ask(int l,int r){
int p=__lg(r-l+1);
return max(st[p][l],st[p][r-(1<<p)+1]);
}
void solve(){
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
bool flag=false;
for(int i=1;i<=n;i++){
cin>>b[i];
if(b[i]<a[i]) flag=true;
}
if(flag){
cout<<"NO"<<endl;
return;
}
for(int i=1;i<=n;i++){
st[0][i]=a[i];
}
for(int i=1;(1<<i)<=n;i++){
for(int j=1;j+(1<<i)-1<=n;j++){
st[i][j]=max(st[i-1][j],st[i-1][j+(1<<(i-1))]);
}
}
int now=1;
for(int i=1;i<=n;i++){
while(now<=n&&(a[now]<b[i]||(now<i&&ask(now,i)>b[i]))) now++;
if(now>n||(now>=i&&ask(i,now)>b[i])){
cout<<"NO"<<endl;
return;
}
}
cout<<"YES"<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}