A.Race
题意:
小
红
和
小
明
赛
跑
,
速
度
分
别
为
v
1
,
v
2
,
如
果
小
明
在
某
个
整
数
秒
超
过
小
红
t
米
及
以
上
小红和小明赛跑,速度分别为v1,v2,如果小明在某个整数秒超过小红t米及以上
小红和小明赛跑,速度分别为v1,v2,如果小明在某个整数秒超过小红t米及以上
就
停
下
来
休
息
s
秒
,
赛
道
长
总
共
l
米
,
问
谁
会
赢
就停下来休息s秒,赛道长总共l米,问谁会赢
就停下来休息s秒,赛道长总共l米,问谁会赢
题解:
l
<
=
10000
,
并
且
l
是
v
1
,
v
2
的
公
倍
数
l<=10000,并且l是v1,v2的公倍数
l<=10000,并且l是v1,v2的公倍数
所
以
直
接
模
拟
每
秒
,
如
果
他
俩
距
离
大
于
等
于
t
所以直接模拟每秒,如果他俩距离大于等于t
所以直接模拟每秒,如果他俩距离大于等于t
就
让
小
明
停
止
就让小明停止
就让小明停止
看
他
俩
谁
先
到
终
点
或
者
同
时
到
达
看他俩谁先到终点或者同时到达
看他俩谁先到终点或者同时到达
AC代码
/*
Author:zzugzx
Lang:C++
Blog:blog.csdn.net/qq_43756519
*/
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '\n'
#define SZ(x) (int)x.size()
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e6+10;
const ll inf=0x3f3f3f3f;
const int dir[][2]={{0,1},{1,0},{0,-1},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int v1,v2,t,s,l;
cin>>v1>>v2>>t>>s>>l;
int sec=1,a=0,b=0,f=0;
while(1){
if(a-b>=t&&!f)f=s;
if(!f)a+=v1;
else f--;
b+=v2;
if(a==l||b==l)break;
sec++;
}
if(a==l&&b==l)cout<<"Tie "<<sec;
else if(a==l)cout<<"Ming "<<sec;
else cout<<"Hong "<<sec;
return 0;
}
B.Min Value
题意:
给
n
个
整
数
,
找
出
任
意
两
个
数
使
得
a
b
s
(
a
i
+
a
j
)
最
小
给n个整数,找出任意两个数使得abs(a_i+a_j)最小
给n个整数,找出任意两个数使得abs(ai+aj)最小
在
这
个
前
提
下
使
i
+
j
最
小
在这个前提下使i+j最小
在这个前提下使i+j最小
题解:
对
于
每
个
数
相
加
a
b
s
最
小
的
就
是
他
的
负
数
对于每个数相加abs最小的就是他的负数
对于每个数相加abs最小的就是他的负数
所
以
直
接
找
每
个
数
的
负
数
及
其
左
右
两
边
数
所以直接找每个数的负数及其左右两边数
所以直接找每个数的负数及其左右两边数
并
且
提
前
维
护
序
号
,
如
果
值
相
同
尽
量
找
到
小
的
i
+
j
并且提前维护序号,如果值相同尽量找到小的i+j
并且提前维护序号,如果值相同尽量找到小的i+j
AC代码
/*
Author:zzugzx
Lang:C++
Blog:blog.csdn.net/qq_43756519
*/
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '\n'
#define SZ(x) (int)x.size()
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e6+10;
const ll inf=0x3f3f3f3f;
const int dir[][2]={{0,1},{1,0},{0,-1},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
struct node{
int x,id;
bool operator <(const node &t)const{
return x<t.x;
}
}a[maxn];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i].x,a[i].id=i;
sort(a+1,a+1+n);
int ans1=inf,ans2;
for(int i=1;i<=n;i++){
int p=lower_bound(a+1,a+1+n,(node){-a[i].x,a[i].id})-a;
p=max(1,p);
if(p>1&&p-1!=i)
if(abs(a[i].x+a[p-1].x)<ans1)ans1=abs(a[i].x+a[p-1].x),ans2=a[i].id+a[p-1].id;
else if(abs(a[i].x+a[p-1].x)==ans1)ans2=min(ans2,a[i].id+a[p-1].id);
if(p!=i)
if(abs(a[i].x+a[p].x)<ans1)ans1=abs(a[i].x+a[p].x),ans2=a[i].id+a[p].id;
else if(abs(a[i].x+a[p].x)==ans1)ans2=min(ans2,a[i].id+a[p].id);
if(p+1<=n&&p+1!=i)
if(abs(a[i].x+a[p+1].x)<ans1)ans1=abs(a[i].x+a[p+1].x),ans2=a[i].id+a[p+1].id;
else if(abs(a[i].x+a[p+1].x)==ans1)ans2=min(ans2,a[i].id+a[p+1].id);
}
cout<<ans1<<' '<<ans2;
return 0;
}
C. Coronavirus
题意:
n
∗
m
的
图
中
有
高
危
路
段
,
用
∗
表
示
n*m的图中有高危路段,用*表示
n∗m的图中有高危路段,用∗表示
每
个
以
高
危
路
段
为
中
心
的
九
宫
格
都
不
能
走
每个以高危路段为中心的九宫格都不能走
每个以高危路段为中心的九宫格都不能走
问
从
S
到
E
最
少
需
要
多
少
步
或
者
确
定
不
能
到
达
问从S到E最少需要多少步或者确定不能到达
问从S到E最少需要多少步或者确定不能到达
题解:
先
对
不
能
走
的
路
进
行
标
记
先对不能走的路进行标记
先对不能走的路进行标记
枚
举
整
个
图
如
果
遇
到
星
号
之
间
对
周
围
的
九
宫
格
进
行
标
记
枚举整个图如果遇到星号之间对周围的九宫格进行标记
枚举整个图如果遇到星号之间对周围的九宫格进行标记
然
后
直
接
b
f
s
,
队
列
中
维
护
坐
标
和
步
数
然后直接bfs,队列中维护坐标和步数
然后直接bfs,队列中维护坐标和步数
如
果
坐
标
对
应
的
是
终
点
输
出
步
数
,
否
则
最
后
输
出
不
能
到
达
如果坐标对应的是终点输出步数,否则最后输出不能到达
如果坐标对应的是终点输出步数,否则最后输出不能到达
AC代码
/*
Author:zzugzx
Lang:C++
Blog:blog.csdn.net/qq_43756519
*/
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '\n'
#define SZ(x) (int)x.size()
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e6+10;
const ll inf=0x3f3f3f3f;
const int dir[][2]={{0,1},{1,0},{0,-1},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
char g[100][100];
bool vis[100][100];
struct node{
int x,y,s;
};
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n,m;
cin>>n>>m;
int sx,sy;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>g[i][j];
if(g[i][j]=='S')sx=i,sy=j;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(g[i][j]=='*'){
vis[i][j]=1;
for(int k=0;k<8;k++){
int dx=i+dir[k][0];
int dy=j+dir[k][1];
if(dx<1||dx>n||dy<1||dy>m)continue;
if(g[dx][dy]=='E'){cout<<"Impossible";return 0;}
vis[dx][dy]=1;
}
}
queue<node> q;
q.push((node){sx,sy,0});vis[sx][sy]=1;
while(!q.empty()){
node p=q.front();
q.pop();
if(g[p.x][p.y]=='E'){cout<<p.s;return 0;}
for(int i=0;i<4;i++){
int dx=p.x+dir[i][0];
int dy=p.y+dir[i][1];
if(dx<1||dx>n||dy<1||dy>m||vis[dx][dy])continue;
vis[dx][dy]=1;
q.push((node){dx,dy,p.s+1});
}
}
cout<<"Impossible";
return 0;
}
D. Array
题意:
一
个
数
组
全
部
异
或
的
值
为
x
,
全
部
相
加
为
y
一个数组全部异或的值为x,全部相加为y
一个数组全部异或的值为x,全部相加为y
问
数
组
最
短
长
度
是
多
少
问数组最短长度是多少
问数组最短长度是多少
题解:
原
题
的
简
化
版
c
o
d
e
f
o
r
c
e
s
r
o
u
n
d
628
D
原题的简化版 codeforces~round~628 D
原题的简化版codeforces round 628D
本场题解连接
链
接
里
的
d
题
有
详
细
题
解
链接里的d题有详细题解
链接里的d题有详细题解
AC代码
/*
Author:zzugzx
Lang:C++
Blog:blog.csdn.net/qq_43756519
*/
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '\n'
#define SZ(x) (int)x.size()
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e6+10;
const ll inf=0x3f3f3f3f;
const int dir[][2]={{0,1},{1,0},{0,-1},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
ll u,v;
while(cin>>u>>v){
if(v-u<0||(v-u)%2){cout<<-1<<endl;continue;}
ll d=v-u;
if(!d){
if(!u)cout<<0;
else cout<<1;
}
else{
ll t=d/2;
if((t&u)==0)cout<<2;
else cout<<3;
}
cout<<endl;
}
return 0;
}
G.XOR
题意:
已
知
n
,
从
1
到
n
中
选
任
意
两
个
数
异
或
已知n,从1到n中选任意两个数异或
已知n,从1到n中选任意两个数异或
这
个
异
或
的
最
大
值
为
多
少
这个异或的最大值为多少
这个异或的最大值为多少
题解:
最
大
值
很
明
显
尽
量
是
让
每
个
数
都
为
1
最大值很明显尽量是让每个数都为1
最大值很明显尽量是让每个数都为1
那
么
比
如
n
的
二
进
制
位
101010100
那么比如n的二进制位101010100
那么比如n的二进制位101010100
那
肯
定
是
拿
100000000
和
1111111
异
或
那肯定是拿100000000和1111111异或
那肯定是拿100000000和1111111异或
最
后
全
部
为
1
就
是
结
果
最后全部为1就是结果
最后全部为1就是结果
AC代码
/*
Author:zzugzx
Lang:C++
Blog:blog.csdn.net/qq_43756519
*/
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '\n'
#define SZ(x) (int)x.size()
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e6+10;
const ll inf=0x3f3f3f3f;
const int dir[][2]={{0,1},{1,0},{0,-1},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
ll n;
cin>>n;
if(n==1){cout<<0;return 0;}
ll ans=0,cnt=0;
while(n)ans+=(1ll<<cnt),cnt++,n>>=1;
cout<<ans;
return 0;
}
H.Maze
题意:
n
∗
m
的
图
,
图
中
包
含
+
或
者
−
n*m的图,图中包含+或者-
n∗m的图,图中包含+或者−
每
个
点
能
往
四
个
方
向
和
自
己
符
号
不
同
的
位
置
走
每个点能往四个方向和自己符号不同的位置走
每个点能往四个方向和自己符号不同的位置走
q
次
询
问
,
问
从
某
个
点
开
始
最
多
能
走
向
多
少
个
不
同
点
q次询问,问从某个点开始最多能走向多少个不同点
q次询问,问从某个点开始最多能走向多少个不同点
题解:
只
要
符
号
不
同
就
可
以
走
只要符号不同就可以走
只要符号不同就可以走
并
且
不
限
制
来
回
,
可
以
走
过
去
的
点
也
可
以
回
来
并且不限制来回,可以走过去的点也可以回来
并且不限制来回,可以走过去的点也可以回来
所
以
完
全
可
以
对
每
个
直
接
b
f
s
所以完全可以对每个直接bfs
所以完全可以对每个直接bfs
但
是
为
了
防
止
超
时
,
所
以
考
虑
用
并
查
集
但是为了防止超时,所以考虑用并查集
但是为了防止超时,所以考虑用并查集
相
邻
不
同
点
在
一
个
集
合
,
只
要
是
一
个
集
合
里
的
点
都
可
以
到
达
相邻不同点在一个集合,只要是一个集合里的点都可以到达
相邻不同点在一个集合,只要是一个集合里的点都可以到达
所
以
只
要
查
询
每
个
点
所
在
集
合
有
多
少
点
就
是
答
案
所以只要查询每个点所在集合有多少点就是答案
所以只要查询每个点所在集合有多少点就是答案
AC代码
/*
Author:zzugzx
Lang:C++
Blog:blog.csdn.net/qq_43756519
*/
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '\n'
#define SZ(x) (int)x.size()
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e6+10;
const ll inf=0x3f3f3f3f;
const int dir[][2]={{0,1},{1,0},{0,-1},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
int n,m;
char g[3010][3010];
int fa[10000010],sz[10000010];
int find(int x){
if(fa[x]==x)return x;
return fa[x]=find(fa[x]);
}
int id(int i,int j){
return (i-1)*m+j;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int q;
cin>>n>>m>>q;
for(int i=1;i<=n*m;i++)fa[i]=i;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>g[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=0;k<4;k++){
int dx=i+dir[k][0];
int dy=j+dir[k][1];
if(dx<1||dx>n||dy<1||dy>m||g[dx][dy]==g[i][j])continue;
fa[find(id(i,j))]=find(id(dx,dy));
}
for(int i=1;i<=n*m;i++)sz[find(i)]++;
for(int i=1;i<=n*m;i++)sz[i]=sz[find(i)];
while(q--){
int x,y;
cin>>x>>y;
cout<<sz[id(x,y)]<<endl;
}
return 0;
}
I.Prime
题意:
q
次
询
问
,
每
次
询
问
l
到
r
中
有
多
少
个
素
数
q次询问,每次询问l到r中有多少个素数
q次询问,每次询问l到r中有多少个素数
题解:
l
,
r
<
=
1
e
7
l,r<=1e7
l,r<=1e7
所
以
不
能
每
次
暴
力
查
询
所以不能每次暴力查询
所以不能每次暴力查询
那
么
就
用
素
数
筛
找
出
所
有
排
好
序
的
质
数
那么就用素数筛找出所有排好序的质数
那么就用素数筛找出所有排好序的质数
然
后
用
l
o
w
e
r
b
o
u
n
d
和
u
p
p
e
r
b
o
u
n
d
进
行
边
界
查
找
然后用lower_bound和upper_bound进行边界查找
然后用lowerbound和upperbound进行边界查找
看
数
组
中
间
有
多
少
个
即
可
看数组中间有多少个即可
看数组中间有多少个即可
AC代码
/*
Author:zzugzx
Lang:C++
Blog:blog.csdn.net/qq_43756519
*/
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '\n'
#define SZ(x) (int)x.size()
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e6+10;
const ll inf=0x3f3f3f3f;
const int dir[][2]={{0,1},{1,0},{0,-1},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
int prime[maxn];
bool isprime[10000010];
int num=0;
void Prime(int n){
memset(isprime,true,sizeof(isprime));
for(int i=2;i<=n;i++){
if(isprime[i]) prime[++num]=i;
for(int j=1;j<=num;j++){
if(i*prime[j]>n) break;
isprime[i*prime[j]]=false;
if(i%prime[j]==0) break;
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
Prime(10000000);
int _;
cin>>_;
while(_--){
int l,r;
cin>>l>>r;
int p=lower_bound(prime+1,prime+1+num,l)-prime-1;
int q=upper_bound(prime+1,prime+1+num,r)-prime-1;
cout<<q-p<<endl;
}
return 0;
}
J.Compare
题意:
给
数
a
,
b
,
如
果
a
<
b
输
出
<
给数a,b,如果a<b输出<
给数a,b,如果a<b输出<
a
=
=
b
输
出
=
a==b输出=
a==b输出=
a
>
b
输
出
>
a>b输出>
a>b输出>
题解:
a
,
b
<
=
1
0
100000
a,b<=10^{100000}
a,b<=10100000
数
很
大
,
需
要
用
高
精
度
的
判
断
数很大,需要用高精度的判断
数很大,需要用高精度的判断
我
这
里
直
接
用
了
p
y
t
h
o
n
来
写
我这里直接用了python来写
我这里直接用了python来写
AC代码
a=int(input())
b=int(input())
if a>b :
print('>')
elif a==b:
print('=')
else :
print('<')
K.Walk
题意:
t
次
询
问
从
1
,
1
到
n
,
m
有
多
少
种
最
短
的
走
法
m
o
d
1
e
9
+
7
t次询问从1,1到n,m有多少种最短的走法~mod1e9+7
t次询问从1,1到n,m有多少种最短的走法 mod1e9+7
题解:
n
,
m
<
=
1
e
6
n,m<=1e6
n,m<=1e6
按
理
说
应
该
用
d
p
进
行
转
移
按理说应该用dp进行转移
按理说应该用dp进行转移
最
短
走
法
应
该
只
往
下
和
右
走
最短走法应该只往下和右走
最短走法应该只往下和右走
d
p
[
i
]
[
j
]
=
d
p
[
i
−
1
]
[
j
]
+
d
p
[
i
]
[
j
−
1
]
dp[i][j]=dp[i-1][j]+dp[i][j-1]
dp[i][j]=dp[i−1][j]+dp[i][j−1]
但
是
这
个
n
,
m
较
大
,
不
支
持
用
二
维
数
组
和
复
杂
度
,
并
且
还
是
多
组
输
入
但是这个n,m较大,不支持用二维数组和复杂度,并且还是多组输入
但是这个n,m较大,不支持用二维数组和复杂度,并且还是多组输入
那
么
直
接
用
组
合
数
进
行
计
算
那么直接用组合数进行计算
那么直接用组合数进行计算
从
(
1
,
1
)
到
(
n
,
m
)
的
路
径
往
右
和
往
下
总
共
走
n
+
m
−
2
次
从(1,1)到(n,m)的路径往右和往下总共走n+m-2次
从(1,1)到(n,m)的路径往右和往下总共走n+m−2次
其
中
往
下
走
包
括
n
−
1
次
,
那
么
直
接
C
n
+
m
−
2
n
−
1
其中往下走包括n-1次,那么直接C_{n+m-2}^{n-1}
其中往下走包括n−1次,那么直接Cn+m−2n−1
从
n
+
m
−
2
步
中
选
出
n
−
1
步
往
下
走
,
剩
下
的
步
数
往
右
走
从n+m-2步中选出n-1步往下走,剩下的步数往右走
从n+m−2步中选出n−1步往下走,剩下的步数往右走
所
以
直
接
预
处
理
+
逆
元
使
用
组
合
数
所以直接预处理+逆元使用组合数
所以直接预处理+逆元使用组合数
AC代码
/*
Author:zzugzx
Lang:C++
Blog:blog.csdn.net/qq_43756519
*/
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '\n'
#define SZ(x) (int)x.size()
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=2e6+10;
const ll inf=0x3f3f3f3f;
const int dir[][2]={{0,1},{1,0},{0,-1},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
ll fact[maxn],inv1[maxn];
ll Pow(ll a, ll b){
ll ans = 1;
while(b > 0){
if(b & 1){
ans = ans * a % mod;
}
a = a * a % mod;
b >>= 1;
}
return ans;
}
//逆元
ll inv(ll b){
return Pow(b,mod-2)%mod;
}
ll C(ll n,ll m){
if(m>n||n<0||m<0)return 0;
if(m==0||m==n) return 1;
ll res=(fact[n]*inv1[m]%mod*inv1[n-m])%mod;
return res;
}
void init() {
fact[0] = 1;
for (int i = 1; i < maxn; i++) {
fact[i] = fact[i - 1] * i %mod;
}
inv1[maxn - 1] = Pow(fact[maxn - 1], mod - 2);
for (int i = maxn - 2; i >= 0; i--) {
inv1[i] = inv1[i + 1] * (i + 1) %mod;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
init();
int _;
cin>>_;
while(_--){
int n,m;
cin>>n>>m;
cout<<C(n+m-2,n-1)<<endl;
}
return 0;
}
L. Defeat the monster
题意:
给
n
个
人
,
每
个
人
都
有
能
力
值
给n个人,每个人都有能力值
给n个人,每个人都有能力值
要
组
一
队
人
探
险
,
这
一
队
人
能
力
极
差
不
能
超
过
5
要组一队人探险,这一队人能力极差不能超过5
要组一队人探险,这一队人能力极差不能超过5
问
这
一
组
最
多
可
以
有
多
少
人
问这一组最多可以有多少人
问这一组最多可以有多少人
题解:
肯
定
需
要
先
进
行
排
序
,
然
后
选
一
段
符
合
条
件
的
连
续
子
串
肯定需要先进行排序,然后选一段符合条件的连续子串
肯定需要先进行排序,然后选一段符合条件的连续子串
所
以
可
以
考
虑
用
尺
取
方
法
去
做
所以可以考虑用尺取方法去做
所以可以考虑用尺取方法去做
但
是
由
于
尺
取
写
起
来
不
好
下
手
但是由于尺取写起来不好下手
但是由于尺取写起来不好下手
所
以
我
考
虑
的
是
l
o
w
e
r
b
o
u
n
d
和
u
p
p
e
r
b
o
u
n
d
进
行
查
找
所以我考虑的是lowerbound和upperbound进行查找
所以我考虑的是lowerbound和upperbound进行查找
对
每
个
数
,
查
找
他
a
i
−
j
到
a
i
+
5
−
j
之
内
的
数
对每个数,查找他a_i-j到a_i+5-j之内的数
对每个数,查找他ai−j到ai+5−j之内的数
也
就
是
以
他
为
一
个
点
找
他
附
近
符
合
条
件
的
,
找
尽
量
大
的
长
度
也就是以他为一个点找他附近符合条件的,找尽量大的长度
也就是以他为一个点找他附近符合条件的,找尽量大的长度
AC代码
/*
Author:zzugzx
Lang:C++
Blog:blog.csdn.net/qq_43756519
*/
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '\n'
#define SZ(x) (int)x.size()
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e6+10;
const ll inf=0x3f3f3f3f;
const int dir[][2]={{0,1},{1,0},{0,-1},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
int a[maxn];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];sort(a+1,a+1+n);
int ans=0;
for(int i=1;i<=n;i++){
for(int j=0;j<=5;j++){
int p=lower_bound(a+1,a+1+n,a[i]-j)-a-1;
int q=upper_bound(a+1,a+1+n,a[i]+5-j)-a-1;
p=max(0,p);q=min(n,q);
ans=max(ans,q-p);
}
}
cout<<ans;
return 0;
}