AtCoder Beginner Contest 294(E,F,G)
AtCoder Beginner Contest 294(E,F,G)
E (思维,双指针)
这个题的大意就是有一个
我们要求的是第一行和第二行相同的数的数量
一个一个去找显然是不太可能(
这样的操作两个指针最多会到
具体看代码
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include<cmath>
#include <bitset>
#include <unordered_map>
using namespace std;
const int maxn=4e5+10;
const int mod=998244353;
const double eps=1e-7;
#define int long long
#define ios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
int n,m,L;
int a[maxn],b[maxn];
signed main ()
{
cin>>L>>n>>m;
int res=0;
for (int i=1;i<=n;i++)
{
cin>>a[i]>>b[i];
}
int now=1;
for (int i=1;i<=m;i++)
{
int v,l;
cin>>v>>l;
while (l)
{
int len=min(l,b[now]);
if(v==a[now]) res+=len;
b[now]-=len;
l-=len;
if(!b[now]) now++;
}
}
cout<<res<<"\n";
system ("pause");
return 0;
}
F(二分)
这个题目大意是有两个人,他们各自有
求第
对于答案,我们知道一定是在
所以我们可以用到二分,但是
假设此时的第
那么我们可以发现存在
一个一个寻找还是不太好
我们可以试着把上面那个式子移项,把
变成了
然后求这样的式子有多少个,我们可以分别存下大于号左右两边的式子,排序,然后和上一题类似的求出满足以上式子的数量,记录为
如
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include<cmath>
#include <bitset>
#include <unordered_map>
using namespace std;
const int maxn=4e5+10;
const int mod=998244353;
const double eps=1e-12;
#define int long long
#define ios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
int n,m,k;
double x[maxn],y[maxn],xx[maxn],yy[maxn];
bool check(double now)
{
vector<double>a(n+1),b(m+1);
for (int i=1;i<=n;i++)
{
a[i]=(1.0-now)*x[i]-now*y[i];
}
for (int i=1;i<=m;i++)
{
b[i]=(now-1.0)*xx[i]+now*yy[i];
}
sort(a.begin()+1,a.end());
sort(b.begin()+1,b.end());
int cur=1,cnt=0;
for (int i=1;i<=n;i++)
{
while (cur<=m&&b[cur]<a[i])
{
cur++;
}
cnt+=(cur-1);
if(cnt>k) return false;
}
return cnt<=k;
}
signed main ()
{
cin>>n>>m>>k;
for (int i=1;i<=n;i++)
{
cin>>x[i]>>y[i];
}
for (int i=1;i<=m;i++)
{
cin>>xx[i]>>yy[i];
}
double l=0,r=1.0;
k--;
double ans;
while (r-l>eps)
{
double mid=(l+r)/2.0;
if(check(mid))
{
r=mid;
ans=mid;
}
else l=mid;
}
ans*=100.0;
printf("%.10lf\n",ans);
system ("pause");
return 0;
}
G(lca,树状数组)
这个题首先是给你
假如没有修改权值的话,我们或许可以直接
如何记录每一个点的影响范围呢
我们可以记录每一个点的
然后对于修改一条边的权值,我们要怎样修改呢
我们可以先这样看,从
所以我们只需要改变
然后
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include<cmath>
#include <bitset>
#include <unordered_map>
using namespace std;
const int maxn=2e5+10;
const int mod=998244353;
const double eps=1e-12;
#define int long long
#define ios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
struct node
{
int next,to,val,id;
}e[maxn<<2];
int bit[maxn<<2];
int head[maxn],cnt;
int dfn1[maxn],dfn2[maxn],f[maxn][31];
int idx[maxn];
int dep[maxn];
int u[maxn],v[maxn],val[maxn];
int tim;
int s=30;
int n,q;
void add(int u,int v,int val,int id)
{
e[++cnt].next=head[u];
e[cnt].to=v;
e[cnt].val=val;
e[cnt].id=id;
head[u]=cnt;
return ;
}
void dfs(int u,int fa)
{
dfn1[u]=++tim;
f[u][0]=fa;
for (int i=1;i<s;i++)
{
f[u][i]=f[f[u][i-1]][i-1];
}
for (int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(v==fa) continue;
int id=e[i].id;
dep[v]=dep[u]+1;
dfs(v,u);
idx[id]=v;
}
dfn2[u]=tim;
return ;
}
int lca(int u,int v)
{
if(dep[u]<dep[v]) swap(u,v);
int dlt=dep[u]-dep[v];
for (int i=0;i<s;i++)
{
if((dlt>>i)&1)u=f[u][i];
}
if(u==v) return u;
for (int i=s-1;i>=0;i--)
{
if(f[u][i]!=f[v][i])
{
u=f[u][i];
v=f[v][i];
}
}
return f[u][0];
}
int lowbit(int x)
{
return x&(-x);
}
void update(int x,int val)
{
while (x<=n)
{
bit[x]+=val;
x+=lowbit(x);
}
return ;
}
int query(int x)
{
int res=0;
while (x)
{
res+=bit[x];
x-=lowbit(x);
}
return res;
}
signed main ()
{
cin>>n;
for (int i=1;i<n;i++)
{
cin>>u[i]>>v[i]>>val[i];
add(u[i],v[i],val[i],i);
add(v[i],u[i],val[i],i);
}
dfs(1,0);
for (int i=1;i<n;i++)
{
update(dfn1[idx[i]],val[i]);
update(dfn2[idx[i]]+1,-val[i]);
}
cin>>q;
while (q--)
{
int op,x,y;
cin>>op>>x>>y;
if(op==1)
{
int now=idx[x];
update(dfn1[now],y-val[x]);
update(dfn2[now]+1,val[x]-y);
val[x]=y;
}
else
{
// cout<<"ans ";
int res=query(dfn1[x])+query(dfn1[y])-2*query(dfn1[lca(x,y)]);
cout<<res<<"\n";
}
}
system ("pause");
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)