tot:这场因为疫情,是线上打的,一共575队正式队伍。最后铜尾是4题390..vp写了4题,前三题1小时之内就出了,B题因为实现有些问题,一直TLE,思路是对的。然后换人再实现了一次,4小时才出的,最后罚时442。如果B题正常出的话,可以靠四题罚时蹭到铜了。然后题也感觉不好补了,就先不补了。
E--Edward Gaming, the Champion
思路:签到题,输出edgnb出现的个数即可。
string str;
void solve(){
cin>>str;
int cnt=0,n=(int)str.size();
str="?"+str;
for(int i=1;i+5-1<=n;i++) {
if(str[i]=='e'&&str[i+1]=='d'&&str[i+2]=='g'&&str[i+3]=='n'&&str[i+4]=='b') cnt++;
}
cout<<cnt;
}
F--Encoded Strings I
思路:队友写的,签到题吧。
ll n;
void solve(){
string s; cin >> n >> s; s=" "+s;
string ans;
for(int i=1;i<=n;i++){
int g[27]={0},f[27]={0},cnt=0;
// if(i==3) cout << g[1] << g[3] << "\n";
for(int j=i;j;j--) if(!f[s[j]-'a'+1]){
g[s[j]-'a'+1]=cnt++;
f[s[j]-'a'+1]=1;
// if(i==3) cout << s[j]-'a'+1 << "\n";
if(cnt==26) break;
}
// if(i==3) cout << g[1] << g[3] << "\n";
string ts;
for(int j=1;j<=i;j++) ts+=(char)('a'+g[s[j]-'a'+1]);
ans=max(ts,ans);
// cout << ts << "\n";
}
cout << ans;
}
J--Luggage Lock
思路:yk写过牛客一题和这个一样(更难)的题,这个是那题的子问题,yk直接秒。赛后补了一下。
每一个位置只有10种状态,总共是10^4种状态.
那么可以让初始位置为0000,然后跑dijkstra,得到到达每一种状态的最短路.
然后再把输入偏移一下就行.
typedef struct node{
int w;
int a,b,c,d;
bool operator<(const node &x) const{
return w>x.w;
}
}node;
int q;
int a1,a2,a3,a4;
int b1,b2,b3,b4;
int dis[10][10][10][10];
bool vis[10][10][10][10];
int da[10]={1,1,1,1,0,0,0,0,0,0};
int db[10]={0,1,1,1,1,1,1,0,0,0};
int dc[10]={0,0,1,1,0,1,1,1,1,0};
int dd[10]={0,0,0,1,0,0,1,0,1,1};
priority_queue<node> pq;
void dijkstra(){
for(int i=0;i<=9;i++) for(int j=0;j<=9;j++) for(int g=0;g<=9;g++) for(int h=0;h<=9;h++) dis[i][j][g][h]=INT_MAX;
dis[0][0][0][0]=0;
pq.emplace(node{0,0,0,0,0});
while(!pq.empty()){
node f=pq.top();
pq.pop();
if(vis[f.a][f.b][f.c][f.d]) continue;
vis[f.a][f.b][f.c][f.d]=true;
for(int i=0;i<10;i++){ //枚举移动的区间.
int aa1=f.a+da[i],bb1=f.b+db[i],cc1=f.c+dc[i],dd1=f.d+dd[i];
int aa2=f.a-da[i],bb2=f.b-db[i],cc2=f.c-dc[i],dd2=f.d-dd[i];
aa1%=10,bb1%=10,cc1%=10,dd1%=10;
aa2=(aa2+10)%10,bb2=(bb2+10)%10,cc2=(cc2+10)%10,dd2=(dd2+10)%10;
if(dis[aa1][bb1][cc1][dd1]>dis[f.a][f.b][f.c][f.d]+1){
dis[aa1][bb1][cc1][dd1]=dis[f.a][f.b][f.c][f.d]+1;
pq.emplace(node{dis[aa1][bb1][cc1][dd1],aa1,bb1,cc1,dd1});
}
if(dis[aa2][bb2][cc2][dd2]>dis[f.a][f.b][f.c][f.d]+1){
dis[aa2][bb2][cc2][dd2]=dis[f.a][f.b][f.c][f.d]+1;
pq.emplace(node{dis[aa2][bb2][cc2][dd2],aa2,bb2,cc2,dd2});
}
}
}
}
//说是很套路的题
//每一个位置只有10种状态,总共是10^4种状态.
//那么可以让初始位置为0000,然后跑dijkstra,得到到达每一种状态的最短路.
//然后再把输入偏移一下就行.
//Luggage Lock
//https://codeforces.com/gym/103427/problem/J
//牛客多校的某题..孪生题
//https://ac.nowcoder.com/acm/contest/81605/L
void solve(){
cin>>q;
dijkstra();
while(q--){
string str1,str2;
cin>>str1>>str2;
a1=str1[0]-'0',a2=str1[1]-'0',a3=str1[2]-'0',a4=str1[3]-'0';
b1=str2[0]-'0',b2=str2[1]-'0',b3=str2[2]-'0',b4=str2[3]-'0';
b1-=a1,b1=(b1+10)%10;
b2-=a2,b2=(b2+10)%10;
b3-=a3,b3=(b3+10)%10;
b4-=a4,b4=(b4+10)%10;
cout<<dis[b1][b2][b3][b4]<<endl;
}
}
B--Bitwise Exclusive-OR Sequence
思路:考虑约数条件w的每一位,进行二分图染色。注意实现要写好。
typedef struct node{
int u,v,w;
}node;
int n,m;
vector<node> edge;
void solve(){
cin>>n>>m;
for(int i=0;i<m;i++){
int u,v,w; cin>>u>>v>>w;
edge.emplace_back(node{u,v,w});
}
long long ans=0;
//把定义放在外面.
vector<pair<int,int>> vct[n+5];
vector<bool> vis1(n+5,false);
vector<int> col1(n+5);
for(int j=0;j<30;j++){
//统一在这里初始化,可以减少常数,直接从3s变为1s.
//qoj上面是跑了500ms.
//可以把30次压缩在一次dfs中,这样不用建图30次(100ms)..bfs应该也可以压缩?但是不会改..就这样凑合着吧,虽然说跑的慢一点,也能过吧..
for(int i=0;i<=n+1;i++) vct[i].clear(),vis1[i]=false,col1[i]=0;
for(int i=0;i<m;i++){
int u=edge[i].u,v=edge[i].v,w=edge[i].w;
if((w>>j)&1) vct[u].emplace_back(v,1),vct[v].emplace_back(u,1);
else vct[u].emplace_back(v,0),vct[v].emplace_back(u,0);
}
int res=0;
for(int i=1;i<=n;i++){
int res0=0,res1=0;
if(!vis1[i]){
vis1[i]=true;
col1[i]=1;
queue<int> que1;
que1.emplace(i);
res1++;
while(!que1.empty()){
int from=que1.front();
int color=col1[from];
que1.pop();
for(auto v:vct[from]){
if(!vis1[v.first]){
if(v.second==1){ //异色
que1.emplace(v.first);
if((color^1)==1) res1++;
else res0++;
col1[v.first]=color^1;
vis1[v.first]=true;
}
else{ //同色
que1.emplace(v.first);
if(color==1) res1++;
else res0++;
col1[v.first]=color;
vis1[v.first]=true;
}
}
else{
if(v.second==1&&col1[v.first]==color){ cout<<"-1"; return; }
else if(v.second==0&&col1[v.first]!=color){ cout<<"-1"; return; }
}
}
}
}
res+=min(res0,res1);
}
ans+=res*(1ll<<j);
}
cout<<ans;
}