Pinely Round 3 (Div. 1 + Div. 2)
A. Distinct Buttons
#include<bits/stdc++.h>
using namespace std;
void solve(){
int n;
cin>>n;
int a=0,b=0,c=0,d=0;
for(int i=1;i<=n;i++){
int x,y;
cin>>x>>y;
if(x>0)a=1;
if(y>0)b=1;
if(x<0)c=1;
if(y<0)d=1;
}
if(a&&b&&c&&d){
cout<<"NO\n";
}else{
cout<<"YES\n";
}
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t=1;
cin>>t;
for(int i=1;i<=t;i++)solve();
return 0;
}
B. Make Almost Equal With Mod
首先会想到2,因为除以2不是0就是1,但是碰到全是奇或全是偶就不好使了,那么就将2扩大一倍,
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[200];
void solve(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int m=1;
while(1){
int k=(long long)1<<m;
set<int>ans;
for(int i=1;i<=n;i++){
ans.insert(a[i]%k);
}
if(ans.size()==2){
cout<<k<<"\n";
return;
}
m++;
}
}
signed main(){
ios::sync_with_stdio(0);cout.tie(0);cin.tie(0);
int t;
cin>>t;
for(int i=1;i<=t;i++)solve();
return 0;
}
C. Heavy Intervals
首先如果区间都是不相交的,是换不了的,所以只能去改变相交的,假使两个区间相加,想要权值最小化,是不是就应该让更多的区间去乘小的值,更少的区间去乘大的值,所以可以转换区间。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int l[N],r[N],c[N],p[N];
void solve(){
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>l[i];
for(int i=1;i<=n;i++)cin>>r[i];
for(int i=1;i<=n;i++)cin>>c[i];
set<int>s(l+1,l+1+n);
sort(r+1,r+1+n);
for(int i=1;i<=n;i++){
auto it=s.lower_bound(r[i]);
l[i]=*prev(it);
p[i]=r[i]-l[i];
s.erase(prev(it));
}
sort(p+1,p+1+n,greater<int>());
sort(c+1,c+1+n);
int ans=0;
for(int i=1;i<=n;i++){
ans+=(p[i]*c[i]);
}
cout<<ans<<"\n";
}
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t=1;
cin>>t;
for(int i=1;i<=t;i++)solve();
return 0;
}