2019 计蒜之道 复赛

A题:外教 Michale 变身大熊猫

题目链接:https://nanti.jisuanke.com/t/39611

题解:

1#include<bits/stdc++.h> 2using namespace std; 3typedef long long LL; 4const int maxx = 5e5+10; 5const int mod = 998244353; 6struct node{LL len,num;}tree[maxx]; 7int a[maxx],s[maxx]; 8LL len1[maxx],len2[maxx],num1[maxx],num2[maxx]; 9LL dp[maxx]; 10int n; 11LL inv(LL x) 12{ 13 LL b=mod-2,ans=1; 14 while(b) 15 { 16 if(b&1)ans=(ans*x)%mod; 17 x=(x*x)%mod; 18 b>>=1; 19 } 20 return ans; 21} 22void up(int x,node t) 23{ 24 for(int i=x;i<=n;i+=(i&(-i))) 25 { 26 if(tree[i].len<t.len)tree[i]=t; 27 else if(tree[i].len==t.len)tree[i].num+=t.num,tree[i].num%=mod; 28 //注意这里也要取一下模 29 } 30} 31node getmax(int x) 32{ 33 node res; 34 res.len=0;res.num=1; 35 for(int i=x;i>0;i-=(i&(-i))) 36 { 37 if(res.len<tree[i].len)res=tree[i]; 38 else if(res.len==tree[i].len)res.num+=tree[i].num,res.num%=mod; 39 //注意这里也要取一下模 40 } 41 return res; 42} 43int main() 44{ 45 scanf("%d",&n); 46 for(int i=1;i<=n;i++) 47 { 48 scanf("%d",&a[i]); 49 s[i]=a[i]; 50 tree[i].len=tree[i].num=0; 51 } 52 sort(s+1,s+1+n); 53 int t=unique(s+1,s+1+n)-s; 54 node ans; 55 ans.len=ans.num=0; 56 int sum=0; 57 for(int i=1;i<=n;i++) 58 { 59 a[i]=lower_bound(s+1,s+t,a[i])-s;//离散化 60 node temp=getmax(a[i]-1); 61 temp.len++; 62 up(a[i],temp); 63 len1[i]=temp.len;num1[i]=temp.num; 64 //cout<<len1[i]<<' '<<num1[i]<<endl; 65 if(ans.len<temp.len)ans=temp; 66 else if(ans.len==temp.len)ans.num+=temp.num,ans.num%=mod; 67 sum=max(sum,a[i]); 68 } 69 for(int i=1;i<=n;i++) 70 tree[i].len=tree[i].num=0; 71 for(int i=n;i>=1;i--) 72 { 73 a[i]=a[i]*(-1)+sum+1; 74 //cout<<a[i]<<endl; 75 node temp=getmax(a[i]-1); 76 temp.len++; 77 up(a[i],temp); 78 len2[i]=temp.len;num2[i]=temp.num; 79 //cout<<len2[i]<<' '<<num2[i]<<endl; 80 } 81 LL q=inv(ans.num); 82 for(int i=1;i<=n;i++) 83 { 84 if(len1[i]+len2[i]==ans.len+1)printf("%lld ",num1[i]*num2[i]%mod*q%mod); 85 else printf("0 "); 86 } 87 return 0; 88}

View Code

B题:个性化评测系统

题目链接:https://nanti.jisuanke.com/t/39612

直接暴力,枚举每一张牌判断可不可以胡,判断的时候要先枚举对子并删去再判断可不可行,有一种可行就说明这张牌可以胡

1#include<bits/stdc++.h> 2using namespace std; 3int ff(int *a) 4{ 5 for(int i=1;i<=7;i++) 6 if(a[i]==1||a[i]==2)return 0; 7 return 1; 8} 9int f(int *a) 10{ 11 int s[20]; 12 for(int i=1;i<=9;i++) 13 s[i]=a[i]; 14 for(int j=1;j<=7;j++) 15 { 16 if(s[j]>=3)s[j]-=3; 17 if(s[j]==1) 18 { 19 if(s[j+1]&&s[j+2]) 20 { 21 s[j+1]--;s[j+2]--; 22 } 23 else return 0; 24 } 25 if(s[j]==2) 26 { 27 if(s[j+1]>=2&&s[j+2]>=2) 28 { 29 s[j+1]-=2;s[j+2]-=2; 30 } 31 else return 0; 32 } 33 } 34 if(s[8]==1||s[8]==2||s[9]==1||s[9]==2)return 0; 35 return 1; 36} 37int see(int *a,int *b,int *c,int *d) 38{ 39 int s[20],p[20],m[20],z[20]; 40 int flag; 41 for(int i=1;i<=9;i++) 42 { 43 for(int j=1;j<=9;j++) 44 { 45 s[j]=a[j];p[j]=b[j];m[j]=c[j];z[j]=d[j]; 46 } 47 if(s[i]>=2)s[i]-=2;//枚举并删去对子 48 if(f(s)&&f(p)&&f(m)&&ff(z))return 1; 49 } 50 for(int i=1;i<=9;i++) 51 { 52 for(int j=1;j<=9;j++) 53 { 54 s[j]=a[j];p[j]=b[j];m[j]=c[j];z[j]=d[j]; 55 } 56 if(p[i]>=2)p[i]-=2; 57 if(f(s)&&f(p)&&f(m)&&ff(z))return 1; 58 } 59 for(int i=1;i<=9;i++) 60 { 61 for(int j=1;j<=9;j++) 62 { 63 s[j]=a[j];p[j]=b[j];m[j]=c[j];z[j]=d[j]; 64 } 65 if(m[i]>=2)m[i]-=2; 66 if(f(s)&&f(p)&&f(m)&ff(z))return 1; 67 } 68 for(int i=1;i<=9;i++) 69 { 70 for(int j=1;j<=9;j++) 71 { 72 s[j]=a[j];p[j]=b[j];m[j]=c[j];z[j]=d[j]; 73 } 74 if(z[i]>=2)z[i]-=2; 75 if(f(s)&&f(p)&&f(m)&&ff(z))return 1; 76 } 77 return 0; 78} 79int main() 80{ 81 char ch[5]; 82 while(cin>>ch) 83 { 84 int s[20]={0},p[20]={0},m[20]={0},z[20]={0}; 85 if(ch[1]=='s')s[ch[0]-'0']++; 86 if(ch[1]=='p')p[ch[0]-'0']++; 87 if(ch[1]=='m')m[ch[0]-'0']++; 88 if(ch[1]=='z')z[ch[0]-'0']++; 89 for(int i=2;i<=13;i++) 90 { 91 cin>>ch; 92 if(ch[1]=='s')s[ch[0]-'0']++; 93 if(ch[1]=='p')p[ch[0]-'0']++; 94 if(ch[1]=='m')m[ch[0]-'0']++; 95 if(ch[1]=='z')z[ch[0]-'0']++; 96 } 97 for(int i=1;i<=9;i++) 98 { 99 if(m[i]>=4)continue; 100 m[i]++; 101 if(see(s,p,m,z))printf("%dm\n",i); 102 m[i]--; 103 } 104 for(int i=1;i<=9;i++) 105 { 106 if(s[i]>=4)continue; 107 s[i]++; 108 if(see(s,p,m,z))printf("%ds\n",i); 109 s[i]--; 110 } 111 for(int i=1;i<=9;i++) 112 { 113 if(p[i]>=4)continue; 114 p[i]++; 115 if(see(s,p,m,z))printf("%dp\n",i); 116 p[i]--; 117 } 118 for(int i=1;i<=7;i++) 119 { 120 if(z[i]>=4)continue; 121 z[i]++; 122 if(see(s,p,m,z))printf("%dz\n",i); 123 z[i]--; 124 } 125 } 126 return 0; 127} 128/*3m 3m 3m 4m 5m 6m 6m 6m 1z 1z 1z 2z 2z 1291p 1p 1p 4p 5p 6p 9p 9p 9p 8p 8p 8p 8p 1301s 1s 1s 1s 2s 2s 2s 2s 3p 3p 3p 5p 5p 1311s 1s 2s 3s 5s 5s 6s 6s 7s 7s 7s 8s 9s 1321s 1s 1s 2s 3s 4s 5s 6s 7s 8s 9s 9s 9s*/

View Code

D题:“星云系统”

题目链接:https://nanti.jisuanke.com/t/39614

第一种解法:用单调栈

1#include<bits/stdc++.h> 2using namespace std; 3stack<char>q; 4char a[5000010],b[5000010]; 5int main() 6{ 7 scanf("%s",a); 8 int s=strlen(a); 9 int k; 10 scanf("%d",&k); 11 q.push(a[0]); 12 for(int i=1;i<s;i++) 13 { 14 while(!q.empty()) 15 { 16 char t=q.top(); 17 if(t<=a[i]) 18 { 19 //q.push(a[i]); 20 break; 21 } 22 else 23 { 24 if(s-i+q.size()>k)q.pop(); 25 else break; 26 } 27 } 28 q.push(a[i]); 29 } 30 int t=0; 31 while(!q.empty()) 32 { 33 b[++t]=q.top();q.pop(); 34 } 35 for(int i=t;i>t-k;i--) 36 printf("%c",b[i]); 37 return 0; 38}

View Code

第二种解法:用26个vector存字母位置然后暴力,好像叫序列自动机

1#include<bits/stdc++.h> 2using namespace std; 3const int maxx = 5e6+10; 4vector<int>q[30]; 5char a[maxx]; 6int pos[30],len; 7int find(int i,int s)//pos[i]用来标记用过的位置 8{ 9 while(q[i][pos[i]]<s && pos[i]<q[i].size()) 10 pos[i]++; 11 return q[i][pos[i]]; 12} 13void dfs(int s,int k)//s为当前位置 14{ 15 if(!k)return; 16 for(int i=0;i<26;i++) 17 { 18 int t=find(i,s); 19 if(t>=s&&len-t+1>=k) 20 { 21 printf("%c",i+'a'); 22 dfs(t+1,k-1); 23 return; 24 } 25 } 26} 27int main() 28{ 29 for(int i=0;i<26;i++)q[i].push_back(0); 30 scanf("%s",a+1); 31 len=strlen(a+1); 32 for(int i=1;i<=len;i++) 33 q[a[i]-'a'].push_back(i); 34 int k; 35 scanf("%d",&k); 36 dfs(1,k); 37 return 0; 38}

View Code

E题:撑起信息安全“保护伞

题目链接:https://nanti.jisuanke.com/t/39615

题解:

就是找 ")(" 和 合法的"()"

1#include<bits/stdc++.h> 2using namespace std; 3const int maxx = 1e6+10; 4char a[maxx],b[maxx]; 5stack<char>q; 6int main() 7{ 8 scanf("%s",a); 9 int s=strlen(a); 10 strcpy(b,a); 11 int flag=0; 12 for(int i=s-1;i>=1;i--) 13 { 14 if(b[i]=='('&&b[i-1]==')')//找")(" 15 { 16 b[i]=')';b[i-1]='('; 17 int t=0; 18 for(int j=i+1;j<s;j++) 19 { 20 if(b[j]=='(')q.push(b[j]); 21 else 22 { 23 if(b[j]==')'&&!q.empty())q.pop(); 24 else if(b[j]==')'&&q.empty())t++; 25 } 26 } 27 for(int j=i+1;j<i+1+t;j++) 28 b[j]=')'; 29 for(int j=i+1+t;j<s-1;j+=2) 30 b[j]='(',b[j+1]=')'; 31 flag=1;break; 32 } 33 } 34 if(flag)printf("%s\n",b); 35 else 36 { 37 for(int i=0;i<s-2;i+=2) 38 printf("()"); 39 printf("\n"); 40 } 41 strcpy(b,a); 42 flag=0; 43 for(int i=s-1;i>=1;i--) 44 { 45 if(b[i]==')'&&b[i-1]=='(')//找交换后合法的"()" 46 { 47 while(!q.empty())q.pop(); 48 b[i]='(';b[i-1]=')'; 49 int j; 50 for(j=0;j<s;j++) 51 { 52 if(b[j]=='(')q.push(b[j]); 53 else 54 { 55 if(b[j]==')'&&!q.empty())q.pop(); 56 else break; 57 } 58 } 59 if(j<s||!q.empty())b[i]=')',b[i-1]='('; 60 else 61 { 62 int t=0; 63 for(int k=i+1;k<s;k++) 64 if(b[k]=='(')t++; 65 for(int k=i+1;k<i+1+t;k++)b[k]='('; 66 for(int k=i+1+t;k<s;k++)b[k]=')'; 67 flag=1;break; 68 } 69 } 70 } 71 if(flag==1)printf("%s",b); 72 else 73 { 74 s=s+2; 75 for(int i=1;i<=s/2;i++) 76 printf("("); 77 for(int i=s/2+1;i<=s;i++) 78 printf(")"); 79 } 80 return 0; 81} 82/*((((()))))()()()()(()) 83((()())())*/

View Code

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

2019 计蒜之道 复赛 - HelloWorld