暑假刷题第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;
	}
} 
相关推荐
佑白雪乐9 分钟前
<ACM进度212题>[2026-3-1,2026-3-26]
算法·leetcode
穿条秋裤到处跑13 分钟前
每日一道leetcode(2026.03.26):等和矩阵分割 II
算法·leetcode·矩阵
平凡灵感码头17 分钟前
C语言 printf 数据打印格式速查表
c语言·开发语言·算法
哔哔龙23 分钟前
Android OpenCV 实战:图片轮廓提取与重叠轮廓合并处理
android·算法
hz_zhangrl25 分钟前
CCF-GESP 等级考试 2026年3月认证C++三级真题解析
c++·算法·程序设计·gesp·gesp2026年3月·gesp c++三级
x_xbx29 分钟前
LeetCode:1. 两数之和
数据结构·算法·leetcode
x_xbx32 分钟前
LeetCode:49. 字母异位词分组
算法·leetcode·职场和发展
玲娜贝儿--努力学习买大鸡腿版1 小时前
hot 100 刷题记录(1)
数据结构·python·算法
123过去1 小时前
pixiewps使用教程
linux·网络·测试工具·算法·哈希算法
kyle~1 小时前
C++----函数指针与函数指针类型 返回值类型 (*类型名)(参数列表)
开发语言·c++