河南萌新联赛2024第(三)场:河南大学 BCEFJL

打印 上一主题 下一主题

主题 656|帖子 656|积分 1968

 B   正则表达式

思路:直接scanf按格式输入a,b,c,d,然后判断四个数是不是都符合0~255即可
AC代码:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4.     int t,cnt=0;
  5.     cin>>t;
  6.     while(t--){
  7.         int a,b,c,d;
  8.         scanf("%d.%d.%d.%d",&a,&b,&c,&d);
  9.         if(a>=0 && a<=255 &&
  10.         b>=0 && b<=255 &&
  11.         c>=0 && c<=255 &&
  12.         d>=0 && d<=255) cnt++;
  13.     }
  14.     cout<<cnt<<endl;
  15.     return 0;
  16. }
复制代码
C   Circle

思路:设圆的个数为n,n==0时,ans=1; n>0时,ans=n*(n-1)+2
AC代码:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define int unsigned long long
  4. signed main(){
  5.     int t,cnt=0;
  6.     cin>>t;
  7.     vector<int> arr(t);
  8.     for(int i=0;i<=t;i++) cin>>arr[i];
  9.     for(auto xx:arr){
  10.         if(xx==0) cout<<1<<" ";
  11.         else cout<<xx*xx-xx+2<<" ";
  12.     }
  13.     return 0;
  14. }
复制代码
J   keillempkill学姐の卷积

思路:四个循环嵌套模拟即可
AC代码:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int a[22][22];
  4. int b[22][22];
  5. int n,m;
  6. #define int long long
  7. signed main(){
  8.     cin>>n>>m;
  9.     for(int i=1;i<=n;i++){
  10.         for(int j=1;j<=n;j++){
  11.             cin>>a[i][j];
  12.         }
  13.     }
  14.     for(int i=1;i<=m;i++){
  15.         for(int j=1;j<=m;j++) cin>>b[i][j];
  16.     }
  17.     int xx = m-n+1;
  18.     for(int i=1;i<=xx;i++){
  19.         for(int j=1;j<=xx;j++){
  20.             int ans = 0;
  21.             for(int ix=1;ix<=n;ix++){
  22.                 for(int iy=1;iy<=n;iy++){
  23.                     ans += a[ix][iy]*b[ix+i-1][iy+j-1];
  24.                 }
  25.             }
  26.             cout<<ans<<" ";
  27.         }
  28.         cout<<endl;
  29.     }
  30.     return 0;
  31. }
复制代码
L   SSH

思路:数据量不大,合理存储之后直接搜刮就好,公钥和私钥用map来存,用户和其拥有的私钥开一个由string和vector构成的结构体来储存,ip地点下就是map<string,结构体>
AC代码:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n,m,q;
  4. map<string,string> key;
  5. struct user{
  6.     string name;
  7.     vector<string> ma;
  8. };
  9. map<string,vector<user> > wang;
  10. int main(){
  11.     cin>>m>>n>>q;
  12.     for(int i=0;i<m;i++){
  13.         string aa,bb;
  14.         cin>>aa>>bb;
  15.         key[bb]=aa;
  16.     }
  17.     for(int i=0;i<n;i++){
  18.         string ww; int x;
  19.         cin>>ww>>x;
  20.         //user u;
  21.         while(x--){
  22.             user uu;
  23.             string na; int c;
  24.             cin>>na>>c;
  25.             uu.name=na;
  26.             while(c--){
  27.                 string cc;
  28.                 cin>>cc;
  29.                 uu.ma.push_back(cc);
  30.             }
  31.             wang[ww].push_back(uu);
  32.         }
  33.     }
  34. // cout<<endl<<" ### "<<endl;
  35. // for(auto xx:key) cout<<xx.first<<" "<<xx.second<<endl;
  36. // cout<<endl;
  37. // for(auto xx:wang){
  38. //     cout<<xx.first<<" ";
  39. //     for(auto aa:wang[xx.first]){
  40. //         cout<<aa.name<<" ";
  41. //         for(auto bb:aa.ma) cout<<bb<<" ";
  42. //     }cout<<endl;   
  43. // }
  44. // cout<<endl;
  45.     while(q--){
  46.         string naa,iip,kee;
  47.         cin>>naa>>iip>>kee;
  48.         kee = key[kee];
  49.         bool flag = false;
  50.         for(auto xx:wang[iip]){
  51.             if(xx.name==naa){
  52.                 for(auto aa:xx.ma){
  53.                     if(aa==kee){
  54.                         flag = true;
  55.                         break;
  56.                     }
  57.                 }
  58.             }
  59.         }
  60.         if(flag) cout<<"Yes"<<endl;
  61.         else cout<<"No"<<endl;
  62.     }
  63.     return 0;
  64. }
复制代码
F   累加器

思路:起首将输入的数转化成二进制用一个字符串存起来,我们按位来分析。 起首,二进制下的末尾有n次累加就会变革n次,若末尾最初为0,则末尾的前一位会变革n/2次,反之则会变革(n+1)/2次(相当于末尾最初就变革了一次)   据此可以推出每一位都满意这个推算,不断加给ans即可
AC代码:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int t,a,b;
  4. int main(){
  5.     cin>>t;
  6.     while(t--){
  7.         cin>>a>>b;
  8.         int aa=a;
  9.         string s = "00000000000000000000000000";
  10.         int cnt = 1;
  11.         while(aa){
  12.             if(aa%2) s[cnt]='1';
  13.             aa/=2;
  14.             cnt++;
  15.         }
  16.         //cout<<s<<endl;
  17.         int ans = 0;
  18.         ans += b;
  19.         int cnn = 2;
  20.         while(b){
  21.             if(s[cnn-1]=='1') b++;
  22.             b/=2;
  23.             ans += b;
  24.             cnn++;
  25.         }
  26.         cout<<ans<<endl;
  27.     }
  28.     return 0;
  29. }
复制代码
E   区间

这题是赛后补的,之前没学过线段树,借这个题也是学了半天线段树,解法就是用线段树求区间连续最大子段和
这题来写具体一点
初始化数组:

由于最开始都是白色的,所以数组初始化全为1,接着就是用build()建立
  1.     int n,q;
  2.     cin>>n>>q;
  3.     for(int i=1;i<=n;i++){
  4.         w[i]=1;
  5.     }
  6.     build(1,1,n);
复制代码
建立:

node是树的每个节点包罗的信息注意线段树一般都要开4*N以避免越界题目 )
l,r表示左右端点         sum0,sum1表示该段中0的数量和1的数量
lmx1,rmx1表示从左端点向右和从右端点向左连续最长仅1子段的长度(lmx0,rmx0反之)
lazy是lazy标记
build()函数建立的过程是从上到下不断二分区间的过程,用到了递归,取mid时采用位运算效率更高,lazy标记最开始都初始化为0
  1. struct node{
  2.     int l,r;
  3.     int sum1,sum0;
  4.     int lmx1,rmx1;
  5.     int rmx0,lmx0;
  6.     int lazy;
  7. }tr[N*4];
  8. void build(int p,int l,int r){
  9.     tr[p]={l,r,w[l],w[l]^1,w[l],w[l],w[l]^1,0};
  10.     if(l==r) return ;
  11.     int mid=l+r>>1;
  12.     build(lc,l,mid);
  13.     build(rc,mid+1,r);
  14.     pushup(p);
  15. }
复制代码
换色操作:

这里的swap操作仅限于01数组,若是非01数组,则要按照dp的头脑取max
这里的代码也适用于区间修改,只是按题目中来就是单点修改了,0换成1 1换成0 的事
  1. void update1(int p,int l,int r){
  2.     if(l<=tr[p].l && r>=tr[p].r){
  3.         swap(tr[p].sum1,tr[p].sum0);
  4.         swap(tr[p].lmx1,tr[p].lmx0);
  5.         swap(tr[p].rmx1,tr[p].rmx0);
  6.         tr[p].lazy++;
  7.         return;
  8.     }
  9.     pushdown(p);
  10.     int mid=tr[p].l+tr[p].r>>1;
  11.     if(l<=mid) update1(lc,l,r);
  12.     if(r>mid) update1(rc,l,r);
  13.     pushup(p);
  14. }
复制代码
向上向下更新:

先根据lazy标记的信息向下更新,之后再向上更新
  1. void pushup(int p){
  2.     tr[p].sum1=max(max(tr[lc].sum1,tr[rc].sum1),tr[lc].rmx1+tr[rc].lmx1);
  3.     tr[p].sum0=max(max(tr[lc].sum0,tr[rc].sum0),tr[lc].rmx0+tr[rc].lmx0);
  4.     tr[p].lmx1=tr[lc].lmx1;
  5.     tr[p].rmx1=tr[rc].rmx1;
  6.     tr[p].lmx0=tr[lc].lmx0;
  7.     tr[p].rmx0=tr[rc].rmx0;
  8.     if(tr[lc].r-tr[lc].l+1==tr[lc].lmx1) tr[p].lmx1+=tr[rc].lmx1;
  9.     if(tr[rc].r-tr[rc].l+1==tr[rc].rmx1) tr[p].rmx1+=tr[lc].rmx1;
  10.     if(tr[lc].r-tr[lc].l+1==tr[lc].lmx0) tr[p].lmx0+=tr[rc].lmx0;
  11.     if(tr[rc].r-tr[rc].l+1==tr[rc].rmx0) tr[p].rmx0+=tr[lc].rmx0;
  12. }
  13. void pushdown(int p){
  14.     int ta=tr[p].lazy;
  15.     if(ta&1)
  16.     {
  17.         swap(tr[lc].sum0,tr[lc].sum1);
  18.         swap(tr[lc].lmx0,tr[lc].lmx1);
  19.         swap(tr[lc].rmx0,tr[lc].rmx1);
  20.         swap(tr[rc].lmx1,tr[rc].lmx0);
  21.         swap(tr[rc].sum0,tr[rc].sum1);
  22.         swap(tr[rc].rmx1,tr[rc].rmx0);
  23.         tr[lc].lazy+=ta;
  24.         tr[rc].lazy+=ta;
  25.         tr[p].lazy=0;
  26.     }
  27. }
复制代码

询问部分:

从最顶端开始,然后逐级取mid,分右端点<=mid.  左端点>mid  mid在左右端点中间 三种情况处理
  1. node query(int p,int l,int r){
  2.     if(l<=tr[p].l && tr[p].r<=r) return tr[p];
  3.     pushdown(p);
  4.     int mid=tr[p].l+tr[p].r>>1;
  5.     node x,y,ans;
  6.     if(r<=mid) ans = query(lc,l,r);
  7.     else if(l>mid) ans = query(rc,l,r);
  8.     else{
  9.         x = query(lc,l,mid);
  10.         y = query(rc,mid+1,r);
  11.         ans.sum1 = max({x.sum1,y.sum1,x.rmx1+y.lmx1});
  12.         ans.sum0 = max({x.sum0,y.sum0,x.rmx0+y.lmx0});
  13.         ans.lmx1=x.lmx1;
  14.         ans.lmx0=x.lmx0;
  15.         ans.rmx0=y.rmx0;
  16.         ans.rmx1=y.rmx1;
  17.         if(x.r-x.l+1==x.lmx1) ans.lmx1+=y.lmx1;
  18.         if(x.r-x.l+1==x.lmx0) ans.lmx0+=y.lmx0;
  19.         if(y.r-y.l+1==y.rmx1) ans.rmx1+=x.rmx1;
  20.         if(y.r-y.l+1==y.rmx0) ans.rmx0+=x.rmx0;
  21.     }
  22.     return ans;
  23. }
复制代码
AC代码:

  1. #include<bits/stdc++.h>#define int long long#define lc p<<1#define rc p<<1|1#define endl '\n'using namespace std;const int N = 5e5+100,M = 1e1;const int INF = 4e18;const int mod=1<<20;typedef pair<int,int> PII;int w[N];struct node{    int l,r;    int sum1,sum0;    int lmx1,rmx1;    int rmx0,lmx0;    int lazy;}tr[N*4];void pushup(int p){    tr[p].sum1=max(max(tr[lc].sum1,tr[rc].sum1),tr[lc].rmx1+tr[rc].lmx1) ;    tr[p].sum0=max(max(tr[lc].sum0,tr[rc].sum0),tr[lc].rmx0+tr[rc].lmx0);    tr[p].lmx1=tr[lc].lmx1;    tr[p].rmx1=tr[rc].rmx1;    tr[p].lmx0=tr[lc].lmx0;    tr[p].rmx0=tr[rc].rmx0;    if(tr[lc].r-tr[lc].l+1==tr[lc].lmx1) tr[p].lmx1+=tr[rc].lmx1;    if(tr[rc].r-tr[rc].l+1==tr[rc].rmx1) tr[p].rmx1+=tr[lc].rmx1;    if(tr[lc].r-tr[lc].l+1==tr[lc].lmx0) tr[p].lmx0+=tr[rc].lmx0;    if(tr[rc].r-tr[rc].l+1==tr[rc].rmx0) tr[p].rmx0+=tr[lc].rmx0;}void pushdown(int p){    int ta=tr[p].lazy;    if(ta&1)    {        swap(tr[lc].sum0,tr[lc].sum1);        swap(tr[lc].lmx0,tr[lc].lmx1);        swap(tr[lc].rmx0,tr[lc].rmx1);         swap(tr[rc].lmx1,tr[rc].lmx0);        swap(tr[rc].sum0,tr[rc].sum1);        swap(tr[rc].rmx1,tr[rc].rmx0);         tr[lc].lazy+=ta;         tr[rc].lazy+=ta;        tr[p].lazy=0;    }}void build(int p,int l,int r){    tr[p]={l,r,w[l],w[l]^1,w[l],w[l],w[l]^1,0};    if(l==r) return ;    int mid=l+r>>1;    build(lc,l,mid);    build(rc,mid+1,r);    pushup(p);}void update1(int p,int l,int r){
  2.     if(l<=tr[p].l && r>=tr[p].r){
  3.         swap(tr[p].sum1,tr[p].sum0);
  4.         swap(tr[p].lmx1,tr[p].lmx0);
  5.         swap(tr[p].rmx1,tr[p].rmx0);
  6.         tr[p].lazy++;
  7.         return;
  8.     }
  9.     pushdown(p);
  10.     int mid=tr[p].l+tr[p].r>>1;
  11.     if(l<=mid) update1(lc,l,r);
  12.     if(r>mid) update1(rc,l,r);
  13.     pushup(p);
  14. }node query(int p,int l,int r){
  15.     if(l<=tr[p].l && tr[p].r<=r) return tr[p];
  16.     pushdown(p);
  17.     int mid=tr[p].l+tr[p].r>>1;
  18.     node x,y,ans;
  19.     if(r<=mid) ans = query(lc,l,r);
  20.     else if(l>mid) ans = query(rc,l,r);
  21.     else{
  22.         x = query(lc,l,mid);
  23.         y = query(rc,mid+1,r);
  24.         ans.sum1 = max({x.sum1,y.sum1,x.rmx1+y.lmx1});
  25.         ans.sum0 = max({x.sum0,y.sum0,x.rmx0+y.lmx0});
  26.         ans.lmx1=x.lmx1;
  27.         ans.lmx0=x.lmx0;
  28.         ans.rmx0=y.rmx0;
  29.         ans.rmx1=y.rmx1;
  30.         if(x.r-x.l+1==x.lmx1) ans.lmx1+=y.lmx1;
  31.         if(x.r-x.l+1==x.lmx0) ans.lmx0+=y.lmx0;
  32.         if(y.r-y.l+1==y.rmx1) ans.rmx1+=x.rmx1;
  33.         if(y.r-y.l+1==y.rmx0) ans.rmx0+=x.rmx0;
  34.     }
  35.     return ans;
  36. }void solve(){    int n,q;
  37.     cin>>n>>q;
  38.     for(int i=1;i<=n;i++){
  39.         w[i]=1;
  40.     }
  41.     build(1,1,n);    while(q--){        int op;        int l,r;        cin>>op;        if(op==1){            int x;            cin>>x;            update1(1,x,x);        }        else{            cin>>l>>r;            node ans;            ans = query(1,l,r);            cout<<ans.sum1<<endl;        }    }}signed main(){    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);    int T=1;    while(T--){        solve();    }    return 0;}
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

没腿的鸟

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表