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类似于容量,判断最后是否能有2x的流到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;
}