暑假刷题第16天--7/28

143. 最大异或对 - AcWing题库(字典树)

cpp 复制代码
#include<iostream>
using namespace std;
const int N=100005;
int a[N];
int nex[10000007][2],cnt;
void insert(int x){
	int p=0;
	for(int i=30;i>=0;i--){
		int u=x>>i&1;
		if(!nex[p][u])nex[p][u]=++cnt;
		p=nex[p][u];
	}
}
int find(int x){
	int p=0;
	int ans=0;
	for(int i=30;i>=0;i--){
		int u=x>>i&1;
		if(nex[p][!u]){
			ans=ans*2+1;
			p=nex[p][!u];
		}
		else {
			p=nex[p][u];
			ans=ans*2;
		}
	}
	return ans; 
}
int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
		insert(a[i]);
	}
	int ans=0;
	for(int i=0;i<n;i++){
		ans=max(ans,find(a[i]));
	}
	cout<<ans<<endl;
} 

144. 最长异或值路径 - AcWing题库(前面一题变形--两题都要重点学习)

cpp 复制代码
#include<iostream>
#include<cstring>
using namespace std;
const int N=100005,M=2e5+5;
int nex[320*N][2],cnt;
int d[N];//根节点到i 
int ne[M],w[M],e[M],h[N],idx;
void add(int a,int b,int c){
	e[idx]=b;
	ne[idx]=h[a];
	w[idx]=c;
	h[a]=idx++;
}
void insert(int x){
	int p=0;
	for(int i=30;i>=0;i--){
		int u=x>>i&1;
		if(!nex[p][u])nex[p][u]=++cnt;
		p=nex[p][u];
	}
}
int find(int x){
	int p=0;
	int ans=0;
	for(int i=30;i>=0;i--){
		int u=x>>i&1;
		if(nex[p][!u]){
			ans=ans*2+1;
			p=nex[p][!u];
		}
		else {
			p=nex[p][u];
			ans=ans*2;
		}
	}
	return ans; 
}
void dfs(int x,int fa,int sum){
	d[x]=sum;
	for(int i=h[x];~i;i=ne[i]){
		int j=e[i];
		if(j!=fa){
			dfs(j,x,sum^w[i]);
		}
	}
}
int main(){
	int n;
	cin>>n;
	memset(h,-1,sizeof(h));
	for(int i=0;i<n-1;i++){
		int x,y,z;
		cin>>x>>y>>z;
		add(x,y,z);
		add(y,x,z);
	}
	dfs(0,-1,0);
	for(int i=0;i<n;i++){
		insert(d[i]);
	}
	int ans=0;
	for(int i=0;i<n;i++){
		ans=max(ans,find(d[i]));
	}
	cout<<ans<<endl;
} 

Problem - C - Codeforces

cpp 复制代码
#include<iostream>
#include<cstring>
using namespace std;
const int N=200005;
long long  a[N];
void solve(){
	long long n,k;
    cin>>n>>k;
    for(int i=0;i<n;i++)cin>>a[i];
    long long j=0,ans=1;
    while(k--) {
        while(j<n&&a[j]<=ans+j)j++;
        ans+=j;
    }
    cout<<ans<<endl;
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
} 

Problem - B - Codeforces

cpp 复制代码
#include<iostream>
#include<cstring>
using namespace std;
const int N=100005;
int a[N];
int n,k;
int check(int mid){
	int c=n,b=mid,a;
	for(int i=1;i<=k-2;i++){
		if(b>c)return 0;
		a=c-b;
		c=b;
		b=a;
	}
	if(b>c)return 0;
	return 1;
}
int check1(int mid){
	int c=n,b=mid,a;
	for(int i=1;i<=k-2;i++){
		if(b>c)return 1;
		a=c-b;
		c=b;
		b=a;
	}
	if(b>c)return 1;
	return 0;
}
void solve(){
	cin>>n>>k;
	if(k>=30){
		cout<<0<<endl;
		return;
	}
	int ans=0;
	for(int i=n/2-1;i<=n;i++){
		if(check(i))ans++;
	}
	cout<<ans<<endl;
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
} 

145. 超市 - AcWing题库(优先队列+贪心)--并查集解法待补

cpp 复制代码
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=10004;
typedef pair<int,int>PII;
PII  a[N];
int main(){
	int n;
	while(cin>>n){
		priority_queue<int,vector<int>,greater<int> >q;
		for(int i=0;i<n;i++){
			cin>>a[i].second>>a[i].first;
		}
		sort(a,a+n);
		int t=1;
		for(int i=0;i<n;i++){
			if(q.empty()||t<=a[i].first){
				t++;
				q.push(a[i].second);
			} 
			else {
				if(a[i].second>q.top()){
					q.pop();
					q.push(a[i].second);
				}
			}
		}
		long long ans=0;
		while(!q.empty()){
			ans+=q.top();
			q.pop();
		}
		cout<<ans<<endl;
	}
} 
相关推荐
Dola_Zou2 小时前
工厂智能排产软件算法保护与按产线计费实战
算法·自动化·软件工程·软件加密
码匠许师傅3 小时前
【设计模式精讲】29.行为型模式总结与对比(Behavioral Patterns Summary)
c++·设计模式·uml
啦啦啦啦啦zzzz3 小时前
Logger的组装(c++20)
c++·算法·c++20
尾善爱看海4 小时前
前端算法与手写题集
前端·算法
繁星蓝雨5 小时前
C++的设计与演进大纲(如何从C语言一步步成长为C++)
c语言·开发语言·c++·c++历史·c++演进
程序员阿鹏5 小时前
为什么MySQL InnoDB选择B+树?
数据结构·数据库·b树·sql·mysql·算法·缓存
蒸蒸yyyyzwd5 小时前
机试学习笔记
c++·求职招聘
AI 思录5 小时前
Prompt 事故档案(八):日常表达被标为“待校准”,AI 的爹味语法从哪里来
大数据·人工智能·算法·prompt·用户体验·ai合规
月光船幽幽5 小时前
跨范式映射的稳定接口设计
人工智能·python·算法
handler016 小时前
【Linux】线程与虚拟内存的底层世界
linux·运维·服务器·c++·线程·虚拟地址空间·共享内存