Educational Codeforces Round 132 (Rated for Div. 2)
传送门:https://codeforces.com/contest/1709
A. Three Doors
随便乱搞都行
#include <bits/stdc++.h>
#define int long long
const int N = 1e5 + 10;
int a[N];
signed main() {
std::ios::sync_with_stdio(false);
int t;std::cin>>t;
while(t--){
int x;std::cin>>x;
int h[4]={0};
for(int i=1;i<=3;i++)std::cin>>h[i];
int p=x;
int ans=0;
while(p){
p=h[p];
ans++;
}
if(ans==3)std::cout<<"YES"<<std::endl;
else std::cout<<"NO"<<std::endl;
}
}
B. Also Try Minecraft
两个前缀和
#include <bits/stdc++.h>
#define int long long
const int N = 1e5 + 10;
int a[N];
int sl[N],sr[N];
signed main() {
std::ios::sync_with_stdio(false);
int n,m;std::cin>>n>>m;
for(int i=1;i<=n;i++)std::cin>>a[i];
for(int i=1;i<=n;i++)sl[i]=sl[i-1]+std::max(0ll,a[i]-a[i+1]);
for(int i=1;i<=n;i++)sr[i]=sr[i-1]+std::max(0ll,a[i]-a[i-1]);
while(m--){
int s,t;std::cin>>s>>t;
if(s<t)std::cout<<sl[t-1]-sl[s-1]<<"\n";
else std::cout<<sr[s]-sr[t]<<"\n";
}
}
C. Recover an RBS
有毒啊
#include <bits/stdc++.h>
#define int long long
const int N = 1e6 + 10;
std::string s;
signed main() {
std::ios::sync_with_stdio(false);
int t;std::cin>>t;
while(t--){
std::cin>>s;int n=s.length();
std::vector<int>p;
s[0]='(';s[n-1]=')';
int cost[3]={0};bool f=1;
for(int i=0;i<n;i++){
if(s[i]=='(')cost[0]++;
if(s[i]==')')cost[1]++;
if(s[i]=='?')p.push_back(i);
}
int a=n/2-cost[0];
int b=n/2-cost[1];
for(int i=0;i<a;i++)s[p[i]]='(';
for(int i=a;i<a+b;i++)s[p[i]]=')';
if(a+b<1||!b||!a){
std::cout<<"YES\n";
continue;
}
std::swap(s[p[a-1]],s[p[a]]);
cost[0]=cost[1]=0;
bool ff=1;
for(int i=0;i<n;i++){
cost[(int)(s[i]!='(')]++;
if(cost[1]>cost[0])ff=0;
}
if(ff)f=0;
//std::cout<<s<<"\n";
if(f)std::cout<<"YES"<<"\n";
else std::cout<<"NO"<<"\n";
}
}
D. Rorororobot
st表维护区间最大值
#include<bits/stdc++.h>
#define int long long
const int N = 2e5+10;
int a[N];int n,m;
int x1,Y1,x2,y2;
int st[N][30];
void init(){
for(int i=1;i<=m;i++)st[i][0]=a[i];
for(int j=1;j<=20;j++){
for(int i=1;i+(1<<j)-1<=m;i++){
st[i][j]=std::max(st[i][j-1],st[i+(1<<(j-1))][j-1]);
}
}
}
int ask(int l,int r){
int k=log2(r-l+1);
return std::max(st[l][k],st[r-(1<<k)+1][k]);
}
signed main(){
std::ios::sync_with_stdio(false);
std::cin>>n>>m;
for(int i=1;i<=m;i++)std::cin>>a[i];
init();
int q;std::cin>>q;
while(q--){
int k;
std::cin>>x1>>Y1>>x2>>y2;
std::cin>>k;
if(std::abs(x1-x2)%k!=0||std::abs(Y1-y2)%k!=0){
std::cout<<"NO\n";
continue;
}
if(Y1>y2)std::swap(Y1,y2);
if(x1>x2)std::swap(x1,x2);
int maxs=ask(Y1,y2);
if(x1>maxs){
std::cout<<"YES\n";
continue;
}
if(x2>maxs){
std::cout<<"YES\n";
continue;
}
int p=maxs-x2;
p-=p%k;
p+=k;
maxs=p+x2;
if(maxs<=n)std::cout<<"YES\n";
else std::cout<<"NO\n";
}
}
E. XOR Tree
启发式合并
题意:给一颗有点权的树,要求所有简单路径上经过的顶点的权值异或和不为0。求修改顶点权值的最少次数。
找到一个巨短的答案:

ac:
#include <bits/stdc++.h>
#define int long long
const int N = 2e5 + 10;
int a[N],v[N],cost;
std::vector<int>to[N];
std::set<int>s[N];
void merge(int u,int v,bool &f){
if(s[u].size()>s[v].size())s[u].swap(s[v]);
for(int p:s[u])f|=s[v].count(a[v]^p);
for(int p:s[u])s[v].insert(p);
}
void dfs_qfshb(int now,int last){
bool f=0;
v[now]=v[last]^a[now];
s[now].insert(v[now]);
for(int i:to[now]){
if(i!=last){
dfs_qfshb(i,now);
merge(i,now,f);
}
}
if(f){
cost++;
s[now].clear();
}
}
signed main() {
std::ios::sync_with_stdio(false);
int n;std::cin>>n;
for(int i=1;i<=n;i++)std::cin>>a[i];
for(int i=1;i<n;i++){
int x,y;std::cin>>x>>y;
to[x].push_back(y);
to[y].push_back(x);
}
dfs_qfshb(1,0);
std::cout<<cost<<"\n";
}
考虑少了。没过样例3的版本。
#include <bits/stdc++.h>
#define int long long
const int N = 2e5 + 10;
int a[N];
std::vector<int>to[N];
int cost=0;
std::vector<int> dfs(int now,int last){
std::vector<std::vector<int>>ve;
std::vector<int>res;
for(int i:to[now]){
if(last!=i){
ve.push_back(dfs(i,now));
}
}
std::map<int,int>mp;
for(int i=0;i<ve.size();i++){
for(int j=0;j<ve[i].size();j++){
if(mp[ve[i][j]^a[now]]){
res.clear();
cost++;
return res;
}
mp[ve[i][j]]++;
res.push_back(ve[i][j]^a[now]);
}
}
if(!ve.size())res.push_back(a[now]);
return res;
}
int get(int start){
cost=0;
dfs(start,0);
return cost;
}
signed main() {
std::ios::sync_with_stdio(false);
int n;std::cin>>n;
for(int i=1;i<=n;i++)std::cin>>a[i];
for(int i=1;i<n;i++){
int a,b;std::cin>>a>>b;
to[a].push_back(b);
to[b].push_back(a);
}
int ans=0;
for(int i=1;i<=n;i++)ans=std::max(ans,get(i));
std::cout<<ans<<"\n";
}
浙公网安备 33010602011771号