https://codeforces.com/contest/1180/problem/B
任何数变2次 又变成本身
a[i]=-a[i]-1
>=0的数变负数,绝对值变大 n为偶数个 直接输出
n为奇数个 找出绝对值最大的负数 即最小值的位置 将它一个变成正数
剩下偶数个正数
不能先求出minn再找与minn相等的变成正数
2 -3 -3
-3 -3 -3
2 2 2
只改1个数即可 minn有多个时也只改1个
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
const int INF=0x3f3f3f3f;
#define rep(i,a,n) for(int i=a;i<=n;i++)
typedef long long ll;
int a[maxn];
int n,minn=1e7,pos=0;
int main()
{
cin>>n;
rep(i,1,n){
cin>>a[i];
if(a[i]>=0)
a[i]*=-1,a[i]--;
}
// rep(i,1,n)
// cout<<a[i]<<" ";
// cout<<endl;
if(n&1){
rep(i,1,n){
if(a[i]<minn){
pos=i;
minn=a[i];
}
}
a[pos]*=-1;
a[pos]--;
}
rep(i,1,n){
cout<<a[i];
if(i!=n)
cout<<" ";
else
cout<<endl;
}
return 0;
}
https://codeforces.com/contest/1180/problem/B
构造前2*n对 A,B
查询前n对 已构造
查询后面 n之后 每n-1一个周期
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii; //1e9
typedef pair<ll,ll> pll;
const int maxn=3e5+5;
const int INF=0x3f3f3f3f;
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
ll m[maxn];//q3e5 值ll=1e18
pii p[maxn];
int a[maxn];//2*1e5
int main()
{
ll q;
int n,A,B;
cin>>n>>q;
rep(i,1,n)
cin>>a[i];
rep(i,1,q){
cin>>m[i];
}
//构造
rep(i,1,2*n){
A=a[i];
B=a[i+1];
p[i]=mp(A,B);
if(A<=B)
swap(A,B);
a[i+1]=A;
a[i+n]=B;
}
rep(i,1,q){
if(m[i]<=n)
cout<<p[m[i]].fi<<" "<<p[m[i]].se<<endl;
else
{
int pos=n+(m[i]-n)%(n-1);
cout<<p[pos].fi<<" "<<p[pos].se<<endl;
}
}
return 0;
}
D 从(1,1)开始遍历n*m所有点1次
每次(dx,dy)向量不重复
尽可能打乱的走
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii; //1e9
typedef pair<ll,ll> pll;
const int maxn=3e5+5;
const int INF=0x3f3f3f3f;
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
int main()
{
int n,m;
cin>>n>>m;
for(int i=m,j=m+n*m-1;i<=j;i++,j--){
printf("%d %d\n",i/m,i%m+1);
if(i!=j)
printf("%d %d\n",j/m,j%m+1);
}
return 0;
}