abc391
C
link
记录一下每个鸽笼里鸽子的个数和每个鸽子的位置,维护一下有几个笼子里有两个以上的鸽子。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n,q;
int gs[1000005];
int wz[1000005];
int cnt;
int op,p,h;
signed main(){
cin >> n >> q;
for(int i = 1;i <= n;++ i) gs[i] = 1,wz[i] = i;
while(q--){
cin >> op;
if(op == 1){
cin >> p >> h;
gs[wz[p]]--;
if(gs[wz[p]] == 1) cnt--;
wz[p] = h;
gs[wz[p]]++;
if(gs[wz[p]] == 2) cnt++;
}
else cout << cnt << endl;
}
return 0;
}
D
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n,w;
int x[200005],y[200005];
int wz[200005];
int q;
int col[200005];
int c[200005];
int m;
signed main(){
cin >> n >> w;
for(int i = 1;i <= n;++ i){
cin >> x[i] >> y[i];
swap(x[i],y[i]);
col[y[i]]++;
wz[i] = col[y[i]];
c[wz[i]] = max(c[wz[i]],x[i]);
}
m = col[1];
for(int i = 2;i <= w;++ i) m = min(m,col[i]);
cin >> q;
while(q--){
int t,a;
cin >> t >> a;
if(wz[a] > m) cout << "Yes";
else if(c[wz[a]] > t) cout << "Yes";
else cout << "No";
cout << endl;
}
return 0;
}
E
点击查看代码
#include<bits/stdc++.h>
#define pii pair<int,int>
using namespace std;
int n;
int m;
vector<pii> q[15];
char s[2000005];
pii qk(pii x,pii y,pii z){
int xf = x.first,yf = y.first,zf = z.first;
int xs = x.second,ys = y.second,zs = z.second;
int w = (xf<<2)+(yf<<1)+zf;
if(w == 0) return {0,xs+ys+zs-max(xs,max(ys,zs))};
else if(w == 1) return {0,min(xs,ys)};
else if(w == 2) return {0,min(xs,zs)};
else if(w == 3) return {1,min(ys,zs)};
else if(w == 4) return {0,min(ys,zs)};
else if(w == 5) return {1,min(xs,zs)};
else if(w == 6) return {1,min(xs,ys)};
else if(w == 7) return {1,xs+ys+zs-max(xs,max(ys,zs))};
}
int ksm(int a,int b){
if(b == 0) return 1;
int z = ksm(a,b/2);
z *= z;
if(b%2) z *= a;
return z;
}
signed main(){
cin >> n >> s;
m = ksm(3,n);
for(int i = 2;i < m;i += 3){
pii x,y,z;
if(s[i-2] == '1') x.first = 1;
else x.first = 0;
if(s[i-1] == '1') y.first = 1;
else y.first = 0;
if(s[i] == '1') z.first = 1;
else z.first = 0;
x.second = y.second = z.second = 1;
q[1].push_back(qk(x,y,z));
}
for(int i = 2;i <= n;++ i){
for(int j = 2;j < q[i-1].size();j += 3){
q[i].push_back(qk(q[i-1][j-2],q[i-1][j-1],q[i-1][j]));
}
}
cout << q[n][0].second;
return 0;
}
F
link
看到这个题,直觉告诉我们可以把
(后文提到的数组都是排好序的)
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k;
int a[200005];
int b[200005];
int c[200005];
int ans;
map<int,map<int,map<int,bool> > > mp;
int sol(int i,int j,int l){
return a[i]*b[j]+b[j]*c[l]+c[l]*a[i];
}
struct nd{
int ai,bi,ci,sum;
};
bool operator<(const nd& x,const nd& y){
return x.sum < y.sum;
}
priority_queue<nd> q;
signed main(){
cin >> n >> k;
for(int i = 1;i <= n;++ i) cin >> a[i];
for(int i = 1;i <= n;++ i) cin >> b[i];
for(int i = 1;i <= n;++ i) cin >> c[i];
sort(a+1,a+1+n);sort(b+1,b+1+n);sort(c+1,c+1+n);
q.push({n,n,n,sol(n,n,n)});
mp[n][n][n] = 1;
for(int kk = 1;kk < k;++ kk){
nd t = q.top();q.pop();
int i = t.ai,j = t.bi,l = t.ci;
ans = t.sum;
if(i != 1&&(!mp[i-1][j][l])){
q.push({i-1,j,l,sol(i-1,j,l)});
mp[i-1][j][l] = 1;
}
if(j != 1&&(!mp[i][j-1][l])){
q.push({i,j-1,l,sol(i,j-1,l)});
mp[i][j-1][l] = 1;
}
if(l != 1&&(!mp[i][j][l-1])){
q.push({i,j,l-1,sol(i,j,l-1)});
mp[i][j][l-1] = 1;
}
}
cout << q.top().sum;
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析