2023/1/21

在这里插入图片描述

2021

#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long ll;
void slove(){
	cout<<min(4+19+21*20,4+21+22*19)<<endl;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int T=1;
//	cin>>T;
	while(T--){
		slove();
	}
	return 0;
}

2022

#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long ll;
void slove(){
	cout<<"LLLV"<<endl;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int T=1;
	while(T--){
		slove();
	}
	return 0;
}

2023

#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long ll;
void slove(){
	ll ans=0;
	int n;cin>>n;
	vector<ll>a(n+1,0),s(n+1,0);
	for(int i=1;i<=n;i++){
		cin>>a[i];
		s[i]=s[i-1]+a[i];
	}
	for(int i=1;i<n;i++){
		ans+=(s[n]-s[i])*a[i];
	}
	cout<<ans;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int T=1;
	while(T--){
		slove();
	}
	return 0;
}

2024

题意

给出一段长度为n的序列和x,m次询问求出区间[l,r]中是否有2个数的异或为x

思路

对于每一个点记录到这个点的左边最近的一个异或为x的数字,用线段树维护一段区间中最右端的点,查询时如果得出的值大于等于l则存在。

#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
#define lt k<<1
#define rt k<<1|1
#define mid ((l+r)>>1)
#define ltr lt,l,mid
#define rtr rt,mid+1,r
typedef long long ll;
int tr[400005],lxt[100005];
void build(int k,int l,int r){
	if(l==r){
		tr[k]=lxt[l];
		return;
	}
	build(ltr);
	build(rtr);
	tr[k]=max(tr[lt],tr[rt]);
}
int ask(int k,int l,int r,int xl,int xr){
	if(xl<=l&&r<=xr){
		return tr[k];
	}
	int res=0;
	if(xl<=mid)res=max(res,ask(ltr,xl,xr));
	if(xr>mid)res=max(res,ask(rtr,xl,xr));
	return res;
}
int n,m,x;
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>m>>x;
	unordered_map<int,int>mp;
	for(int i=1;i<=n;i++){
		int y;
		cin>>y;
		lxt[i]=mp[y^x];
		mp[y]=i;
	}
	build(1,1,n);
	while(m--){
		int l,r;
		cin>>l>>r;
		cout<<(ask(1,1,n,l,r)>=l?"yes":"no")<<endl;
	}
	return 0;
}

2025

#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long ll;
#define int long long
const int mod=998244353;
int qmi(int a, int k, int p)  // 求a^k mod p
{
	int res = 1 % p;
	while (k)
	{
		if (k & 1) res = (ll)res * a % p;
		a = (ll)a * a % p;
		k >>= 1;
	}
	return res;
}//逆元qmi(n!,p-2,p)
int n;
void slove(){
	cin>>n;
	int ans=0;
	for(int i=1;i<=n;i++){
		int x,y;
		cin>>x>>y;
		ans=(ans+1)%mod*y%mod*qmi(y-x,mod-2,mod)%mod;
	}
	cout<<ans;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int T=1;
//	cin>>T;
	while(T--){
		slove();
	}
	return 0;
}

2026

题意

给出一个长度为n的石头路,每个石头只能走hi次,跳跃距离为y,求可以往返x次时的最小y

思路

往返x次相当于正反向走2x次,题意可以得出这题可以二分答案y,然后贪心的去跑。
在二分答案的check函数中,s类似于网络流中的流量,h类似于容量,判断最后是否能有2
x的流到n。

#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long ll;
int n,x;
vector<int>f;
inline int find(int x){
	return f[x]==x?x:find(f[x]);
}
inline bool check(int y,vector<int>a){
	vector<int>s(n+1,0);
	s[0]=2*x;
	for(int i=0;i<=n;i++)f[i]=i;
	for(int i=0;i<n;i++){
		int to=i+y;
		if(to>=n){
			s[n]+=s[i];
		}
		else {
			while(s[i]&&to>i){
				int res=min(a[to],s[i]);
				s[to]+=res;
				s[i]-=res;
				a[to]-=res;
				if(!a[to])f[to]=to-1;
				to=find(to-1);
			}
		}
	}
	return s[n]>=2*x;
}
void slove(){
	cin>>n>>x;
	f.resize(n+1);
	vector<int>h(n+1,0);
	for(int i=1;i<n;i++)cin>>h[i];
	int l=1,r=n;
	while(l<r){
		int mid=l+r>>1;
		if(check(mid,h))r=mid;
		else l=mid+1;
	}
	cout<<r<<endl;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int T=1;
	while(T--){
		slove();
	}
	return 0;
}

2030

题意

给出一个n长度的序列,和m个区间和,求q次询问的区间和

思路

一个区间的和为sum[r]-sum[l-1],对于给出的m个区间相当于 l-1 => r之间连了一条边长度为s的边,所以可以使用并查集来判断是否联通,询问时跑一遍路径得出答案。(60分)
在60分的基础上我们舍去搜索这一段,在并查集的时候记录每个点到根节点的距离,最后查询的时候只需要用使用到根的距离相减即可得到答案。

#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long ll;
#define int long long
int n,m,q,ok;
vector<int>f,a;
vector<bool>vis;
vector<pair<int,int>>to[100005];
int find(int x){
	if(f[x]==x)return x;
	int t=find(f[x]);
	a[x]+=a[f[x]];
	return f[x]=t;
}
void dfs(int x,int ed,int s){
	if(x==ed){
		ok=1;
		cout<<s<<endl;
		return;
	}
	vis[x]=true;
	for(auto [y,c]:to[x]){
		if(ok)break;
		if(vis[y])continue;
		dfs(y,ed,s+c);
	}
	vis[x]=false;
}//60分
void slove(){
	cin>>n>>m>>q;
	f.resize(n+1);
	a.resize(n+1,0);
	vis.resize(n+1);
	for(int i=0;i<=n;i++)f[i]=i,vis[i]=false;
	while(m--){
		int l,r,s;
		cin>>l>>r>>s;
		l--;
		int fl=find(l),fr=find(r);
		if(fl!=fr){
			f[fr]=fl;
			a[fr]=s-(a[r]-a[l]);
//			to[l].push_back({r,s});
//			to[r].push_back({l,-s});
		}
	}
	while(q--){
		int l,r;
		cin>>l>>r;
		l--;
		int fl=find(l),fr=find(r);
		if(fl!=fr){
			cout<<"UNKNOWN\n";
			continue;
		}
//		ok=0;
//		dfs(l-1,r,0);
		cout<<a[r]-a[l]<<endl;
	}
//	for(auto x:a)cout<<x<<" ";
//	cout<<endl;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int T=1;
//	cin>>T;
	while(T--){
		slove();
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值