发现就是直线距离公式 所以排序之后 取左右两个端点就好
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int maxn=2e5;
int T;
struct node{
int val,id;
}a[maxn];
bool cmp(node a,node b){
return a.val<b.val;
}
void solve(){
int n,x;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i].val,a[i].id=i;
sort(a+1,a+1+n,cmp);
cout<<a[1].id<<" "<<a[n].id<<endl;
}
int main(){
cin>>T;
while(T--)solve();
return 0;
}
因为连续相减可以抵消 我们发现最终剩下的数字一定是原序列两个数字之差
所以map乱搞一下就好
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int maxn=2e5+5;
int T;
int a[maxn];
map<ll,int>mp;
void solve(){
int n;
ll k,x;
mp.clear();
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>a[i],mp[a[i]]=1;
for(int i=1;i<=n;i++)
if(mp[a[i]+k]==1){
cout<<"YES"<<endl;
return;
}
cout<<"NO"<<endl;
}
int main(){
cin>>T;
while(T--)solve();
return 0;
}
因为是整个序列%x 所以我们先对整个序列排序 从大到小开始操作
最终状态可以都是1 也可以都是0
如果原序列没有1
发现对于a[i] 我们只要%a[i] 就可以使得依次变为0
如果原序列有1
我们只有使得所有都变为1 所以对于a[i] 只有%(a[i]-1)
如果排完序后有a[i]=a[i-1]+1 一定不成立
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int maxn=2e5+5;
int T;
int a[maxn];
void solve(){
int n;cin>>n;
int pd=0;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]==1)pd=1;
}
if(!pd){
cout<<"YES"<<endl;
return;
}
sort(a+1,a+1+n);
for(int i=2;i<=n;i++)
if(a[i]-a[i-1]==1){
cout<<"NO"<<endl;
return;
}
cout<<"YES"<<endl;
}
int main(){
cin>>T;
while(T--)solve();
return 0;
}
不难发现 if ( (n - dp[k]) % k = 0 ) ans = k 其中dp[k]=((1+k)×k)/2
并且发现如果n为奇数 k=2一定是成立的
考虑n为奇数的情况
上面式子可以化简为n-dp[n]≡0(mod k)
发现当k为奇数的时候满足 dp[n]为k的倍数
所以只要找到n=mk(k为奇数)
所以我们先对n不断的/2 最后一定会剩下一个奇数
但是此时问题来了 如果n<dp[k]呢
此时交换奇数和2的t次方的位置就好 但是又要保证 后面是2的t次方的倍数
所以此时我们取 k为2的t+1次方 即可
还要注意 两个数相乘可能超过long long 的范围 !!!特判
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long LL;
int main()
{
int t;
cin >> t;
while(t--){
LL n,t;
cin >> n;t=n;
LL k = 1;
while(n%2 == 0){
n/=2;
k*=2;
}
if(n == 1) cout << -1 <<'\n';
else if(n<=2e9&&(n*(n+1))/2 <= t)
cout<<n<<endl;
else
cout<<2*k<<endl;
}
return 0;
}