Codeforces Round 905 (Div. 3)
A.
先算距离,特判0的位置,最后加4
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f
void solve() {
string s;cin>>s;s=" "+s;
int last=1,now,ans=0;
for(int i=1;i<s.size();i++){
now=s[i]-'0';
// cout<<now<<' '<<last<<'\n';
if(now==0){
if(last==0){
last=0;
}else {
ans += 10 - last;
last = 0;
}
}else{
if(last==0){
ans+=10-now;
last=now;
}else{
ans+=abs(last-now);
last=now;
}
}
//cout<<now<<' '<<last<<' '<<ans<<'\n';
}
ans+=4;
cout<<ans<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int left=1;
cin>>left;
while(left--){
solve();
}
}
B.
回文串形式:偶数对+最多单个字符
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f
void solve() {
int n,k;cin>>n>>k;
string s;cin>>s;
vector<int>cnt(30,0);
for(int i=0;i<s.size();i++){
cnt[s[i]-'a']++;
}
int ou=0,ji=0;
for(int i=0;i<26;i++){
if(cnt[i]){
if(cnt[i]%2==0)ou+=cnt[i];
else {
ou+=cnt[i]-1;
ji++;
}
}
}
if(k==ji||k==ji-1){
cout<<"YES"<<'\n';return ;
}
if(k<ji){
cout<<"NO"<<'\n';return ;
}
cout<<"YES"<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int left=1;
cin>>left;
while(left--){
solve();
}
}
C.
因为k是2-5,除了4,其他都是质数
质数是最大的因数是自己
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f
void solve() {
int n,k;cin>>n>>k;
vector<int>a(n+1);
for(int i=1;i<=n;i++)cin>>a[i];
int mi=inf;
if(k==4){
if(n==1){
mi=k-(a[1]%k);
}else {
int ou = 0;
for (int i = 1; i <= n; i++) {
if (a[i] % 2 == 0)ou++;
if(a[i]%k==0){
mi=0ll;break;
}
mi=min(mi,k-(a[i]%k));
}
if (ou >= 2 )mi=0ll;
else if(ou==0){
mi=min(2ll,mi);
}else if(ou==1){
mi=min(1ll,mi);
}
}
}else {
for (int i = 1; i <= n; i++) {
if (a[i] % k == 0) {
mi = 0ll;
break;
}
mi = min(mi, k - (a[i] % k));
}
}
cout<<mi<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int left=1;
cin>>left;
while(left--){
solve();
}
}
D.
只要存在最早结束的点<最晚开始的点即可
用set处理的
debug:
st.end()的迭代器要--才指向最后一个元素
看了题解,把左右端点分开存并用multiset会更简便
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f
void solve() {
int q;cin>>q;
set<pair<int,int>>st,end;
map<pair<int,int>,int>mp;
char op;
int l,r;
while(q--){
cin>>op>>l>>r;
if(op=='+'){
if(mp[{l,r}]==0){
st.insert({l,r});
end.insert({r,l});
}
mp[{l,r}]++;
}else{
mp[{l,r}]--;
if(mp[{l,r}]==0){
st.erase({l,r});
end.erase({r,l});
}
}
// cout<<"st:\n";
// for(auto t:st)cout<<t.first<<' '<<t.second<<'\n';
// cout<<"end:\n";
// for(auto t:end)cout<<t.first<<' '<<t.second<<'\n';
if(st.size()>=2&&end.size()>=2){
auto it=st.end();it--;
auto itt=end.begin();itt++;
int l1=(*st.end()).first,r1=(*st.end()).second;
int l2=(*end.begin()).second,r2=(*end.begin()).first;
if(l1==l2&&r1==r2){
it--;
if(r2<(*it).first||(*itt).first<l1){
cout<<"YES\n";
}else cout<<"NO\n";
}else{
// cout<<"(*st.end()).first="<<(*st.end()).first<<'\n';
// cout<<"(*st.end()).second="<<(*st.end()).second<<'\n';
// cout<<"(*st.begin()).first="<<(*st.end()).first<<'\n';
// cout<<"(*st.begin()).second="<<(*st.end()).second<<'\n';
// cout<<"(*end.begin()).irst="<<(*end.begin()).first<<' '<<(*st.end()).first<<'\n';
if((*end.begin()).first<(*it).first){
cout<<"YES\n";
}else cout<<"NO\n";
}
}else cout<<"NO\n";
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int left=1;
//cin>>left;
while(left--){
solve();
}
}
E.
可以算出相邻数之间相差几个2,用前缀的方式做
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f
void solve() {
int n,la;cin>>n>>la;
int ans=0,sum=0;
for(int i=1;i<n;i++){
int a;cin>>a;
int c1=0,c2=0;
int l=la,r=a;
while(l<r)l<<=1,++c1;
while(l>r)r<<=1,++c2;
sum+=c2-c1;sum=max(0ll,sum);ans+=sum;la=a;
}
cout<<ans<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int left=1;
cin>>left;
while(left--){
solve();
}
}
F.
一段合法的区间,左端点左边没有和左端点一样的数
右端点右边没有和右端点一样的数
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f
void solve() {
int n;cin>>n;
vector<int>a(n+1),pre(n+1);
map<int,int>mp,mmp;
for(int i=1;i<=n;i++){
cin>>a[i];
if(mp[a[i]])pre[i]=pre[i-1];
else {
mp[a[i]]++;pre[i]=pre[i-1]+1;
}
}
int ans=0;
for(int i=n;i>=1;i--){
if(mmp[a[i]])continue;
mmp[a[i]]++;
ans+=pre[i];
}
cout<<ans<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int left=1;
cin>>left;
while(left--){
solve();
}
}