Codeforces Round #796 (Div. 2)
A - Cirno’s Perfect Bitmasks Classroom
分析:
- 二进制下 找第一个 1 (有意思的)
#include <bits/stdc++.h>
#define int long long
#define Pa pair<int,int>
#define yes cout<<"YES\n"
#define no cout<<"NO\n"
using namespace std;
const int N=1e5+5;
void solve()
{
int x;
cin>>x;
int y=1, ans=0, f0=1e9;
while(x)
{
if(x&1)
{
ans+=y;
break;
}
else
{
f0=min(y,f0);
}
x>>=1; y<<=1;
}
//cout<<ans<<" "<<f0<<"\n";
if(x==1) ans+=min(f0,y*2); // 若后面没有 1 则继续找第一个0
cout<<ans<<"\n";
}
signed main()
{
int T=1;
cin>>T;
while(T--) solve();
}
B - Patchouli’s Magical Talisman
分析:
- 签到~
#include <bits/stdc++.h>
#define int long long
#define Pa pair<int,int>
#define yes cout<<"YES\n"
#define no cout<<"NO\n"
using namespace std;
const int N=2e5+5;
int a[N];
void solve()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
int ans=0, cnt=1e9;
for(int i=1;i<=n;i++)
{
if(a[i]&1)
{
cnt=1;
}
else
{
ans++;
if(cnt!=1)
{
int x=a[i], t=0;
while(x)
{
if(x&1) break;
x>>=1; t++;
}
cnt=min(cnt,t);
}
}
}
cout<<ans+cnt-1<<"\n";
}
signed main()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int T=1;
cin>>T;
while(T--) solve();
}
C - Manipulating History
分析:
-
妙妙题
-
S 1 = s − t 1 + t 2 S 2 = S 1 − t 3 + t 4 . . . f i n a l = S n − t 2 n − 1 + t 2 n S_1 = s-t_1+t_2\\ S_2 = S_1-t_3+t_4\\ ...\\ final = S_{n}-t_{2n-1}+t_{2n} S1=s−t1+t2S2=S1−t3+t4...final=Sn−t2n−1+t2n
因此 s = f i n a l + T 1 − T 2 s = final+T_1-T_2 s=final+T1−T2
-
关键一步转换: s + 2 T 2 = f i n a l + T 1 + T 2 s+2T_2 = final+T_1+T_2 s+2T2=final+T1+T2
因为 s 为奇数,故 f i n a l + T 1 + T 2 final+T_1+T_2 final+T1+T2 出现的奇数次的字母 为 ans
#include <bits/stdc++.h>
#define int long long
#define Pa pair<int,int>
#define yes cout<<"YES\n"
#define no cout<<"NO\n"
using namespace std;
const int N=5e2+5;
int cnt[33];
void solve()
{
int n;
cin>>n;
for(int i=0;i<26;i++) cnt[i]=0;
for(int i=1;i<=n*2+1;i++)
{
string s; cin>>s;
for(char c : s) cnt[c-'a']++;
}
for(int i=0;i<26;i++)
if(cnt[i]&1)
{
cout<<char('a'+i)<<"\n";
return;
}
}
signed main()
{
//ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int T=1;
cin>>T;
while(T--) solve();
}
D - The Enchanted Forest
分析:
- 数学结论
#include <bits/stdc++.h>
#define int long long
#define Pa pair<int,int>
#define yes cout<<"YES\n"
#define no cout<<"NO\n"
using namespace std;
const int N=2e5+5;
int a[N], s[N];
void solve()
{
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i], s[i]=s[i-1]+a[i];
int ans=0;
if(k>=n)
{
ans=s[n]+(k-1+k-n)*n/2;
}
else
{
for(int i=k;i<=n;i++)
{
ans=max(ans,s[i]-s[i-k]);
}
ans+=k*(k-1)/2;
}
cout<<ans<<"\n";
}
signed main()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int T=1;
cin>>T;
while(T--) solve();
}
E - Railway System
分析:
- 交互题 + 最小生成树
#include <bits/stdc++.h>
#define int long long
#define Pa pair<int,int>
#define yes cout<<"YES\n"
#define no cout<<"NO\n"
using namespace std;
const int N=5e2+5;
struct node
{
int w,id;
bool operator < (const node &b) const {
return w<b.w;
}
}e[N];
char s[N];
int n,m;
int query()
{
cout<<"? "<<s<<endl;
int res; cin>>res;
return res;
}
void solve()
{
cin>>n>>m;
for(int i=0;i<m;i++) s[i]='0';
for(int i=0;i<m;i++)
{
s[i]='1';
e[i].w = query();
e[i].id = i;
s[i]='0';
}
sort(e,e+m);
int pre=0;
for(int i=0;i<m;i++)
{
s[e[i].id] = '1';
int now = query();
if(pre+e[i].w == now)
{
pre = now;
}
else s[e[i].id] = '0';
}
cout<<"! "<<pre<<endl;
}
signed main()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int T=1;
//cin>>T;
while(T--) solve();
}
F - Sanae and Giant Robot
分析:
-
妙妙题+结论
一定是从 s[i]=0 的点开始合并
-
set + 二分维护区间内点的删除
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int a[N],b[N],s[N];
vector <int> g[N];
void solve()
{
int n,m;
cin>>n>>m;
set <int> st;
for(int i=0;i<=n;i++) g[i].clear(), st.insert(i);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<=n;i++) scanf("%lld",&b[i]), s[i]=s[i-1]+a[i]-b[i];
for(int i=1;i<=m;i++)
{
int u,v;
scanf("%lld%lld",&u,&v);
u--;
g[u].push_back(v);
g[v].push_back(u);
}
queue<int> q;
for(int i=0;i<=n;i++)
{
if(!s[i])
{
q.push(i);
st.erase(i);
}
}
while(!q.empty())
{
int u=q.front(); q.pop();
for(int v : g[u])
{
if(s[v]) continue;
int l=min(u,v), r=max(u,v);
auto itl = st.lower_bound(l), itr = st.upper_bound(r);
for(auto it=itl; it!=itr; it++)
{
s[*it]=0; q.push(*it);
}
st.erase(itl,itr);
}
}
if(!st.size()) cout<<"YES\n";
else cout<<"NO\n";
}
signed main()
{
int T=1;
cin>>T;
while(T--) solve();
}