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

link

点击查看代码
#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

link

点击查看代码
#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

看到这个题,直觉告诉我们可以把abc三个数组排序,这样它一定是有一点什么性质的。
(后文提到的数组都是排好序的)

点击查看代码
#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;
	
}
posted @   不认命,就是哪吒的命!  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示