题目链接:Codeforces Round #482 (Div. 2)
A:特判n为0的情况即可,否则判断奇偶。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
signed main(){
cin>>n;
if(n==0) return puts("0"),0;
if(n&1) cout<<(n+1)/2;
else cout<<n+1;
return 0;
}
B:因为可以持续n回合,所以把n加上判断即可,特判本身一个字符串就全部为同一字符的情况。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
int n,cnt[3][300];
string str[3],name[3];
struct node{int mx,id;}t[3];
int cmp(node a,node b){return a.mx>b.mx;}
signed main(){
name[0]="Kuro",name[1]="Shiro",name[2]="Katie";
cin>>n;
for(int i=0;i<3;i++){
cin>>str[i];
for(int j=0;j<str[i].size();j++)
cnt[i][str[i][j]]++,t[i].mx=max(t[i].mx,cnt[i][str[i][j]]);
t[i].id=i;
if(n==1&&t[i].mx==str[0].size()) t[i].mx=str[0].size()-1;
else t[i].mx=min(t[i].mx+n,(int)str[0].size());
}
sort(t,t+3,cmp);
if(t[1].mx==t[0].mx) puts("Draw");
else cout<<name[t[0].id];
return 0;
}
C:很明显就是找到x的子树size,和y的子树size,然后就可以算出不合法的路径,用总路径减去即可。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5+10;
int n,x,y,vis[N];
vector<int> g[N];
int bfs(int x,int y){
queue<int> q; int res=1; q.push(x); memset(vis,0,sizeof vis); vis[x]=1;
while(q.size()){
int u=q.front(); q.pop();
for(int i=0;i<g[u].size();i++){
int to=g[u][i]; if(vis[to]||to==y) continue;
vis[to]=1; res++; q.push(to);
}
}
return n-res;
}
signed main(){
cin>>n>>x>>y;
for(int i=1,a,b;i<n;i++)
scanf("%lld %lld",&a,&b),g[a].push_back(b),g[b].push_back(a);
int sz1=bfs(x,y),sz2=bfs(y,x);
cout<<n*(n-1)-sz1*sz2;
return 0;
}
D:建立1e5个Trie,然后每次从因子当中找Trie即可,求得最大异或值。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e5+10;
int q,t[N*30][2],mi[N*30],rt[N],idx,op,x,y,z;
vector<int> v[N];
inline void add(int x,int pos){
int p=rt[pos];
for(int i=16;i>=0;i--){
int k=(x>>i)&1;
if(!t[p][k]) t[p][k]=++idx;
mi[p]=min(mi[p],x); p=t[p][k];
}
mi[p]=min(mi[p],x);
}
inline int ask(int x,int s,int pos){
if(x%y!=0||s<=x||mi[rt[pos]]>s-x) return -1; int p=rt[pos],res=0;
for(int i=16;i>=0;i--){
int k=(x>>i)&1;
if(k==1){
if(t[p][0]) p=t[p][0];
else p=t[p][1],res+=(1<<i);
continue;
}
if(!t[p][1]){p=t[p][0]; continue;}
if(mi[t[p][1]]+x<=s){
p=t[p][1]; res+=(1<<i);
}else p=t[p][0];
}
return res;
}
inline void get(){
for(int i=1;i<=1e5;i++){
for(int j=i;j<=1e5;j+=i) v[j].emplace_back(i);
}
}
inline void solve(){
scanf("%d %d",&op,&x);
if(op==1){
for(int i=0;i<v[x].size();i++) add(x,v[x][i]);
}else{
scanf("%d %d",&y,&z);
printf("%d\n",ask(y,z,y));
}
}
signed main(){
cin>>q; get(); memset(mi,0x3f,sizeof mi);
for(int i=1;i<=1e5;i++) rt[i]=++idx;
for(int i=1;i<=q;i++) solve();
return 0;
}