2019-11-11
T1
一道。。。很水的题。。感觉是个人都会做吧QAQ 随便upper_bound 一下就好了
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn=300000;
const int inf=1e9;
int read(){int x=0,f=1;char ch=getchar();while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
int n,a[maxn+10],limit;
long long ans=0;
int main(){freopen("dwar.in","r",stdin);freopen("dwar.out","w",stdout);n=read();limit=read();for(int i=1;i<=n;i++) a[i]=read();sort(a+1,a+1+n);a[++n]=inf;for(int i=1,pos;i<=n-1;i++){if(limit>=a[i]*2){pos=upper_bound(a+i,a+1+n,limit-a[i])-a;if(pos>i){ans=ans+(long long)pos-(long long)i-1;}}}printf("%lld",ans);
}
T2
这道题不太适合我这种推结论很弱的人。其实就算我会推结论,我也算不来组合数QAQ
首先讲一下70pts70pts70pts的算法 这个数据显然可以o(n2)o(n^2)o(n2)过 因此考虑二维dpdpdp 用dpi,jdp_{i,j}dpi,j表示当前到了第iii位,并且包括当前位(当前位必选)总共已经选了jjj个数了。 显然只有当i≡j(mod2)i≡j(mod2)i≡j(mod2)时,dpi,jdp_{i,j}dpi,j 才会有值
通过仔细的思考 发现dp[i][j]=∑k=0i>2kdp[i−2k−1][j−1]dp[i][j]=\sum_{k=0}^{i>2k}dp[i-2k-1][j-1]dp[i][j]=∑k=0i>2kdp[i−2k−1][j−1] 然而这需要三个forforfor循环,会挂。然后又惊奇的发现dp[i−2][j]=∑k=0i−2>2kdp[i−2k−3][j−1]dp[i-2][j]=\sum_{k=0}^{i-2>2k}dp[i-2k-3][j-1]dp[i−2][j]=∑k=0i−2>2kdp[i−2k−3][j−1] 因此dp[i][j]=dp[i−1][j−1]+dp[i−2][j]dp[i][j]=dp[i-1][j-1]+dp[i-2][j]dp[i][j]=dp[i−1][j−1]+dp[i−2][j]
这样就可以得70pts70pts70pts
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn=2010;
const int mod=998244353;
int read(){int x=0,f=1;char ch=getchar();while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
int dp[maxn][maxn],n,m,t,ans;
int main(){freopen("temple.in","r",stdin);freopen("temple.out","w",stdout);for(int i=0;i<=2000;i++)dp[i][0]=1;dp[1][1]=1;for(int i=2;i<=2000;i++){for(int j=1;j<=i;j++){if(j%2==i%2){dp[i][j]=(dp[i-1][j-1]+dp[i-2][j])%mod;}else{dp[i][j]=0;}}}t=read();while(t--){n=read();m=read();if(n%2==m%2)ans=dp[n][m];else ans=dp[n-1][m];printf("%d\n",(ans%mod+mod)%mod);}
}
现在是满分算法: 用出题人的思路来说就是 显然ai+ia_i+iai+i一定为偶数。1<=ai+i<=n+m1<=a_i+i<=n+m1<=ai+i<=n+m 就相当于在[1,n+m][1,n+m][1,n+m]里面选m个偶数 ?? 所以说这个ai+ia_i+iai+i 是怎么想到的QAQ
然后就相当于答案就是(⌊n+m2⌋m)\displaystyle\binom {\lfloor \frac {n+m}{2}\rfloor}{m}(m⌊2n+m⌋) 令 x=⌊n+m2⌋,y=m\displaystyle x=\lfloor \frac {n+m}{2}\rfloor,y=mx=⌊2n+m⌋,y=m 即为x!y!(x−y)!%mod\displaystyle \frac{x!}{y!(x-y)!}\% mody!(x−y)!x!%mod 除一个数等于乘上他的逆元,这里相当于求y!,(x−y)!y!,(x-y)!y!,(x−y)! 的逆元 然后大致就可以做了。。。吗?
这道题有多个询问,每一次都求逆元显然亲妈爆炸,所以我们考虑预处理。。线性求逆元QAQ
a∗a−1≡b∗b−1(modp)a*a^{-1}≡b*b^{-1}(mod p)a∗a−1≡b∗b−1(modp) 移项得到a−1≡b−1∗(ba)a^{-1}≡b^{-1}*(\frac {b}{a})a−1≡b−1∗(ab) 在这道题中,若b=i!,a=(i−1)!b=i!,a=(i-1)!b=i!,a=(i−1)! 那么(i−1)!−1=i!−1∗i(i-1)!^{-1}=i!^{-1}*i(i−1)!−1=i!−1∗i 然后将1e6!−11e6!^{-1}1e6!−1用费马小定理随便乱搞一下就好了。
另外注意:线性求逆元显然不是这样推导的,因为关于如果a,ba,ba,b不整除,我这种推导就GG了,线性求逆元的正确推导是这样的:
设a÷b=q……ra÷b=q……ra÷b=q……r
q⋅b+r≡0(moda)q⋅b+r≡0(moda)q⋅b+r≡0(moda) 左右同时乘上b−1⋅r−1b^{-1}\cdot r^{-1}b−1⋅r−1
q⋅r−1+b−1≡0(moda)q⋅r^{−1}+b^{−1}≡0(moda)q⋅r−1+b−1≡0(moda)
b−1≡−q⋅r−1(moda)b^{-1}≡−q⋅r{−1}(moda)b−1≡−q⋅r−1(moda)
b−1≡−⌊ab⌋⋅(amodb)−1(moda)b^{−1}≡−⌊\frac a b⌋⋅(amodb)^{−1}(moda)b−1≡−⌊ba⌋⋅(amodb)−1(moda)
b−1≡a−⌊ab⌋⋅(amodb)−1(moda)b^{−1}≡a-⌊\frac a b⌋⋅(amodb)^{−1}(moda)b−1≡a−⌊ba⌋⋅(amodb)−1(moda)
。。显然这个推导在这道题中也是对的 但是好像用之前的那个式子更方便吧
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define LL long long
using namespace std;
const int maxn=1e6;
const int mod=998244353;
int read(){int x=0,f=1;char ch=getchar();while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
int factorial[maxn+10],inv[maxn+10],t;
LL ksm(int x,int y){LL sum=1;while(y){if(y&1) sum=(long long)sum*x%mod;y>>=1;x=(long long)x*(long long)x%mod;}return sum%mod;
}
void prepare_work(int x){factorial[0]=1;for(int i=1;i<=maxn;i++) factorial[i]=(long long)factorial[i-1]*i%mod;inv[maxn]=(int)ksm(factorial[maxn],mod-2);for(int i=maxn-1;i>=0;i--){inv[i]=(long long)inv[i+1]*(i+1)%mod;}
}
int n,m;
long long C(int x,int y){return (long long)factorial[y]*inv[x]%mod*inv[y-x]%mod;
}
int main(){prepare_work(maxn);t=read();while(t--){n=read();m=read();printf("%lld\n",C(m,(n+m)/2));}return 0;
}
T3
我们令询问[x,y][x,y][x,y]为询问区间,当前节点[l,r][l,r][l,r]为当前区间 那么总共分为四种情况:
1.当前区间完全包含询问区间:显然询问区间的所有子区间都对当前区间有贡献
2.当前区间与询问区间真相交:应该也很好算,用等差数列求和公式就可以算了,在代码里面应该很明了
3.询问区间完全包含当前区间:等下讨论
4.询问区间与当前区间交集为空:没有贡献
那么现在来讨论第三种情况:
这个考虑预处理,不然会遍历到线段树底部(即有可能退化成O(n2)O(n^2)O(n2) )
对于当前节点,它对答案的贡献有两种:它作为经过节点;它作为终止节点
如果它作为经过节点,那么它的贡献为:当前区间与询问区间相交,并且询问区间不包含当前区间。
那么其贡献用可爱的小手写出来的话就是:(r−l)⋅(l−ql+r−qr)+(r−l+1)⋅(r−l+2)2(r-l)\cdot(l-ql+r-qr)+\frac {(r-l+1)\cdot(r-l+2)}{2}(r−l)⋅(l−ql+r−qr)+2(r−l+1)⋅(r−l+2)
如果它作为终止节点,那么它的贡献为:完全包含当前区间的区间数量−-−完全包含其父亲区间的区间数量
如果我们将叶节点打上+1+1+1标记,其他的全部打上−1-1−1标记,稍微容斥一下就可以发现其子树的系数和就是当前节点以及子树所有节点的总贡献的系数。
大概就是这样吧QAQ
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define int long long
using namespace std;
const int maxn=1000;
int read(){int x=0,f=1;char ch=getchar();while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
int kx[maxn<<2],ky[maxn<<2],kxy[maxn<<2],b[maxn<<2];
int n,q,opt,lastans;
void build(int node,int l,int r){if(l==r){kx[node]+=r-1;ky[node]+=l+1;kxy[node]--;b[node]=(l-r+1-l*r);return ;}kx[node]-=(r-1);ky[node]-=(l+1);kxy[node]+=1;b[node]-=(l-r+1-l*r);kx[node]+=(l-r);ky[node]+=(r-l);b[node]+=(r-l+1)*(r-l+2)/2-1;b[node]+=(2*r*l-l*l-r*r);int mid=l+r>>1;build(node<<1,l,mid);build(node<<1|1,mid+1,r);kx[node]+=kx[node<<1]+kx[node<<1|1];ky[node]+=ky[node<<1]+ky[node<<1|1];kxy[node]+=kxy[node<<1]+kxy[node<<1|1];b[node]+=b[node<<1]+b[node<<1|1];
}
int query(int node,int l,int r,int ql,int qr){if(ql<=l && r<=qr){int ans=0;ans+=kx[node]*ql;ans+=ky[node]*qr;ans+=kxy[node]*ql*qr;ans+=b[node];return ans;} if(l<=ql && qr<=r){int mid=l+r>>1,ans=0;ans=(qr-ql+1)*(qr-ql+2)/2;if(ql<=mid) ans+=query(node<<1,l,mid,ql,qr);if(mid<qr) ans+=query(node<<1|1,mid+1,r,ql,qr);return ans;}int ans=0,mid=l+r>>1;if(ql<l) ans+=(qr-ql+1+l-ql+1)*(qr-l+1)/2;if(r<qr) ans+=(qr-ql+1+qr-r+1)*(r-ql+1)/2;if(ql<=mid) ans+=query(node<<1,l,mid,ql,qr);if(mid<qr) ans+=query(node<<1|1,mid+1,r,ql,qr);return ans;
}
signed main(){n=read();q=read();opt=read();build(1,1,n);for(int i=1,x,y;i<=q;i++){x=read();y=read();x=(x^(lastans*opt))%n+1;y=(y^(lastans*opt))%n+1;if(x>y) swap(x,y);lastans=query(1,1,n,x,y);printf("%lld\n",lastans);}return 0;
}
2019-11-11相关推荐
- Visual Studio 2022 Preview 3和2019 16.11发布
Visual Studio 2022 Preview 3 主要特点 个人和团队生产力 附加到进程改进 新项目设计器 黑暗主题提升 开发现代应用 远程测试 新的JavaScript和TypeScript ...
- VS 2019 16.11正式发布 | 新功能(Hot Reload 热重载)试用
VS 2019 16.11 VS 2019 16.11已于2021.8.10正式发布.(https://devblogs.microsoft.com/visualstudio/visual-studi ...
- 2019双11,支付宝有哪些“秘密武器”?
2019双11,支付宝参战的第十一年. 与十一年前相比,双11的许多东西都改变了.比如金额--2684亿,差不多是十一年前的5000倍:比如流量--订单峰值54.4万笔/秒,曾经是想都不敢想的数字:再 ...
- 2019年11月数据库流行度排行:前三甲大幅下跌 PM 应云而升 国产续领风云
2019年11月数据库流行度排行出炉,在积分榜单上,前 3 位的 Oracle.MySQL 和 Microsoft SQL Server 环比都出现了大幅下跌,其中 Oracle 数据库下跌 19.8 ...
- 【报告分享】2019双11洞察报告资料包(含6大权威报告下载链接)
今天给大家分享一份2019双11数据洞察报告资料包,包含6份报告,分别从不同角度解读并分析2019年双11的数据及趋势,希望对您有所启发. 文末附报告下载链接. 6份报告如下: 1.<天 ...
- 2019双11猫晚直播技术详解(附演讲PDF)
下载演讲PDF版 链接可能被微信屏蔽, 请使用钉钉/支付宝扫码,或复制到浏览器中 本文为阿里文娱技术专家泫野在[阿里文娱2019双11猫晚技术沙龙]中的演讲,主要内容为双11猫晚直播的技术挑战.破解策 ...
- 训练日记2019.11.11 莫队求区间众数
2019.11.11 星期一 终于又是一个周一了,好累啊感觉,今天起了个大早去抢课,结果就不提了,重在参与,算法排进waitlist里了,希望能上,我觉得需要担负起一个作为队长的责任,像莫涛队长那样的 ...
- 每日启程——2019.12.11日(草木有本心,何求美人折)
每日启程--2019.12.11日(草木有本心,何求美人折) 今天是我写每日启程的第二天.起床的时候还算比较精神,不过到了实验室还是有点困意的.怎么说了有一丝丝的疲倦和懒惰.但这也是人之常情克服一下就 ...
- 金山办公 服务端开发岗位 面经 2019.11.11(秋招)
面试形式:电话面试 一面 2019.11.11 10:00 23min(通过) 1.自我介绍 2.面向对象的理解,继承封装多态,重写重载 3.定义一个类,可以把对象作为hashmap的key值吗?对这 ...
- 2019年11月20日笔记
2019年11月20日笔记 DIP PhotoShop 数字图像处理用途 AI设计原理 编程 哲学 编程工具 DIP DIP全称Digital Image Processing(数字图像处理) 每张图 ...
最新文章
- 使用Kiwi CatTools 实现交换机自动备份
- Docker学习总结(6)——通过 Docker 化一个博客网站来开启我们的 Docker 之旅
- 【Eclipse】将控制台输出直接保存到文本文件
- js 嵌入php_PHP快速入门第一讲:什么是PHP
- 智能家居 (1) ——智能家居整体功能框架
- Makefile 7——自动生成依赖关系 三颗星
- 北邮计算机机试的编译器,北邮2018计算机院考研复试机试上机题解+结果统计
- MFC框架类、文档类、视图类相互访问的方法
- 【VBA】用excel玩游戏,俄罗斯方块
- 安卓系统添加字体库和修改系统默认的字体
- java 修改exif_java – 操作图像而不删除其EXIF数据
- 华为设备配置SEP多实例
- k8s设计-多容器pod设计模式
- 完美解决Windows 7更新失败(Windows Update 错误 80070003)
- 计算机 就业率低,大学里“最坑人”的4个专业,热门只是假象,实则就业率很低...
- 开始写博客之学习编程的重要性
- C语言程序找零问题怎么运行,C语言找零问题
- Android SystemUI相关定制(一)
- 虚拟号的运营商一般是哪家的?你知道吗?
- Pyomo/python_02 微分代数方程定义
热门文章
- Springboot+采用协同过滤算法的家政服务平台的设计与实现 毕业设计-附源码260839
- unity实现炮弹运动轨迹(抛物线)
- 如何以正确地姿势AK SQL查询50题(精华篇)
- fedora 20 安裝 及 配置桌面環境
- 程序员如何培养第二技能?
- bzoj3470 Freda's Walk (期望概率DP)
- python numpy读取数据_python机器学习(七)数据分析利器,NumPy,pandas与Matplotlib
- 南大通用GBase XDM支持的操作平台
- 【vscode】常用快捷键
- Scratch 与C语言实现数据结构静态链表的建立及操作