暑假刷题第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;
	}
} 
相关推荐
AA陈超8 分钟前
虚幻引擎5 GAS开发俯视角RPG游戏 P06-09 玩家等级与战斗接口
c++·游戏·ue5·游戏引擎·虚幻
violet-lz18 分钟前
数据结构四大简单排序算法详解:直接插入排序、选择排序、基数排序和冒泡排序
数据结构·算法·排序算法
·白小白22 分钟前
力扣(LeetCode) ——118.杨辉三角(C++)
c++·算法·leetcode
tongsound26 分钟前
libmodbus 使用示例
linux·c++
sulikey1 小时前
C++的STL:深入理解 C++ 的 std::initializer_list
开发语言·c++·stl·list·initializerlist·c++标准库
CoovallyAIHub1 小时前
超越“识别”:下一代机器视觉如何破解具身智能落地难题?
深度学习·算法·计算机视觉
代大大1 小时前
sciter.js 之cpp使用教程(1)
c++·前端框架
仰泳的熊猫1 小时前
LeetCode:207. 课程表
数据结构·c++·算法·leetcode
liu****1 小时前
19.map和set的封装
开发语言·数据结构·c++·算法
孤廖1 小时前
C++ 模板再升级:非类型参数、特化技巧(含全特化与偏特化)、分离编译破解
linux·服务器·开发语言·c++·人工智能·后端·深度学习