前言
传送门 :
细节很多
A.
第一位输出 0 , 然后字符串少输出一位即可
B.
$WA$了一发, 显然题目的意思是
$mp[a[i]]>=2 \&\& mp[b[i]]>=2$就不行
但是对于$mp$的统计,如果$a[i]==b[i]$其实只能算一次贡献
CODE
void solve(){
int n;cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i];
mp[a[i]] ++;
mp[b[i]] ++;
if(a[i] == b[i]) mp[a[i]] -- ;
}
for(int i=1;i<=n;i++){
if(mp[a[i]]>=2 && mp[b[i]]>=2){
cout<<"No"<<endl;
return;
}
}
cout<<"Yes"<<endl;
}
C.
显然,我们只需要递推的处理即可
特别注意的是 我们需要 手动写 两位数 的字符串
CODE
string s[17];
string num[20];
void solve(){
int n;cin>>n;
num[11] = "11";
num[10] = "10";
num[12] = "12";
num[13] = "13";
num[14] ="14";
num[15] = "15";
num[16] ="16";
s[1] = "1";
for(int i=2;i<=n;i++){
if(i<=9)
s[i] = s[i-1]+" "+char(i+'0')+" "+s[i-1];
else
s[i] = s[i-1]+" "+num[i]+" "+s[i-1];
}
cout<<s[n]<<endl;
}
D.
显然, 需要的数据结构是 双端 队列 ,但是我们不能直接存会爆炸,因此我们使用$pii$然后直接模拟即可
CODE
deque<pii> q;
void solve(){
int n;cin>>n;
// ll sum = 0 ;
for(int i=1;i<=n;i++){
int op;cin>>op;
int x,c;
if(op==1){
cin>>x>>c;
q.pb({x,c});
}else{
ll sum = 0;
cin>>c;
while(c){
auto t = q.front();
int temp = c;
c = max(0,c - t.y);
if(!c){
sum+=1ll*t.x*temp;
}else{
//cout<<t.x<<" "<<t.y<<"?"<<endl;
sum+=1ll*t.y*t.x;
}
t.y = max(0,t.y-temp);
q.pop_front();
if(t.y) q.push_front({t.x,t.y});
}
cout<<sum<<endl;
}
}
}
E
给定数组$A[]$寻找 最大是$X$最小是$Y$的子串数量
我们只需要$On$的扫一遍即可,然后使用两个指针一直找合法位置
如果遇到了不合法位置,显然是不可以计算的
否则直接加即可
CODE
const int N = 2e5+10;
int a[N];
int n,X,Y;
int pre;
int lastx,lasty;
ll ans;
void solve(){
cin>>n>>X>>Y;
//X 最大值 //Y最小值
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]>X || a[i]<Y){
pre = i ;
continue;
}
if(a[i] == X) lastx = i ;
if(a[i] == Y) lasty = i;
if(min(lastx,lasty) > pre) ans += min(lastx,lasty) - pre;
}
cout<<ans<<endl;
}
F,(补)
CODE
const int N = 2e5+10 , mod = 998244353;
int a[N],b[N];
int p[N],sz[N];
int f[N] = {2,1};
int n;
ll ans = 1;
void init(){
for(int i=2;i<=n;i++)
f[i] = (f[i-1] + f[i-2])%mod;
for(int i=1;i<=n;i++){
p[i] = i;
sz[i] = 1;
}
}
int find(int x){
if(x!=p[x])return p[x] = find(p[x]);
return p[x];
}
void merge(int x,int y){
x = find(x);
y = find(y);
if(x == y) return;
p[x] = y;
sz[y] += sz[x];
}
void solve(){
cin>>n;
init();
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
cin>>b[i];
merge(a[i],b[i]);
}
for(int i=1;i<=n;i++){
if(p[i] == i){
ans = ans * f[sz[i]]%mod;
}
}
cout<<ans<<endl;
}
还有就是 这个D 我调了一会,$auto &t$竟然不会一起更改$deque$醉了
这个E我没想到竟然难倒了好多大佬,大佬们都想nlogn的做法 QAQ