CodeTON Round 1 (Div. 1 + Div. 2, Rated, Prizes!)

发现就是直线距离公式 所以排序之后 取左右两个端点就好
#include
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>n;
for(int i=1;i<=n;i++)cin>>a[i].val,a[i].id=i;
sort(a+1,a+1+n,cmp);
cout<>T;
while(T--)solve();
return 0;
}

因为连续相减可以抵消 我们发现最终剩下的数字一定是原序列两个数字之差
所以map乱搞一下就好
#include
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int maxn=2e5+5;
int T;
int a[maxn];
mapmp;
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"<>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
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"<>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 此时交换奇数和2的t次方的位置就好 但是又要保证 后面是2的t次方的倍数 所以此时我们取 k为2的t+1次方 即可 还要注意 两个数相乘可能超过long long 的范围 !!!特判#include