链接.
文章目录
G. Good Key, Bad Key
题意:有
n
n
n个箱子,每个箱子里有
a
[
i
]
a[i]
a[i]枚硬币。按顺序从
1
−
n
1-n
1−n打开箱子,对于打开每个箱子,您可以选择花费
k
k
k枚硬币,也可以选择使从此箱子开始之后的所有箱子硬币都变为
⌊
a
[
i
]
2
⌋
\lfloor \frac {a[i]}{2} \rfloor
⌊2a[i]⌋,求可以获得硬币的最大值。
思路:首先可以知道一旦使用第二种方法打开箱子,那么之后的所有箱子都应该使用第二种方法打开。枚举使用使用第二种方法打开箱子的位置,由于
a
[
i
]
<
1
e
9
a[i]<1e9
a[i]<1e9,所以最多往后计算
32
32
32个,剩余的硬币都为0.
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
using namespace std;
int t;
int n;
ll k;
ll a[100010];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>t;
while(t--)
{
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>a[i];
ll ans=0;
ll sum=0;
for(int i=1;i<=n;i++)
{
ll res=0;
for(int j=i;j<=min(i+32,n);j++)
{
ll x=a[j];
int k=j-i+1;
while(k--)
{
x=x/2;
}
res+=x;
}
ans=max(ans,sum-k*(i-1)+res);
//cout<<sum<<" "<<res<<"\n";
//cout<<ans<<" "<<sum-k*(i-1)+res<<"\n\n";
sum+=a[i];
}
ans=max(ans,sum-k*n);
cout<<ans<<"\n";
}
return 0;
}
F. Yet Another Problem About Pairs Satisfying an Inequality
思路:记录所有满足 a [ i ] < i a[i]<i a[i]<i条件的 i i i, i i i具有单调性二分查找即可。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int t;
int n;
int a[200010];
vector<int>b;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>t;
while(t--)
{
b.clear();
cin>>n;
ll ans=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(i>a[i])
{
b.push_back(i);
if(b[0]>=a[i])continue;
int l=0,r=b.size();
while(l<r)
{
int mid=l+(r-l)/2;
if(b[mid]>=a[i])r=mid;
else l=mid+1;
}
ans+=l;
}
}
cout<<ans<<"\n";
}
return 0;
}
E. Mirror Grid
思路:只要满足上面四个对应的位置相等即可,
n
n
n为奇数时可以特殊处理下中间位置。
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
using namespace std;
int t;
int n;
char a[110][110];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i]+1;
int ans=0;
for(int i=1;i<=n/2;i++)
{
for(int j=1;j<=n/2;j++)
{
int x=0;
x+=a[i][j]-'0';
x+=a[j][n-i+1]-'0';
x+=a[n-j+1][i]-'0';
x+=a[n-i+1][n-j+1]-'0';
ans+=min(x,4-x);
}
}
if(n%2==1)
{
int m=n/2+1;
for(int i=1;i<=n/2;i++)
{
int x=0;
x+=a[m][i]-'0';
x+=a[m][n-i+1]-'0';
x+=a[i][m]-'0';
x+=a[n-i+1][m]-'0';
ans+=min(x,4-x);
}
}
cout<<ans<<"\n";
}
return 0;
}
D. Double Strings
写的比较麻烦,用了哈希。
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
using namespace std;
int t;
int n;
ull f[100010][10];
int a[100010];
int q[100010];
unordered_map<ull,bool>mp;
ull p[10];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
p[0]=1;
for(int i=1;i<=8;i++)p[i]=p[i-1]*131;
cin>>t;
while(t--)
{
mp.clear();
cin>>n;
for(int i=1;i<=n;i++)
{
q[i]=0;
string s;cin>>s;
for(int j=0;j<s.size();j++)
{
f[i][j+1]=f[i][j]*131+s[j];
}
a[i]=s.size();
mp[f[i][a[i]]]=1;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<a[i];j++)
{
ull x=f[i][j];
ull y=f[i][a[i]]-f[i][j]*p[a[i]-j];
if(mp[x]&&mp[y])
{
q[i]=1;
break;
}
}
cout<<q[i];
}
cout<<"\n";
}
return 0;
}
C. Cypher
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int t;
int n;
int a[110];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)
{
int m;cin>>m;
string s;cin>>s;
for(int j=0;j<s.size();j++)
{
if(s[j]=='U')
{
a[i]--;
if(a[i]==-1)a[i]=9;
}
else
{
a[i]++;
if(a[i]==10)a[i]=0;
}
}
}
for(int i=1;i<=n;i++)cout<<a[i]<<" ";
cout<<"\n";
}
return 0;
}
B. ICPC Balloons
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int t;
int n;
char s[60];
int a[30];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>t;
while(t--)
{
memset(a,0,sizeof a);
cin>>n>>s;
int ans=n;
for(int i=0;i<n;i++)
{
int id=s[i]-'A';
if(!a[id])
{
ans++;
a[id]=1;
}
}
cout<<ans<<"\n";
}
return 0;
}
A. YES or YES?
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int t;
char s[5];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>t;
while(t--)
{
cin>>s;
int flag=1;
if(s[0]!='Y'&&s[0]!='y')flag=0;
if(s[1]!='E'&&s[1]!='e')flag=0;
if(s[2]!='S'&&s[2]!='s')flag=0;
if(flag)cout<<"YES\n";
else cout<<"NO\n";
}
return 0;
}