Codeforces Round #757 (Div. 2)
A. Divan and a Store
给你个物品,每个物品有相应的价格,你有元,问最多能买多少个价格在之间的物品
很小,将物品从小到大排序,依次购买即可。
#include<bits/stdc++.h>
using namespace std;
int t,n,l,r,k;
const int MAX_N = 100 + 5;
int a[MAX_N];
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d%d%d",&n,&l,&r,&k);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
sort(a+1,a+1+n);
int cnt=0;
for(int i=1;i<=n;i++){
if(a[i]>=l && a[i]<=r){
if(k>=a[i]){
k-=a[i];
cnt++;
}
else break;
}
}
printf("%d\n",cnt);
}
return 0;
}
B. Divan and a New Project
在坐标轴上,你需要确定个点的坐标,每个点需要到达次,从号点到号点的距离为,问最少需要走多少距离,并构造出任意一种方案。
按权值(到达次数)从大到小排序,对于权值大的点放在离号节点近的地方。
#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 200000 + 5;
int t,n,ans[MAX_N];
struct node{
int x,id;
}a[MAX_N];
bool cmpx(node a,node b){
return a.x>b.x;
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i].x);
a[i].id=i;
}
sort(a+1,a+1+n,cmpx);
ans[0]=0;
int cnt1=0,cnt2=0;
for(int i=1;i<=n;i++){
if(i&1) ans[a[i].id]=++cnt1;
else ans[a[i].id]=--cnt2;
}
// printf("\n");
long long res=0;
for(int i=1;i<=n;i++){
res+=2ll*abs(ans[a[i].id])*a[i].x;
}
printf("%lld\n",res);
for(int i=0;i<=n;i++){
printf("%d ",ans[i]);
}
printf("\n");
}
return 0;
}
C. Divan and bitwise operations
位运算你能不能去死啊!!!
一个长度为的序列,但你不知道序列的具体元素,只知道段区间按位或的值,求这个序列的子序列(子集)异或和的和。
自闭题
这是一个场上还原了序列但不会统计答案的SB。
当我们确定序列后,考虑如何计算答案。
发现,如果枚举子集肯定是不合理的,也想不到什么方法可以优化,但求的是异或和的和,考虑二进制下每一位单独考虑,对于第位,序列中第位为1的数有个,为0的有个,对于为0的情况,选或不选都行,贡献为,考虑为1的情况,发现只有当选择个数为奇数时,该为才会为1,所以贡献为,所以贡献为
考虑如何还原原序列,可以发现,题目给定的限制是区间按位或的值。因为是按位或,所以二进制为0的位置,这区间的数二进制下该位置一定都为0。
于是使这个数能为1的地方都为1,随便拿个什么东西来维护就行了,例如:线段树,对每一位差分数组....
时间复杂度
但是,发现答案式子那么只要第位,个数不全是0,那么都是必定有贡献的,所以将每个按位或和按位或起来,得到的就等于
时间复杂度
#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 200000 + 5;
const int mod = 1e9 + 7;
int t,n,m,ans[MAX_N];
struct node{
int l,r,x;
}p[MAX_N];
namespace SegmentTree{
#define ls ((p)<<1)
#define rs ((p)<<1|1)
int lazy[MAX_N<<2];
void build(int p,int l,int r){
lazy[p]=(1<<30)-1;
if(l==r){
return;
}
int mid=l+r>>1;
build(ls,l,mid);
build(rs,mid+1,r);
}
void pushdown(int p,int l,int r){
if(lazy[p]==(1<<30)-1) return;
lazy[ls]&=lazy[p];
lazy[rs]&=lazy[p];
lazy[p]=(1<<30)-1;
}
void modify(int p,int l,int r,int L,int R,int x){
if(L<=l && r<=R){
lazy[p]&=x;
return;
}
pushdown(p,l,r);
int mid=l+r>>1;
if(L<=mid) modify(ls,l,mid,L,R,x);
if(mid<R) modify(rs,mid+1,r,L,R,x);
}
int query(int p,int l,int r,int x){
if(l==r){
return lazy[p];
}
pushdown(p,l,r);
int mid=l+r>>1;
if(x<=mid) return query(ls,l,mid,x);
else return query(rs,mid+1,r,x);
}
}
inline void add(int &x,int y){
x+=y;
if(x>=mod) x-=mod;
}
int x[MAX_N];
int ksm(int x,int y){
int res=1;
while(y){
if(y&1) res=1ll*res*x%mod;
x=1ll*x*x%mod;
y>>=1;
}
return res;
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) ans[i]=(1<<30)-1;
SegmentTree::build(1,1,n);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&p[i].l,&p[i].r,&p[i].x);
SegmentTree::modify(1,1,n,p[i].l,p[i].r,p[i].x);
}
for(int i=1;i<=n;i++) ans[i]=SegmentTree::query(1,1,n,i);
int cnt[2];
int Ans=0;
for(int k=0;k<30;k++){
cnt[0]=cnt[1]=0;
int tmp=0;
for(int i=1;i<=n;i++){
cnt[(ans[i]>>k)&1]++;
}
if(cnt[1]) add(Ans,1ll*ksm(2,cnt[0])*ksm(2,cnt[1]-1)%mod*(1<<k)%mod);
}
// add(Ans,Ans);
printf("%d\n",Ans);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现