9.5——模拟赛

悲催生活的开始

T1 #6090. 「Codeforces Round #418」尘封思绪

题目描述

理由さえも 忘れてた 淚で
哭泣的理由早已遗忘,泪水却依旧不止
凍りついた 想い出は 綺麗で
回忆早已冻结,但仍然美丽

给定两个整数序列 aaa 和 bbb,其中 bbb 的长度等于 aaa 中 000 出现的次数。另外,任意一个非零元素在 aaa 与 bbb 中出现次数总和不超过 111。

判断是否可以将 aaa 中为零的元素与 bbb 中的元素一一对应并替换,使得得到的序列 a′a'a​​ 不是一个递增序列。序列 a′a'a​​ 是递增序列当且仅当 ai′ai​​<ai+1​​ 对所有有意义的 iii 成立。

输入格式

输入的第一行包含两个空格分隔的正整数 nnn、kkk —— 分别为序列 aaa 与 bbb 的长度。

第二行包含 nnn 个空格分隔的整数 a1,a2,…,ana_1, a_2, \ldots, a_na1​​,a2​​,,an​​ —— 包含恰好 kkk 个 000 的序列 aaa。

第三行包含 kkk 个空格分隔的整数 b1,b2,…,bkb_1, b_2, \ldots, b_kb1​​,b2​​,,bk​​ —— 用以替换 aaa 中为零元素的序列 bbb。

输入保证任意一个非零元素在 aaa 与 bbb 中出现次数总和不超过 111。

输出格式

如果可以将 aaa 中等于零的元素与 bbb 中的元素一一对应并替换,使得得到的序列 a′a'a​​ 不是一个递增序列,输出 Yes;否则输出 No

样例

样例输入 1

4 2
11 0 0 14
5 4

样例输出 1

Yes

样例解释 1

在样例 1 中,通过将两个 000 以任意方式替换,得到的序列 11,5,4,1411, 5, 4, 1411,5,4,14 和 11,4,5,1411, 4, 5, 1411,4,5,14 都不是递增序列,因此答案为 Yes

样例输入 2

6 1
2 3 0 8 9 10
5

样例输出 2

No

样例解释 2

在样例 2 中,惟一能得到的序列 2,3,5,8,9,102, 3, 5, 8, 9, 102,3,5,8,9,10 是递增序列,因此答案为 No

样例输入 3

4 1
8 94 0 4
89

样例输出 3

Yes

样例输入 4

7 7
0 0 0 0 0 0 0
1 2 3 4 5 6 7

样例输出 4

Yes

数据范围与提示

2≤n≤1002 \leq n \leq 1002n100,1≤k≤n1 \leq k \leq n1kn
0≤ai≤2000 \leq a_i \leq 2000ai​​200
1≤bi≤2001 \leq b_i \leq 2001bi​​200

もう一度 もう二度と 云えない言葉は
一次也好,两次也罢,将说不出口的话语
幼いまま 優しいまま 悴んだ記憶
以最初的状态、以最温柔的状态,存入冻结了的记忆
                  ——「木枯らしセンティメント」

 

题解:把b从大的开始替换a中的0,这是最可能出现非递增的情况

 1 #include 
 2 #include 
 3 
 4 bool flag;
 5 int n,k,a[233],b[233];
 6 bool cmp(int a,int b)
 7 {
 8     return a>b;
 9 }
10 
11 inline void read(int &x)
12 {
13     x=0; register char ch=getchar();
14     for(;ch>'9'||ch<'0';) ch=getchar();
15     for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
16 }
17 
18 int AC()
19 {
20     read(n),read(k);
21     for(int i=1;i<=n;i++) read(a[i]);
22     for(int i=1;i<=k;i++) read(b[i]);
23     std::sort(b+1,b+k+1,cmp);
24     for(int i=1,j=1;i<=n;i++)
25         if(!a[i]) a[i]=b[j++];
26     for(int i=2;i<=n;i++)
27         if(a[i]-a[i-1]<=0)
28         {
29             flag=1;
30             break;
31         }
32     if(flag) puts("Yes");
33     else puts("No");
34     return 0;
35 }
36 
37 int Hope=AC();
38 int main(){;} 
AC Code

 

 

 

T2 #6091. 「Codeforces Round #418」幻想特快

题目描述

もうそうがね ぼうそうする
妄想变得天马行空
ちょうとっきゅうに とびのって いま あいにいきたいの
乘上超特快列车,现在就想去见你

有一个 111 至 nnn 的所有整数形成的排列 p1,p2,…,pnp_1, p_2, \ldots, p_np1​​,p2​​,,pn​​。

有两个长度为 nnn 的数组 a1,a2,…,ana_1, a_2, \ldots, a_na1​​,a2​​,,an​​ 和 b1,b2,…,bnb_1, b_2, \ldots, b_nb1​​,b2​​,,bn​​。它们分别有恰好 n−1n - 1n1 个位置上的元素与 ppp 相同,即存在恰好一个 iii(1≤i≤n1 \leq i \leq n1in)使得 ai≠pia_i \neq p_iai​​pi​​,存在恰好一个 jjj(1≤j≤n1 \leq j \leq n1jn)使得 bj≠pjb_j \neq p_jbj​​pj​​。另外,aaa 与 bbb 不相同,即存在至少一个 iii(1≤i≤n1 \leq i \leq n1in)使得 ai≠bia_i \neq b_iai​​bi​​。

请给出任意一个满足条件的排列 ppp。输入保证这样的排列存在。

输入格式

输入的第一行包含一个正整数 nnn —— ppp、aaa 和 bbb 共同的长度。

输入的第二行包含 nnn 个正整数 a1,a2,…,ana_1, a_2, \ldots, a_na1​​,a2​​,,an​​ —— 第一个数组的元素。

输入的第三行包含 nnn 个正整数 b1,b2,…,bnb_1, b_2, \ldots, b_nb1​​,b2​​,,bn​​ —— 第二个数组的元素。存在至少一个 iii(1≤i≤n1 \leq i \leq n1in)使得 ai≠bia_i \neq b_iai​​bi​​ 成立。

输出格式

输出一行,包含 nnn 个空格隔开的整数 p1,p2,…,pnp_1, p_2, \ldots, p_np1​​,p2​​,,pn​​,表示一个满足条件的排列。如果有多解,输出任意一组即可。输入保证合法的排列存在。

样例

样例输入 1

5
1 2 3 4 3
1 2 5 4 5

样例输出 1

1 2 5 4 3

样例解释 1

1,2,5,4,31, 2, 5, 4, 31,2,5,4,3 和 1,2,3,4,51, 2, 3, 4, 51,2,3,4,5 都是样例 1 的正确输出。

样例输入 2

5
4 4 2 3 1
5 4 5 3 1

样例输出 2

5 4 2 3 1

样例解释 2

5,4,2,3,15, 4, 2, 3, 15,4,2,3,1 是样例 2 的惟一解。

样例输入 3

4
1 1 3 4
1 4 3 4

样例输出 3

1 2 3 4

数据范围与提示

2≤n≤10002 \leq n \leq 1\,0002n1000
1≤ai≤n1 \leq a_i \leq n1ai​​n,1≤bi≤n1 \leq b_i \leq n1bi​​n

なにもしらない めをとじて
闭上眼睛,什么也不知道
かわいいままで ほしにねがった
保持可爱的样子,向着星星许下愿望
            ——「もうそう❤えくすぷれす」

 

题解:记录a b不同数值的位置,枚举没有出现过的数,

 1 #include 
 2 
 3 const int N(2333);
 4 int n,k,t,a[N],b[N],p[N];
 5 int cant_use[N],pos[N],cant[N],flag;
 6 
 7 inline void read(int &x)
 8 {
 9     x=0; register char ch=getchar();
10     for(;ch>'9'||ch<'0';) ch=getchar();
11     for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
12 }
13 
14 int AC()
15 {
16     read(n);
17     for(int i=1;i<=n;i++) read(a[i]);
18     for(int i=1;i<=n;i++)
19     {
20         read(b[i]);
21         if(a[i]==b[i])
22         {
23             p[i]=a[i];
24             cant_use[a[i]]=1;
25             cant[a[i]]=1;
26         }
27         else pos[++k]=i;
28     }
29     if(k>1)
30     {
31         for(int i=1;i<=k;i++)
32            for(int j=1;j<=n;j++)
33             if(!cant_use[j]&&((a[pos[i]]!=j&&b[pos[i]]==j)||(a[pos[i]]==j&&b[pos[i]]!=j)))
34             {
35               p[pos[i]]=j,cant_use[j]=1;
36               break;
37             }
38         for(int i=1;i<=n;i++) if(!p[i]) {flag=1;break;}
39         if(flag)
40         {
41             for(int i=1;i<=k;i++)
42                   for(int j=n;j>=1;j--)
43                 if(!cant[j]&&((a[pos[i]]!=j&&b[pos[i]]==j)||(a[pos[i]]==j&&b[pos[i]]!=j)))
44                 {
45                   p[pos[i]]=j,cant[j]=1;
46                   break;
47                 }
48         }
49     }
50     else
51     {
52         for(int i=1;i<=k;i++)
53            for(int j=1;j<=n;j++)
54             if(!cant_use[j]&&(a[pos[i]]!=j||b[pos[i]]!=j))
55             {
56               p[pos[i]]=j,cant_use[j]=1;
57               break;
58             }
59         for(int i=1;i<=n;i++) if(!p[i]) {flag=1;break;}
60         if(flag)
61         {
62             for(int i=1;i<=k;i++)
63                   for(int j=n;j>=1;j--)
64                 if(!cant[j]&&(a[pos[i]]!=j||b[pos[i]]!=j))
65                 {
66                   p[pos[i]]=j,cant[j]=1;
67                   break;
68                 }
69         }
70     }
71     
72     for(int i=1;i<=n;i++) printf("%d ",p[i]);
73     return 0;
74 }
75 
76 int Hope=AC();
77 int main(){;}
AC Code

可能没人比这个还麻烦了。。

 

 

 

T3 #6092. 「Codeforces Round #418」恋爱循环

题目描述

セーノ
预备、起

字符串 sss 对于字符 ccc 的权值,定义为 sss 中仅由 ccc 组成的最长连续子串的长度。例如,对于 s=kooomio,其由字符 o 组成的最长连续子串为 ooo,因此它对于字符 o 的权值为 333。

给定由小写字母组成的字符串 sss 以及 qqq 个询问。每个询问形如 (mi,ci)(m_i, c_i)(mi​​,ci​​),表示「求出在 sss 中至多更改 mim_imi​​ 个位置的字符后所得的字符串 s′s's​​ 对于字符 cic_ici​​ 的最大权值」。

输入格式

输入的第一行包含一个正整数 nnn —— 字符串 sss 的长度。

第二行包含 nnn 个小写英文字母组成的字符串 s1s2…sns_{1} s_2 \ldots s_ns1​​s2​​sn​​ —— 给定的初始字符串。

第三行包含一个正整数 qqq —— 询问的数目。

接下来 qqq 行,每行包含一个正整数 mim_imi​​ —— 至多在 sss 中更改的字符数目,和以一个空格分隔的小写字母 mim_imi​​ —— 计算权值时使用的字符。

输出格式

输出 qqq 行:对于每个询问输出一行,包含一个整数 —— 进行更改后所得字符串 s′s's​​ 的最大权值。

样例

样例输入 1

6
koyomi
3
1 o
4 o
4 m

样例输出 1

3
6
5

样例解释 1

在样例 1 中,有三个询问:

  • 在第一个询问中,最多可以更改 sss 一个位置上的字符,将 y 所处的位置改为 o 得到 s=kooomi,权值为 333;
  • 在第二个询问中,最多可以更改 sss 四个位置上的字符,s=oooooo 的权值为 666;
  • 在第三个询问中,最多可以更改 sss 四个位置上的字符,s=mmmmmi 和 s=kmmmmm 的权值均为 555。

样例输入 2

15
yamatonadeshiko
10
1 a
2 a
3 a
4 a
5 a
1 b
2 b
3 b
4 b
5 b

样例输出 2

3
4
5
7
8
1
2
3
4
5

样例输入 3

10
aaaaaaaaaa
2
10 b
10 z

样例输出 3

10
10

数据范围与提示

1≤n≤15001 \leq n \leq 1\,5001n1500
1≤q≤2000001 \leq q \leq 200\,0001q200000
1≤mi≤n1 \leq m_i \leq n1mi​​n,cic_ici​​ 为小写英文字母

コイスル キセツハ ヨクバリ サーキュレーション
恋爱的季节是激情洋溢的循环
コイスル キモチハ ヨクバリ サーキュレーション
恋爱的心情是激情洋溢的循环
            ——「恋愛サーキュレーション」

 

 1 #include 
 2 #include 
 3 
 4 const int N(1526);
 5 int n,m,ans,k;
 6 char s[N],r[N],x;
 7 bool vis[N];
 8 
 9 #define max(a,b) (a>b?a:b)
10 inline void read(int &x)
11 {
12     x=0; register char ch=getchar();
13     for(;ch>'9'||ch<'0';) ch=getchar();
14     for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
15 }
16 
17 int check(int pos)
18 {
19     int o=0;
20     while(pos<=n)
21     {
22         if(r[pos]==x) ++o,++pos;
23         else break;
24     }
25     ans=max(ans,o);
26     return pos;
27 }
28 
29 void dfs(int pos,int num)
30 {
31     if(num==k)
32     {
33         for(int i=1;i<=n;i++) i=check(i);
34         return;
35     }
36     if(pos>n||n-pos+1return;
37     for(int i=pos;i<=n;i++)
38     {
39         if(vis[i]) continue;
40         char u=r[i];
41         if(r[i]!=x)
42         {
43             r[i]=x;
44             dfs(i+1,num+1);
45             r[i]=u;
46         }
47         if(i1,num);
48     }
49     if(!num) vis[pos]=true;
50     return;
51 }
52 
53 int AC()
54 {
55     read(n);
56     scanf("%s",s+1);
57     for(int i=1;i<=n;i++) r[i]=s[i];
58     read(m);
59     for(int i=1;i<=m;i++)
60     {
61         read(k); scanf("%c",&x);
62         memset(vis,false,sizeof vis);
63         ans=0; dfs(1,0); check(1);
64         printf("%d\n",ans);
65     }
66     return 0;
67 }
68 
69 int Hope=AC();
70 int main(){;}
TLE 的 19分暴力

 题解:二分最大的字串长度,处理每个字母在[1,i]的出现次数 枚举最大长度的子串的位置。

 1 #include 
 2 #include 
 3 
 4 const int N(1526);
 5 int n,f[27][N],a[N];
 6 std::map<char,bool>ma;
 7 char s[N];
 8 
 9 inline void read(int &x)
10 {
11     x=0; register char ch=getchar();
12     for(;ch>'9'||ch<'0';) ch=getchar();
13     for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
14 }
15 
16 #define max(a,b) (a>b?a:b)
17 #define min(a,b) (a18 
19 int l,r,mid,cnt,ans;
20 bool check(int num,char zm,int len)
21 {
22     int nowlen=0,cnt=0;
23     int zmth=zm-'a';
24     for(int i=1;i<=n-len+1;i++)
25         if(f[zmth][i+len-1]-f[zmth][i-1]>=len-num) return true;
26     return false;
27 }
28 
29 int AC()
30 {
31     read(n); scanf("%s",s+1);
32     for(int i=1;i<=n;i++)
33       for(int j=0;j<26;j++)
34       {
35         f[j][i]+=f[j][i-1];
36           if(s[i]-'a'==j) f[j][i]++;
37       }
38     int q,x; read(q);
39     for(char ch[2];q--;)
40     {
41         read(x); scanf("%s",ch);
42         for(l=0,r=n+1;l<=r;)
43         {
44             mid=l+r>>1;
45             if(check(x,ch[0],mid))
46             {
47                 ans=mid;
48                 l=mid+1;
49             }
50             else r=mid-1;
51         }
52         printf("%d\n",ans);
53     }
54     return 0;
55 }
56 
57 int Hope=AC();
58 int main(){;}
View Code

转载于:https://www.cnblogs.com/Shy-key/p/7477935.html

你可能感兴趣的:(9.5——模拟赛)