Codeforces Round #773 (Div. 2)
A - Hard Way
- 签到题,当某两个点连线与x轴平行,且第三个点在这条连线之下,才做考虑
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
void solve()
{
int a,b,c,d,e,f;
cin>>a>>b>>c>>d>>e>>f;
int ans=0;
if(b==d && f<b) ans=abs(a-c);
if(b==f && d<b) ans=abs(a-e);
if(d==f && b<d) ans=abs(c-e);
cout<<ans<<endl;
}
signed main()
{
int T=1;
cin>>T;
while(T--) solve();
}
B - Power Walking
分析:
-
思维
-
每次将大集合里一元素丢出去产生一个新集合,要使所有集合中不同数的个数之和(每一集合单独考虑)最少
所以,应该先将大集合中出现的某一相同的数全部丢到零一集合,当原大集合不同数都单独为一集合时,再划分,则 a n s + + ans++ ans++
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
int a[N];
map <int,int> mp;
void solve()
{
int n;
cin>>n;
mp.clear();
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
mp[a[i]]++;
}
for(int i=1;i<=mp.size();i++) cout<<mp.size()<<' ';
for(int i=mp.size()+1;i<=n;i++) cout<<i<<' ';
cout<<"\n";
}
signed main()
{
int T=1;
cin>>T;
while(T--) solve();
}
C - Great Sequence
分析:
- 类似消消乐的一道题
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
int a[N];
map <int,int> mp;
void solve()
{
int n,x;
cin>>n>>x;
mp.clear();
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
mp[a[i]]++;
}
sort(a+1,a+1+n);
int ans=0;
for(int i=1;i<=n;i++)
{
if(!mp[a[i]]) continue;
if(mp[a[i]*x])
{
mp[a[i]]--;
mp[a[i]*x]--;
}
else
{
ans++;
mp[a[i]]--;
}
}
cout<<ans<<"\n";
}
signed main()
{
int T=1;
cin>>T;
while(T--) solve();
}
D - Repetitions Decoding
分析:
-
构造+双指针+暴力
-
首先,每个相等的数要出现偶数次才能构造出(最后要对称)
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
int a[N];
map <int,int> mp;
int len,tot;
int sz[N];
pair<int,int> ans[N];
void insert(int x,int y)
{
for(int i=len+2;i>=x+2;i--) a[i]=a[i-2];
a[x]=a[x+1]=y;
len+=2;
ans[++tot]={x-1,y};
}
void solve()
{
int n;
cin>>n;
len=n; tot=0; mp.clear();
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
mp[a[i]]++;
}
for(auto v : mp) if(v.second&1) { cout<<"-1\n"; return ; }
int cnt=0, l=1, r=2;
// 双指针 l指向当前的未匹配的,r去找第一个与l匹配的
while(l<=len)
{
while(a[l]!=a[r]) r++;
int rn=r;
while(l<rn) // 暴力insert 构造
{
if(r>len || a[l]!=a[r])
{
insert(r,a[l]);
}
l++; r++;
}
sz[++cnt]=(r-l)*2;
l=r;
r++;
}
cout<<tot<<endl;
for(int i=1;i<=tot;i++) cout<<ans[i].first<<' '<<ans[i].second<<"\n";
cout<<cnt<<"\n";
for(int i=1;i<=cnt;i++) cout<<sz[i]<<" ";
cout<<"\n";
}
signed main()
{
int T=1;
cin>>T;
while(T--) solve();
}