D. Coprime
题目大意:
寻找两个互素元素,要求找出这样的一对互素元素数组下标和最大,如果没有这样的互素元素输出-1。
题目做法:
总体来说就是拿那个比较小的1000来做文章
AC代码:
#include<bits/stdc++.h>
#define pb(element) push_back(element)
#define fast ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
//#define int long long
#define ll long long
//Cara's templet version 1.19
//2024/2/20 20:32 UTC+8
//Blood Toil Tears Sweat
using namespace std;
const int maxn=3e5+10;
vector<int> p[1001];
void init()
{
for(int i=1;i<=1000;i++)
{
for(int j=i;j<=1000;j++)
{
if(__gcd(i,j)==1)
{
p[i].pb(j);
p[j].pb(i);
}
}
}
}
void solve()
{
int ps[1001];
int n,res=-1,t;
cin>>n;
for(int i=1;i<=1000;i++) ps[i]=0;
for(int i=1;i<=n;i++)
{
cin>>t;
ps[t]=i;
}
for(int i=1;i<=1000;i++)
{
if(ps[i]==0) continue;
for(int j=0;j<p[i].size();j++)
{
if(ps[p[i][j]]!=0)
{
res=max(res,ps[i]+ps[p[i][j]]);
}
}
}
cout<<res<<'\n';
}
signed main()
{
init();
fast int casen=1;
cin>>casen;
while(casen--) solve();
}
E. Scuza
题目大意:
题目做法:
前缀和+二分
AC代码:
#include<bits/stdc++.h>
#define pb(element) push_back(element)
#define fast ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
#define ll long long
//Cara's templet version 1.19
//2024/2/20 20:32 UTC+8
//Blood Toil Tears Sweat
using namespace std;
const int maxn=3e5+10;
void solve()
{
int n,k,t;
cin>>n>>k;
int ar[n+10];
int prefix[n+10];
prefix[0]=ar[0]=0;
for(int i=1;i<=n;i++)
{
cin>>ar[i];
prefix[i]=prefix[i-1]+ar[i];
ar[i]=max(ar[i-1],ar[i]);
}
// for(int i=1;i<=n;i++) cout<<prefix[i]<<' ';
// cout<<'\n';
for(int i=0;i<k;i++)
{
cin>>t;
// int ps=upper_bound(ar+1,ar+n+1,t)-ar-1;
// cout<<ps<<" ";
cout<<prefix[upper_bound(ar+1,ar+n+1,t)-ar-1]<<' ';
}
cout<<'\n';
}
signed main()
{
fast int casen=1;
cin>>casen;
while(casen--) solve();
}
D. Friends and the Restaurant
题目大意:
有n个朋友要去恰饭。
每个朋友都有两个属性xi(他要在餐厅里花的钱)yi(他身上有的钱),每天然后他们以至少两人为一组去吃饭。每组的总花费要小于他们身上总共有的钱,问最多能分多少组,也即最大多少天。
题目做法:
引入一个新的属性,yi-xi,也即每个人的贡献度,根据这个从小到大排个序,这个贡献度为正的无疑都可以两两配自己玩自己的,现在就是要把这个贡献度为负的尽可能地往组里加,且还是只能用一个正的去抵消,如果两个及以上,对结果不会有正向影响。
AC代码:
#include<bits/stdc++.h>
#define pb(element) push_back(element)
#define fast ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
#define ll long long
//Cara's templet version 1.19
//2024/2/20 20:32 UTC+8
//Blood Toil Tears Sweat
using namespace std;
const int maxn=3e5+10;
struct node
{
int x,y;
};
bool cmp(int x,int y)
{
return x>y;
}
void solve()
{
int n,res=0;
cin>>n;
node ar[n];
vector<int> a1,a2;
for(int i=0;i<n;i++)
{
cin>>ar[i].x;
}
for(int i=0;i<n;i++)
{
cin>>ar[i].y;
int t=ar[i].y-ar[i].x;
if(t>=0) a1.pb(t);
else a2.pb(t);
}
sort(a1.begin(),a1.end());
sort(a2.begin(),a2.end(),cmp);
// for(auto it:a1)
// {
// cout<<it<<' ';
// }
// cout<<'\n';
// for(auto it:a2)
// {
// cout<<it<<' ';
// }
// cout<<'\n';
int inips1=0,inips2=0,allpos=a1.size();
while(inips1<a1.size()&&inips2<a2.size())
{
if(a1[inips1]>=abs(a2[inips2])) res++,inips1++,inips2++,allpos--;
else
{
inips1++;
}
}
cout<<allpos/2+res<<'\n';
}
signed main()
{
fast int casen=1;
cin>>casen;
while(casen--) solve();
}
D. Merge Equals
原题链接:Problem - 962D - Codeforces
题目大意:
给你一个数组
题目做法:
离散化+实施
RE了两发,尚未知原因,回头得查一下
AC代码:
#include<bits/stdc++.h>
#define pb(element) push_back(element)
#define fast ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
#define ll long long
//Cara's templet version 1.19
//2024/2/20 20:32 UTC+8
//Blood Toil Tears Sweat
using namespace std;
const int maxn=1e5+5e4+10;
set<int> ar[maxn];
map<int,int> mp;
int print[maxn];
set<int> num;
int cou=1;
void solve()
{
int n,t,ci=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>t;
if(mp[t]==0)
{
mp[t]=cou++;
num.insert(t);
}
//cout<<i<<" "<<mp[t]<<'\n';
ar[mp[t]].insert(i);
}
// for(auto it:mp)
// {
// cout<<it.first<<" "<<it.second<<'\n';
// }
// for(auto it1:num)
// {
// cout<<it1<<':';
// for(auto it2:ar[mp[it1]])
// {
// cout<<it2<<' ';
// }
// cout<<'\n';
// }
// cout<<'\n';
// bool f=1;
// while(f)
// {
// f=0;
for(auto it1:num)
{
//cout<<"??"<<it1<<'\n';
int tcou=mp[it1];
// if(ar[tcou].size()>=2) f=1;
while(ar[tcou].size()>1)
{
int fps=*ar[tcou].begin(),sps=*(++ar[tcou].begin());
ar[tcou].erase(ar[tcou].begin());
ar[tcou].erase(ar[tcou].begin());
int tas=it1*2;
if(mp[tas]==0)
{
mp[tas]=cou++;
num.insert(tas);
}
ar[mp[tas]].insert(sps);
//break;
}
// if(ar[tcou].size()==0) num.erase(it1);
// ci++;
// if(ci==10) break;
//cout<<'\n';
//break;
}
// for(auto it1:num)
// {
// cout<<it1<<':';
// for(auto it2:ar[mp[it1]])
// {
// cout<<it2<<' ';
// }
// cout<<'\n';
// }
// }
for(auto it1:num)
{
//cout<<it1<<':';
for(auto it2:ar[mp[it1]])
{
//cout<<it2<<"::"<<it1<<'\n';
print[it2]=it1;
ci++;
}
//cout<<'\n';
}
cout<<ci<<'\n';
for(int i=0;i<maxn;i++)
{
if(print[i])
{
cout<<print[i]<<' ';
ci--;
if(ci==0) break;
}
}
//break;
}
signed main()
{
fast int casen=1;
//cin>>casen;
while(casen--) solve();
}
/*
6
3 4 1 2 1 2
*/