[CSP-S模拟测试96]题解
以后不能再借没改完题的理由不写题解了……
A.求和
求$\sum \sum i+j-1$
柿子就不化了吧……这年头pj都不考这么弱智的公式化简了……
坑点1:模数不定,可能没有2的逆元,那么只要先把乘数里的2去掉就好了。
坑点2:1e18炸long long $\rightarrow$ 慢速乘即可
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
typedef long long ll;
ll x,y,xx,yy,mod;
ll mul(ll a,ll b)
{
ll res=0;
while(b)
{
if(b&1)res+=a,res%=mod;
a=(a+a)%mod;
b>>=1;
}
return res;
}
vector<ll> fac;
#define F
int main()
{
#ifdef F
freopen("sum.in","r",stdin);
freopen("sum.out","w",stdout);
#endif
/*mod=1e9+7;
cout<<mul(100000,3)<<endl;*/
scanf("%lld%lld%lld%lld%lld",&x,&y,&xx,&yy,&mod);
int cnt=1;
fac.push_back(x+xx);
fac.push_back(xx-x+1);
fac.push_back(yy-y+1);
for(int i=0;i<3;i++)
if(cnt&&fac[i]%2==0)fac[i]/=2,cnt--;
ll ans=1;
for(int i=0;i<3;i++)
ans=mul(ans,fac[i]);
fac.clear();cnt=1;
fac.push_back(y+yy);
fac.push_back(xx-x+1);
fac.push_back(yy-y+1);
for(int i=0;i<3;i++)
if(cnt&&fac[i]%2==0)fac[i]/=2,cnt--;
ll res=1;
for(int i=0;i<3;i++) res=mul(res,fac[i]);
(ans+=res)%=mod;
ans-=mul(xx-x+1,yy-y+1)%mod;
(ans+=mod)%=mod;
printf("%lld\n",ans);
/*ans=(x+xx)*(xx-x+1)%mod*(yy-y+1)%mod*inv%mod;
ans+=(xx-x+1)*(y+yy)%mod*(yy-y+1)%mod*inv%mod;ans%=mod;
ans-=(xx-x+1)*(yy-y+1)%mod;ans=(ans+mod)%mod;
printf("%lld\n",ans);*/
return 0;
}
B.分组配对
显然,最大 $\times$ 最大$+$ 第二大 $\times$ 第二大 $+...$的方式能使小组总值最大。
这里简单写一下证明,考虑只有两对的情况。
设它们为$a,b,a-x,b-y$,因为实力值为正整数所以必有$a>x,b>y$
那么按排名配对的总值为$ab\times 2 -ay-bx+xy$
交叉配对的为$ab \times 2 -ay-bx$
很显然前者大于后者。
所以只要贪心地往右扫,到不能加入组里时开新组就好了。
暴力的话每次都sort或二分查找肯定是不行的
由于往右扩展这个过程具有单调性,可以考虑二分
但check一次的代价也很大,需要设法减小二分范围
那么可以先倍增到一个不合法的位置,再以$1<<(p-1)$为左边界,$1<<p$为右边界进行二分
时间复杂度最劣为$O(n\ log^2 \ n)$。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
ll read()
{
ll 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;
}
const int N=5e5+5;
int n;
ll m;
ll a[N],b[N];
vector<ll> nowa,nowb;
bool check(int l,int r)
{
vector<ll> tmpa,tmpb;
swap(nowa,tmpa);swap(nowb,tmpb);
for(int i=l;i<=r;i++)
nowa.push_back(a[i]),nowb.push_back(b[i]);
sort(nowa.begin(),nowa.end());sort(nowb.begin(),nowb.end());
int sz=nowa.size();ll res=0;
for(int i=sz-1;i>=0;i--)
{
res+=nowa[i]*nowb[i];
if(res>m)return 0;
}
return 1;
}
int find(int x)
{
int p=0;
for(int i=0; ;i++)
{
p=i;
if(!check(x,min(x+(1<<i)-1,n)))break;
if(x+(1<<i)-1>=n)break;
}
int l=x+(1<<p-1)-1,r=min(x+(1<<p)-1,n),res=l;
while(l<=r)
{
int mid=l+r>>1;
if(check(x,mid))res=mid,l=mid+1;
else r=mid-1;
}
return res;
}
#define F
int main()
{
#ifdef F
freopen("pair.in","r",stdin);
freopen("pair.out","w",stdout);
#endif
n=read();m=read();
for(int i=1;i<=n;i++)
a[i]=read();
for(int i=1;i<=n;i++)
b[i]=read();
int ans=0;
int i=1;
while(i<=n)i=find(i)+1,ans++;
printf("%d\n",ans);
return 0;
}
/*
3 50
6 7 6
6 3 5
*/
C.城市游戏
咕
[CSP-S模拟测试96]题解的更多相关文章
- csp-s模拟测试96
csp-s模拟测试96 $T1$一眼慢速乘,$T2$稍证一手最优性尝试用神奇数据结构优化,无果,弃.$T3$暴力+信仰. 100 03:16:38 95 03:16:56 35 03:17:10 23 ...
- [考试反思]1031csp-s模拟测试96:常态
按照smily的说法这一场的大众分暴力分是不是265啊QwQ那我可真是个大垃圾 总算还是回归了常态. T3文件名写错,把“city.in”写成“city,in” 还好,只丢了20分. T2乱打$O(n ...
- CSP-S 模拟测试94题解
T1 yuuustu: 可以对两边取对数,然后就转化为两个double的比较,时间复杂度$O(n)$ 然后我就用神奇0.4骗分水过 #include<bits/stdc++.h> usin ...
- CSP-S模拟测试 88 题解
T1 queue: 考场写出dp柿子后觉得很斜率优化,然后因为理解错了题觉得斜率优化完全不可做,只打了暴力. 实际上他是可以乱序的,所以直接sort,正确性比较显然,贪心可证,然后就是个sb斜率优化d ...
- CSP-S 模拟测试92 题解
话说我怎么觉得我没咕多长时间啊,怎么就又落了20多场题解啊 T1 array: 根据题意不难列出二元一次方程,于是可以用exgcd求解,然而还有一个限制条件就是$abs(x)+abs(y)$最小,这好 ...
- CSP-S 模拟测试57题解
人生第一次A,B层一块考rank2,虽然说分差没几分,但还是值得纪念. 题解: T1 天空龙: 大神题,因为我从不写快读也没有写考场注释的习惯,所以不会做,全hzoi就kx会做,kx真大神级人物. T ...
- CSP-S 模拟测试 51 题解
考试过程: 惯例先看一遍三道题,T1 一开始反应要求割点,但是这是有向图,肯定不能求割点,康了一下数据范围,有40%是树的,还不错,决定待会在打. 看T2 字符串题,完了我字符串最弱了,肯定只能打暴力 ...
- CSP-S 模拟测试 45 题解
由于咕掉的题解太多了,所以只能趁改完不动题的时间,来补补坑qwq,还是太弱了. 考试过程: 到新机房的第一次考试,貌似海星? 第一题一开始就觉得是个贪心,但以为所有小怪兽都要打完,所以想复杂了,但后来 ...
- [CSP-S模拟测试97]题解
A.小盆友的游戏 感觉题解解释的很牵强啊……还是打表找规律比较靠谱 对于每个人,它构造了一个期望函数$f(x)$,设它的跟班个数为$cnt[x]$,那么令$f(x)=2^{cnt[x]}-1$(??鬼 ...
随机推荐
- python爬虫常用数据整理函数
text() 获取xpath中的值....../h1/text() extract()[0] Selector的方法用于提取内容为 ...
- 应用安全 - 代码审计 - Python
flask客户端session导致敏感信息泄露 flask验证码绕过漏洞 CodeIgniter 2.1.4 session伪造及对象注入漏洞 沙箱逃逸
- WPF资源字典的使用
1.在解决方案中添加资源字典:鼠标右键——添加——资源字典 2.在资源字典中写入你需要的样式,我这里简单的写了一个窗体的边框样式 3.在App.xaml中加入刚刚新建的资源字典就好了
- oracle--约束(主键、非空、检查)
问题1:学号重复了,数据还可以插入成功 使用主键约束:学号是唯一标识一条数据的,所以必须唯一且不能为空 ---(1).在确定为主键的字段后添加 primary key关键字 ---(2).在创建表的后 ...
- [Python3] 018 if:我终于从分支中走出来了
目录 0. 谁是主角 1. 从三大结构说起 (1) 顺序 (2) 分支 1) 分支的基本语法 2) 双向分支 3) 多路分支 (3) 循环 0. 谁是主角 分支是主角 我前面几篇随笔提到 if 不下2 ...
- [BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块)
[BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块) 题面 给定N, M,求\(1\leq x\leq N, 1\leq y\leq M\)且gcd(x, y)为质数的(x, y)有多少对. ...
- pip源地址
pip国内的一些镜像 阿里云 http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/si ...
- python的继承、重载和重写???
继承语法:<1>单继承:class(父类名)<2>多继承class(父类1,父类2,父类n...) 继承的特点:<1>减少代码量和灵活指定型类<2>子类 ...
- BUUCTF--findit
测试文件:https://buuoj.cn/files/7b8602971727c6c82ec0d360d5cad2c0/6a428ff2-25d7-403c-b28e-3f980a10a5a2.ap ...
- 用jquery制作的简单轮播图
我也是进入H5前端的小菜鸟一枚,最近才进入jquery的学习,所以打算对自己的学习进行记录. 今天分享的是一个简单的轮播图,这个轮播图的特效很简单,能够进行图片的轮播以及点击相应图片,图片能够跳转到相 ...