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

发现就是直线距离公式 所以排序之后 取左右两个端点就好

#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;
}
posted @ 2022-04-19 23:16  wzx_believer  阅读(39)  评论(0)    收藏  举报