也许是最后一篇了。

A.最大或

不错的签到题。

对于二进制位来说,高位的一个1比低位的所有1的贡献总和还要大。

显然,$r$必选,因为$r$中所有1的相对考前。那么考虑如何构造另一个数。

首先$l$和$r$前几位相同的部分肯定是不能动的,所以从$l,r$不同那位开始贪心即可。如果$r$这位为0,只要构造的这个数爆不了$r$就让它的这位为1。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
int T;
ll l,r;
void work()
{
scanf("%lld%lld",&l,&r);
ll res=0;bool ok=0;
for(int i=62;i>=0;i--)
{
int now=(r>>i)&1LL,nowl=(l>>i)&1LL;
if(now!=nowl)ok=1;
//cout<<i<<' '<<now<<' '<<nowl<<' '<<ok<<endl;
if(!now)
if((res|(1LL<<i))<=r&&ok)res|=1LL<<i;
}
printf("%lld\n",r|res);
}
int main()
{
freopen("maxor.in","r",stdin);
freopen("maxor.out","w",stdout);
scanf("%d",&T);
while(T--)work();
return 0;
}

B.答题

题意可以转化为:求用所给的$n$个数组成的$2^n$个数中的第$k$大值,$k=ceil(2^n \times p)$。

然后就是裸的折半搜索了。分别搜出前一半和后一半的子集和,然后二分答案。

之后考虑如何求 从两组数里各取一个数,且令取出的两数和$\ge$二分值的数对的个数。

先把两组数排序,然后枚举第一组选到哪个,第二组维护一个倒着扫的单调指针即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,a[45],n1,n2,sz1,sz2;
double p;
ll kth;
vector<int>s1,s2;
void dfs(int x,int tot,int op)
{
if(!op&&x>n1)
{ s1.push_back(tot);
return ;
}
if(op&&x>n)
{
s2.push_back(tot);
return ;
}
dfs(x+1,tot,op);
dfs(x+1,tot+a[x],op);
}
bool check(int val)
{
ll res=0;int j=sz2;
for(int i=0;i<sz1;i++)
{
res+=sz2-j;
while(j>0&&s2[j-1]+s1[i]>=val)j--,res++;
}
return res>=kth;
}
#define F
int main()
{
#ifdef F
freopen("answer.in","r",stdin);
freopen("answer.out","w",stdout);
#endif
scanf("%d%lf",&n,&p);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
kth=(1LL<<n)-ceil(1.0*(1LL<<n)*p)+1;
n1=n/2;
dfs(1,0,0);dfs(n1+1,0,1);
sz1=s1.size();sz2=s2.size();
sort(s1.begin(),s1.end());
sort(s2.begin(),s2.end());
int l=0,r=1e9,ans;
while(l<=r)
{
int mid=l+r>>1;
if(check(mid))ans=mid,l=mid+1;
else r=mid-1;
}
cout<<ans<<endl;
return 0;
}

C.联合权值·改

其实正解挺神的……但是它w范围这么小 不用白不用啊。

直接开桶维护每个联合权值的个数,然后利用bitset去除三元环的情况即可。

我没脸

#include<cstdio>
#include<iostream>
#include<cstring>
#include<bitset>
using namespace std;
#define pa pair<int,int>
#define re register
inline int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
typedef long long ll;
const int N=3e4+5;
int n,m,t;
int to[N<<1],head[N],nxt[N<<1],tot,ansm;
pa p[N<<1];
bitset<N> s[N];
ll w[N],anss,bu[N>>1],cnt[N>>1];
inline void add(re int x,re int y)
{
to[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
inline void print()
{
if(t!=2)printf("%d\n",ansm);
else puts("0");
if(t!=1)printf("%lld\n",anss);
else puts("0");
}
#define F
int main()
{
#ifdef F
freopen("link.in","r",stdin);
freopen("link.out","w",stdout);
#endif
n=read();m=read();t=read();
for(re int i=1;i<=m;i++)
{
int x=read(),y=read();
p[i]=make_pair(x,y);
add(x,y);add(y,x);s[x][y]=1;s[y][x]=1;
}
for(re int i=1;i<=n;i++)
w[i]=read();
for(re int x=1;x<=n;x++)
{
memset(bu,0,sizeof(bu));
for(re int i=head[x];i;i=nxt[i])
{
int y=to[i];
for(int k=1;k<=100;k++)
cnt[w[y]*k]+=bu[k];
bu[w[y]]++;
}
}
for(int i=1;i<=m;i++)
{
int now=(s[p[i].first]&s[p[i].second]).count();//cout<<i<<' '<<now<<endl;
cnt[w[p[i].first]*w[p[i].second]]-=now;
}
for(int i=1;i<=10000;i++)
anss+=1LL*i*cnt[i],ansm=max(ansm,cnt[i]?i:0);
anss*=2;
print();
return 0;
}

[CSP-S模拟测试110]题解的更多相关文章

  1. CSP-S 模拟测试94题解

    T1 yuuustu: 可以对两边取对数,然后就转化为两个double的比较,时间复杂度$O(n)$ 然后我就用神奇0.4骗分水过 #include<bits/stdc++.h> usin ...

  2. CSP-S模拟测试 88 题解

    T1 queue: 考场写出dp柿子后觉得很斜率优化,然后因为理解错了题觉得斜率优化完全不可做,只打了暴力. 实际上他是可以乱序的,所以直接sort,正确性比较显然,贪心可证,然后就是个sb斜率优化d ...

  3. CSP-S 模拟测试92 题解

    话说我怎么觉得我没咕多长时间啊,怎么就又落了20多场题解啊 T1 array: 根据题意不难列出二元一次方程,于是可以用exgcd求解,然而还有一个限制条件就是$abs(x)+abs(y)$最小,这好 ...

  4. CSP-S 模拟测试57题解

    人生第一次A,B层一块考rank2,虽然说分差没几分,但还是值得纪念. 题解: T1 天空龙: 大神题,因为我从不写快读也没有写考场注释的习惯,所以不会做,全hzoi就kx会做,kx真大神级人物. T ...

  5. CSP-S 模拟测试 51 题解

    考试过程: 惯例先看一遍三道题,T1 一开始反应要求割点,但是这是有向图,肯定不能求割点,康了一下数据范围,有40%是树的,还不错,决定待会在打. 看T2 字符串题,完了我字符串最弱了,肯定只能打暴力 ...

  6. CSP-S 模拟测试 45 题解

    由于咕掉的题解太多了,所以只能趁改完不动题的时间,来补补坑qwq,还是太弱了. 考试过程: 到新机房的第一次考试,貌似海星? 第一题一开始就觉得是个贪心,但以为所有小怪兽都要打完,所以想复杂了,但后来 ...

  7. [CSP-S模拟测试97]题解

    A.小盆友的游戏 感觉题解解释的很牵强啊……还是打表找规律比较靠谱 对于每个人,它构造了一个期望函数$f(x)$,设它的跟班个数为$cnt[x]$,那么令$f(x)=2^{cnt[x]}-1$(??鬼 ...

  8. [CSP-S模拟测试96]题解

    以后不能再借没改完题的理由不写题解了…… A.求和 求$\sum \sum i+j-1$ 柿子就不化了吧……这年头pj都不考这么弱智的公式化简了…… 坑点1:模数不定,可能没有2的逆元,那么只要先把乘 ...

  9. [CSP-S模拟测试92]题解

    A.数列 显然每个数的答案是互相独立的,直接扩欧求解.我们需要最小化$ax+by=gcd(a,b)$中的$|x|+|y|$,而显然当x或y靠近0时答案可能最优,列个不等式求一下即可. 能$O(1)$千 ...

随机推荐

  1. 解决sql语句中参数为空(null)不会更新参数的问题

    用的mybatis自动生成的 情景: 修改页面中,修改某个字段,修改前有数据,修改后为空. mybatis中一般用到 如:(这种直接忽略为空的字段,不能更新空字段参数) <update id=& ...

  2. 5款vue前端UI框架

    Vue.js是一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计. 实用的 Vue.js组件库可以帮助我们快速搭建页面,下面介绍小编认为比较受欢迎的五个vue ...

  3. C#打印单据

    HTML: <form id="form1">        <div id="t_border">            <!- ...

  4. python控制流-流程控制语句

    一.if语句 if 语句的子句(也就是紧跟 if 语句的语句块), 将在语句的条件为 True 时执行.如果条件为 False,子句将跳过. 在英文中,if 语句念起来可能是“:如果条件为真,执行子句 ...

  5. 将查询列表内容保存到excel表格中,并保存到相应的盘中

    1.先导入相应的jar包 2.一个小的Demo测试[实体类+测试类:保存excel的方法] Student实体类 public class Student{ private int id; priva ...

  6. Spring框架中AOP特性

    1.AOP介绍 即:面向切面编程,在不改变原有方法的定义与使用.也不改变原程序流程的情况下,可以改变原有方法的功能{增加一些附加的功能,在指定的地方添加其他函数方法:} 2.其他的方法:[需要的四个接 ...

  7. nodejs、npm、 typescript、angular-cli安装

    一.node.js环境安装 1.从Node.js官网下载对应平台的安装程序,进行安装,在Windows上安装时务必选择全部组件,包括勾选Add to Path. 2.安装完成后,打开window命令行 ...

  8. C#for(;;)是什么意思?

    一,正常for循环我们都接触过很多,如下,我们都理解 ,,,,, }; ; i < ; i++) { Console.WriteLine(tt[i]); } 二,但是for(;;)实际上它的含义 ...

  9. 模块学习笔记-IR2110/IR2130(上)

    引言 IR2110 / IR2113是高压,高速功率MOSFET和IGBT驱动器,具有独立的高端和低端参考输出通道.逻辑输入与标准CMOS或LSTTL输出兼容,低至3.3V逻辑.浮动通道可用于驱动高端 ...

  10. 【记录】解决windows中nginx明明退出了,为什么还能反向代理?CMD强制杀死进程命令

    博主今天遇到一个很奇怪的问题,nginx在windows中明明已经退出了,而且在任务管理器中也没发现nginx进程, 为什么还能反向代理呢? 找了半天资料终于解决,现记录如下,希望能帮助到你. 步骤一 ...