Codeforces Global Round 30 (Div. 1 + Div. 2)
B题
题目大意:
求解数列中是否存在y%x是偶数的元素对
思路:
首先,序列中如果有两个偶数的话,一定是可以的,接下来考虑只有一个偶数或者没有偶数的情况,现在序列中都是奇数,考虑不符合题意的情况,ymodx=y−k∗xy mod x=y-k*xymodx=y−k∗x,可以发现当k等于1的时候当前的数一定是偶数,因为奇数与奇数之间的距离一定是偶数,接下来不一定有的情况是y>=2∗xy>=2*xy>=2∗x每一次都是2的倍数,所以不符合题意的条件是log级别的,所以直接枚举就可以了,总结一下,先枚举偶数,在看奇数的相邻元素,最后枚举
代码:
#include<bits/stdc++.h>
#define int long long
//#define ull unsigned long long
using namespace std;
//#define x first
//#define y second
//const int mod=19650827;
//const int N=1e5+10;
//int fac[N],invfac[N];
//int qmi(int a,int b,int p){int res=1;while(b){if(b&1)res=res*a%p;a=a*a%p;b>>=1;}return res;}
//int inv(int x){return qmi(x,p-2);}
//int C(int n,int m){if(n<0||m<0||n<m)return 0;return fac[n]*invfac[n-m]%p*invfac[m]%p;}
//void init(){fac[0]=1;for(int i=1;i<N;i++)fac[i]=fac[i-1]*i%p;invfac[N-1]=inv(fac[N-1]);for(int i=N-2;i>=0;i--)invfac[i]=invfac[i+1]*(i+1)%p;}
//struct node{int v,w;bool operator < (const node &x)const{return w==x.w ? v>x.v : w>x.w;}};
//void dijkstra(const vector<vector<node>>&g,vector<int>&dist,vector<bool>&vis,int x){fill(dist.begin(),dist.end(),LLONG_MAX);fill(vis.begin(),vis.end(),false);
//dist[x]=0;priority_queue<node>q;q.push({x,0});while(q.size()){auto u=q.top().v;q.pop();if(vis[u])continue;vis[u]=true;for(auto [v,w]:g[u]){if(dist[v]>dist[u]+w){
//dist[v]=dist[u]+w;q.push({v,dist[v]});}}}}
//struct BIT{int n;vector<int>t;BIT(int _n=0){init(_n);}void init(int _n){n=_n;t.assign(n+2,0);}
//void add(int x,int v){for(;x<=n;x+=(x & -x))t[x]+=v;}int query(int x){int res=0;for(;x;x-=(x & -x))res+=t[x];return res;}};
//int calc_add(const vector<vector<int>>&s,int x1,int y1,int x2,int y2){return s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1];}
//void calc_diff(vector<vector<int>>&d,int x1,int y1,int x2,int y2,int c){d[x1][y1]+=c;d[x2+1][y1]-=c;d[x1][y2+1]-=c;d[x2+1][y2+1]+=c;}
//int primes[N],cnt=0;bool st[N];
//void init1(){for(int i=2;i<N;i++){if(!st[i])primes[++cnt]=i;for(int j=1;primes[j]*i<N;j++){st[primes[j]*i]=true;if(i%primes[j]==0)break;}}}
//vector<int>factor[N];void init2(){for(int i=1;i<N;i++){for(int j=i;j<N;j+=i){factor[j].push_back(i);}}}
//int find(vector<int>&pre,int x){return pre[x]=(pre[x]==x ? x : find(pre,pre[x]));}
//void merge(vector<int>&pre,int x,int y){int fx=find(pre,x),fy=find(pre,y);if(fx==fy)return;pre[fx]=fy;}
//bool check(vector<int>&pre,int x,int y){return find(pre,x)==find(pre,y);}
//string add(string x,string y){if((int)x.size()<(int)y.size())swap(x,y);int n=x.size();int m=y.size();reverse(x.begin(),x.end());reverse(y.begin(),y.end());
//int d=0;string ans;for(int i=0;i<n;i++){int x1=(x[i]-'0');int y1=(i<m ? y[i]-'0' : 0);int sum=x1+y1+d;ans.push_back((sum%10)+'0');d=sum/10;}
//if(d>0)ans.push_back(d+'0');reverse(ans.begin(),ans.end());return ans;}
//string mul(string x,string y){if(x=="0"||y=="0")return "0";reverse(x.begin(),x.end());reverse(y.begin(),y.end());int x1=x.size();int y1=y.size();string ans;
//for(int i=0;i<x1;i++){int d=0;int val1=(x[i]-'0');for(int j=0;j<y1;j++){int val2=(y[j]-'0');int len=ans.size();int val=val1*val2+d;
//if(len<=i+j)ans.push_back((val%10)+'0');else val+=(ans[i+j]-'0'),ans[i+j]=((val%10)+'0');d=val/10;}int len=ans.size();int cur_pos=i+y1;
//while(d){if(cur_pos>=len)ans.push_back((d%10)+'0');else d+=ans[cur_pos]-'0',ans[cur_pos]=((d%10)+'0');d/=10;cur_pos++;}}reverse(ans.begin(),ans.end());return ans;}
//struct Seg_Tree{int n;vector<int>t,lz;Seg_Tree(int _n=0){init(_n);}void init(int _n){n=_n;t.assign((n<<2)+2,0);lz.assign((n<<2)+2,0);}
//void pushup(int o){t[o]=t[o<<1]+t[o<<1|1];}void update(int s,int e,int o,int x){t[o]+=x*(e-s+1);lz[o]+=x;}
//void pushdown(int s,int e,int o){if(!lz[o])return ;int mid=(s+e)>>1;update(s,mid,o<<1,lz[o]);update(mid+1,e,o<<1|1,lz[o]);lz[o]=0;}
//void add(int l,int r,int x,int s=1,int e=0,int o=1){if(e==0)e=this->n;if(l>e||r<s)return ;if(l<=s&&e<=r){update(s,e,o,x);return ;}pushdown(s,e,o);int mid=(s+e)>>1;
//add(l,r,x,s,mid,o<<1);add(l,r,x,mid+1,e,o<<1|1);pushup(o);}
//int query(int l,int r,int s=1,int e=0,int o=1){if(e==0)e=this->n;if(l>e||r<s)return 0;if(l<=s&&r>=e)return t[o];pushdown(s,e,o);int mid=(s+e)>>1;
//int x=query(l,r,s,mid,o<<1);int y=query(l,r,mid+1,e,o<<1|1);return x+y;}};
void solve(){int n;cin>>n;vector<int>a(n+1);for(int i=1;i<=n;i++)cin>>a[i];vector<int>odd,even;for(int i=1;i<=n;i++){if(a[i]%2)odd.push_back(a[i]);else even.push_back(a[i]);}if(even.size()>=2){cout<<even[0]<<' '<<even[1]<<'\n';return ;}for(int i=1;i<(int)odd.size();i++){if((odd[i]%odd[i-1])%2==0){cout<<odd[i-1]<<' '<<odd[i]<<'\n';return ;}}for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){if((a[j]%a[i])%2==0){cout<<a[i]<<' '<<a[j]<<'\n';return ;}}}cout<<-1<<'\n';
}
signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);//init();//init1();//init2();int _=1;cin>>_;while(_--)solve();return 0;
}
C题
题目大意:
现在可以执行n次攻击,需要面对m只怪物,击败一只怪物可以掉落伤害为可以当前伤害和可以获得的伤害的最大值
思路:
可以使用multiset来存储n次攻击,在攻击中查找当前的怪物可以被击杀吗,这里需要处理怪物的排序,对于怪物的排序首先按照掉落攻击值来排序,如果掉落值相等,按照攻击怪物伤害小的进行排序,但是这个排序是错误的,反例:
1010 2
1012 1011
所以需要重新考虑排序,所以应该杀血量少并且可以掉落物品的怪物,该排序应该为将拥有c的怪物放到没有c的挂物的前面,之后按照b从小到大进行排序
代码:
#include<bits/stdc++.h>
#define int long long
//#define ull unsigned long long
using namespace std;
//#define x first
//#define y second
//const int mod=19650827;
//const int N=1e5+10;
//int fac[N],invfac[N];
//int qmi(int a,int b,int p){int res=1;while(b){if(b&1)res=res*a%p;a=a*a%p;b>>=1;}return res;}
//int inv(int x){return qmi(x,p-2);}
//int C(int n,int m){if(n<0||m<0||n<m)return 0;return fac[n]*invfac[n-m]%p*invfac[m]%p;}
//void init(){fac[0]=1;for(int i=1;i<N;i++)fac[i]=fac[i-1]*i%p;invfac[N-1]=inv(fac[N-1]);for(int i=N-2;i>=0;i--)invfac[i]=invfac[i+1]*(i+1)%p;}
//struct node{int v,w;bool operator < (const node &x)const{return w==x.w ? v>x.v : w>x.w;}};
//void dijkstra(const vector<vector<node>>&g,vector<int>&dist,vector<bool>&vis,int x){fill(dist.begin(),dist.end(),LLONG_MAX);fill(vis.begin(),vis.end(),false);
//dist[x]=0;priority_queue<node>q;q.push({x,0});while(q.size()){auto u=q.top().v;q.pop();if(vis[u])continue;vis[u]=true;for(auto [v,w]:g[u]){if(dist[v]>dist[u]+w){
//dist[v]=dist[u]+w;q.push({v,dist[v]});}}}}
//struct BIT{int n;vector<int>t;BIT(int _n=0){init(_n);}void init(int _n){n=_n;t.assign(n+2,0);}
//void add(int x,int v){for(;x<=n;x+=(x & -x))t[x]+=v;}int query(int x){int res=0;for(;x;x-=(x & -x))res+=t[x];return res;}};
//int calc_add(const vector<vector<int>>&s,int x1,int y1,int x2,int y2){return s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1];}
//void calc_diff(vector<vector<int>>&d,int x1,int y1,int x2,int y2,int c){d[x1][y1]+=c;d[x2+1][y1]-=c;d[x1][y2+1]-=c;d[x2+1][y2+1]+=c;}
//int primes[N],cnt=0;bool st[N];
//void init1(){for(int i=2;i<N;i++){if(!st[i])primes[++cnt]=i;for(int j=1;primes[j]*i<N;j++){st[primes[j]*i]=true;if(i%primes[j]==0)break;}}}
//vector<int>factor[N];void init2(){for(int i=1;i<N;i++){for(int j=i;j<N;j+=i){factor[j].push_back(i);}}}
//int find(vector<int>&pre,int x){return pre[x]=(pre[x]==x ? x : find(pre,pre[x]));}
//void merge(vector<int>&pre,int x,int y){int fx=find(pre,x),fy=find(pre,y);if(fx==fy)return;pre[fx]=fy;}
//bool check(vector<int>&pre,int x,int y){return find(pre,x)==find(pre,y);}
//string add(string x,string y){if((int)x.size()<(int)y.size())swap(x,y);int n=x.size();int m=y.size();reverse(x.begin(),x.end());reverse(y.begin(),y.end());
//int d=0;string ans;for(int i=0;i<n;i++){int x1=(x[i]-'0');int y1=(i<m ? y[i]-'0' : 0);int sum=x1+y1+d;ans.push_back((sum%10)+'0');d=sum/10;}
//if(d>0)ans.push_back(d+'0');reverse(ans.begin(),ans.end());return ans;}
//string mul(string x,string y){if(x=="0"||y=="0")return "0";reverse(x.begin(),x.end());reverse(y.begin(),y.end());int x1=x.size();int y1=y.size();string ans;
//for(int i=0;i<x1;i++){int d=0;int val1=(x[i]-'0');for(int j=0;j<y1;j++){int val2=(y[j]-'0');int len=ans.size();int val=val1*val2+d;
//if(len<=i+j)ans.push_back((val%10)+'0');else val+=(ans[i+j]-'0'),ans[i+j]=((val%10)+'0');d=val/10;}int len=ans.size();int cur_pos=i+y1;
//while(d){if(cur_pos>=len)ans.push_back((d%10)+'0');else d+=ans[cur_pos]-'0',ans[cur_pos]=((d%10)+'0');d/=10;cur_pos++;}}reverse(ans.begin(),ans.end());return ans;}
//struct Seg_Tree{int n;vector<int>t,lz;Seg_Tree(int _n=0){init(_n);}void init(int _n){n=_n;t.assign((n<<2)+2,0);lz.assign((n<<2)+2,0);}
//void pushup(int o){t[o]=t[o<<1]+t[o<<1|1];}void update(int s,int e,int o,int x){t[o]+=x*(e-s+1);lz[o]+=x;}
//void pushdown(int s,int e,int o){if(!lz[o])return ;int mid=(s+e)>>1;update(s,mid,o<<1,lz[o]);update(mid+1,e,o<<1|1,lz[o]);lz[o]=0;}
//void add(int l,int r,int x,int s=1,int e=0,int o=1){if(e==0)e=this->n;if(l>e||r<s)return ;if(l<=s&&e<=r){update(s,e,o,x);return ;}pushdown(s,e,o);int mid=(s+e)>>1;
//add(l,r,x,s,mid,o<<1);add(l,r,x,mid+1,e,o<<1|1);pushup(o);}
//int query(int l,int r,int s=1,int e=0,int o=1){if(e==0)e=this->n;if(l>e||r<s)return 0;if(l<=s&&r>=e)return t[o];pushdown(s,e,o);int mid=(s+e)>>1;
//int x=query(l,r,s,mid,o<<1);int y=query(l,r,mid+1,e,o<<1|1);return x+y;}};
void solve(){int n,m;cin>>n>>m;vector<int>a(n+1);vector<pair<int,int>>b(m+1);multiset<int>s;for(int i=1;i<=n;i++)cin>>a[i],s.insert(a[i]);for(int i=1;i<=m;i++)cin>>b[i].first;for(int i=1;i<=m;i++)cin>>b[i].second;sort(b.begin()+1,b.end(),[](const pair<int,int>p1,const pair<int,int>p2){int opx=(p1.second>0),opy=(p2.second>0);if(opx==opy)return p1.first<p2.first;else return p1.second>p2.second;});//for(int i=1;i<=m;i++)cout<<b[i].first<<' '<<b[i].second<<'\n';int cnt=0;for(int i=1;i<=m;i++){auto it=s.lower_bound(b[i].first);if(it==s.end())continue;int val=*it;s.erase(it);if(b[i].second)s.insert(max(val,b[i].second));cnt++;//for(auto x:s)cout<<x<<' ';//cout<<'\n';}cout<<cnt<<'\n';
}
signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);//init();//init1();//init2();int _=1;cin>>_;while(_--)solve();return 0;
}
