https://codeforces.com/contest/1180
A:
题意:求第n个有几个,n<100
思路 :for
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int MX =1e6+5;
int main(){
int n;cin>>n;
LL ans=0;
for(int i=1;i<n*2;i+=2){
ans+=(LL)i;
}
for(int i=1;i<n*2-2;i+=2)
ans+=(LL)i;
cout<<ans;
return 0;
}
B:
题意:给n个数,每个数可以执行任意次操作:
求最后可以使得n个数的乘积最大的数组(任意一个)
思路:先将ai变成负数,如果n%2==1取一个绝对值最大的变成正数。
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int MX =1e6+5;
int a[MX];
int main(){
int n;cin>>n;
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++){
if(a[i]>=0) a[i]=a[i]*-1-1;
}
if(n%2==0){
for(int i=1;i<=n;i++)printf("%d ",a[i]);
return 0;
}
int u=1,mx=0;
for(int i=1;i<=n;i++){
if(a[i]<mx) mx=a[i],u=i;
}
a[u]=-a[u]-1;
for(int i=1;i<=n;i++)
printf("%d ",a[i]);
return 0;
}
C:
题意:每次取出数组前两个数,大的放前面,小的放后面,求第i次操作操作的两个数是什么。
思路:肯定是最大的会被操作到第一位,然后循环操作,那么相应模拟一遍之后取模即可。
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int MX =1e6+5;
int a[MX];int n,q;
map<int,pair<int,int> >mp;
vector<int>v;
void get(int u){
deque<int>q;
for(int i=1;i<=n;i++)q.push_back(a[i]);
for(int i=1;i<u;i++){
int A=q.front();q.pop_front();
int B=q.front();q.pop_front();
mp[i]=make_pair(A,B);
if(A>=B)swap(A,B);
q.push_back(A);q.push_front(B);
}
q.pop_front();
while(!q.empty()){
v.push_back(q.front());
q.pop_front();
}
}
int main(){
cin>>n>>q;for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int u,mx=-1;
for(int i=1;i<=n;i++){
if(a[i]>mx)mx=a[i],u=i;
}
get(u);
while(q--){
LL x;cin>>x;
if(x<u)printf("%d %d\n",mp[x].first,mp[x].second);
else {
LL zz=(x-(LL)u)%(LL)(n-1);
printf("%d %d\n",mx,v[zz]);
}
}
return 0;
}
D:
题意:给一个n*m的矩阵,从(1,1)出发,每次可以到达任意一个点,求遍历完所有的点后,所有的移动矢量都不相同。
思路:构造题,日常被卡,大概一种比较好的构造:每次走(第一行,最后一行),然后回到(第二行,倒数第二行),如果n%2==1,再走来走去即可。
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int MX = 1e6+5;
int main(){
int n,m;cin>>n>>m;
for(int i=1;i<=n/2;i++){
int l=1,r=m;
for(int j=1;j<=m;j++){
printf("%d %d\n",i,l++);
printf("%d %d\n",n+1-i,r--);
}
}
if(n%2==1){
int l=1,r=m;
while(r-l>=1){
printf("%d %d\n",n/2+1,l++);
printf("%d %d\n",n/2+1,r--);
}
if(l==r) printf("%d %d\n",n/2+1,l++);
}
return 0;
}
E:区间最小线段树
独立文章:https://blog.youkuaiyun.com/qq_41730604/article/details/94913814