- qinkaiwen 的博客
题解:AT_abc475_e Quiz Competition: Qualifiers
- @ 2026-9-12 22:42:51
做题时间:2026.9.12 题目难度: | 题目链接 | 洛谷链接
依旧忘打 ABC,依旧赛后看的时候一眼 E。(很奇怪这么简单的题 tjh 居然没做但把 F 切了)
这题题意依旧难懂?直接简化题意:将所有人的答案按照标准答案换成 01 串(正确就是 0,否则为 1),然后题目就变成了删掉一个字符串再插入一个字符串的时候判断新插入的字符串在按照字典序排序后的最远可能下标是否小于等于 。(最远是因为可能有多个相同的字符串)
一个 pb_ds 的事。(可恶为什么保留修改啊一开始看错题意了写了个二分)
嗯?没有过第三个样例?
哦原来如果一题没对直接被 ban 啊,那没事了加个特判。
好了这题做完了,去掉看错题的时间用时 。
#include<bits/stdc++.h>
#include<bits/extc++.h>
using namespace std;
using namespace __gnu_pbds;
#define int long long
struct node{string s;int id;};
bool operator<(node n1,node n2){return n1.s!=n2.s?n1.s<n2.s:n1.id<n2.id;}
tree<node,null_type,less<node>,rb_tree_tag,tree_order_statistics_node_update>S;map<string,int>mp;
const int N=30010,inf=1e9;
int n,m,k;string st,s[N],a[N],b[N];
bool cmp(string s1,string s2)
{
for(int i=0;i<k;i++)
if(s1[i]!=s2[i])return s1[i]<s2[i];
return 1;
}
signed main()
{
cin>>n>>m>>k>>st;
for(int i=1;i<=n;i++)
{
cin>>s[i];
for(int j=0;j<k;j++)
{
if(s[i][j]==st[j])a[i]+='0';
else a[i]+='1';
}
S.insert({a[i],++mp[a[i]]});
}
string ban;for(int i=1;i<=k;i++)ban+='1';
int q;cin>>q;
while(q--)
{
int x,y;cin>>x>>y;y--;
string ss=a[x];ss[y]^=1;
auto it=S.lower_bound({a[x],0});
S.erase(it);S.insert({ss,++mp[ss]});
a[x]=ss;
if(ss==ban)
{
cout<<"No"<<'\n';
continue;
}
int res=S.order_of_key({ss,inf});
if(res<=m)cout<<"Yes"<<'\n';
else cout<<"No"<<'\n';
}
}