Codeforces Round #701 (Div. 2) A-D
A
https://codeforces.com/contest/1485/problem/A
本题我的做法是枚举小范围内的一些b值,再对ans取min
#include
#define ll long long
using namespace std;
const int N = 10005;
int n,m;
int a,b;
int main(){
int t;
cin>>t;
while(t--){
cin>>a>>b;
if(a
B
https://codeforces.com/contest/1485/problem/B
对于一段区间的询问,除了\(a_{l}\)和\(a_{r}\)的中间部分答案都是一定的,有两侧的值限制其取值范围
于是可以先预处理,再根据每次的询问O(1)计算数组两头的值,把它们一起加进答案
#include //??scc??
#define ll long long
using namespace std;
const int N = 100005;
int n,q,k;
ll a[N],b[N];
ll pre[N];
int main(){
int t=1;
// cin>>t;
while(t--){
cin>>n>>q>>k;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
a[0]=0,a[n+1]=k+1;
pre[0]=0;
for(int i=1;i<=n;i++){
b[i]=a[i+1]-a[i-1]-2;
// cout<
C
https://codeforces.com/contest/1485/problem/C
踩坑经历:当发现O(n)枚举会tle时,强行归纳规律很困难
正解是首先找出k取值的上限:\(k\leq \sqrt(x)\),又因为对于给定的k值,可以O(1)计算出pair(a,b)的个数,所以复杂度可以优化为\(\sqrt(x)\)
#include
#define ll long long
using namespace std;
const int N = 100005;
int n;
ll x,y;
int main(){
int t;
cin>>t;
while(t--){
cin>>x>>y;
ll ans=0;
for(int i=1;i*i
D
https://codeforces.com/contest/1485/problem/D
思路1:暴力
通过观察样例可以发现,我们可以构造出\(b_{ij}=ka_{11}+(i-1)*sr+(j-1)*sc\)这样的矩阵b
我们需要做的是枚举sr、sc、k,再遍历b中每个元素看是否满足\(b_{ij}\%a_{ij}==0\)
然而超时了
思路2:构造(非常巧妙)
#include
#define ll long long
using namespace std;
int a[505][505];
int n,m;
int p[6]={2,3,5,7,11,13};
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if((i+j)%2){
printf("%d ",720720);
}
else {
printf("%d ",720720+a[i][j]*a[i][j]*a[i][j]*a[i][j]);
}
}puts("");
}
}