Educational Codeforces Round 65 (Rated for Div. 2)(ACD)B是交互题,不怎么会
A. Telephone Number
A telephone number is a sequence of exactly 11 digits, where the first digit is 8. For example, the sequence 80011223388 is a telephone number, but the sequences 70011223388 and 80000011223388 are not.
You are given a string ss of length nn, consisting of digits.
In one operation you can delete any character from string ss. For example, it is possible to obtain strings 112, 111 or 121 from string 1121.
You need to determine whether there is such a sequence of operations (possibly empty), after which the string ss becomes a telephone number.
The first line contains one integer tt (1≤t≤1001≤t≤100) — the number of test cases.
The first line of each test case contains one integer nn (1≤n≤1001≤n≤100) — the length of string ss.
The second line of each test case contains the string ss (|s|=n|s|=n) consisting of digits.
For each test print one line.
If there is a sequence of operations, after which ss becomes a telephone number, print YES.
Otherwise, print NO.
2 13 7818005553535 11 31415926535
YES NO
In the first test case you need to delete the first and the third digits. Then the string 7818005553535 becomes 88005553535.
这个分一下是否满足11位,如果大于11位,只需要判断除去后10位前面是否有8即可
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<set> #include<map> #include<algorithm> #include<vector> const int maxn=1e5+5; typedef long long ll; using namespace std; int main() { int T; cin>>T; string str; int n; while(T--) { cin>>n; cin>>str; int len=str.length(); if(len>11) { int flag=0; for(int t=len-11;t>=0;t--) { if(str[t]=='8') { flag=1; break; } } if(flag) { cout<<"YES"<<endl; } else { cout<<"NO"<<endl; } } else if(len==11) { if(str[0]=='8') { cout<<"YES"<<endl; } else { cout<<"NO"<<endl; } } else { cout<<"NO"<<endl; } } return 0; }
C. News Distribution
In some social network, there are nn users communicating with each other in mm groups of friends. Let's analyze the process of distributing some news between users.
Initially, some user xx receives the news from some source. Then he or she sends the news to his or her friends (two users are friends if there is at least one group such that both of them belong to this group). Friends continue sending the news to their friends, and so on. The process ends when there is no pair of friends such that one of them knows the news, and another one doesn't know.
For each user xx you have to determine what is the number of users that will know the news if initially only user xx starts distributing it.
The first line contains two integers nn and mm (1≤n,m≤5⋅1051≤n,m≤5⋅105) — the number of users and the number of groups of friends, respectively.
Then mm lines follow, each describing a group of friends. The ii-th line begins with integer kiki (0≤ki≤n0≤ki≤n) — the number of users in the ii-th group. Then kiki distinct integers follow, denoting the users belonging to the ii-th group.
It is guaranteed that ∑i=1mki≤5⋅105∑i=1mki≤5⋅105.
Print nn integers. The ii-th integer should be equal to the number of users that will know the news if user ii starts distributing it.
7 5 3 2 5 4 0 2 1 2 1 1 2 6 7
4 4 1 4 4 2 2
裸的并查集
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<set> #include<vector> #include<map> #include<cmath> const int maxn=5e5+5; typedef long long ll; using namespace std; int pre[maxn]; int find(int x) { if(x==pre[x]) { return x; } else { return pre[x]=find(pre[x]); } } void Merge(int x,int y) { int xx=find(x); int yy=find(y); if(xx!=yy) { pre[xx]=yy; } } int a[maxn]; int main() { int n,m; cin>>n>>m; int x; for(int t=1;t<=n;t++) { pre[t]=t; } int s1,s2; for(int t=0;t<m;t++) { scanf("%d",&x); if(x!=0) scanf("%d",&s1); for(int j=1;j<x;j++) { scanf("%d",&s2); Merge(s1,s2); s1=s2; } } int ans=0; memset(a,0,sizeof(a)); for(int t=1;t<=n;t++) { a[find(t)]++; } for(int t=1;t<=n;t++) { printf("%d ",a[find(t)]); } return 0; }
A string is called bracket sequence if it does not contain any characters other than "(" and ")". A bracket sequence is called regular(shortly, RBS) if it is possible to obtain correct arithmetic expression by inserting characters "+" and "1" into this sequence. For example, "", "(())" and "()()" are RBS and ")(" and "(()" are not.
We can see that each opening bracket in RBS is paired with some closing bracket, and, using this fact, we can define nesting depth of the RBS as maximum number of bracket pairs, such that the 22-nd pair lies inside the 11-st one, the 33-rd one — inside the 22-nd one and so on. For example, nesting depth of "" is 00, "()()()" is 11 and "()((())())" is 33.
Now, you are given RBS ss of even length nn. You should color each bracket of ss into one of two colors: red or blue. Bracket sequence rr, consisting only of red brackets, should be RBS, and bracket sequence, consisting only of blue brackets bb, should be RBS. Any of them can be empty. You are not allowed to reorder characters in ss, rr or bb. No brackets can be left uncolored.
Among all possible variants you should choose one that minimizes maximum of rr's and bb's nesting depth. If there are multiple solutions you can print any of them.
The first line contains an even integer nn (2≤n≤2⋅1052≤n≤2⋅105) — the length of RBS ss.
The second line contains regular bracket sequence ss (|s|=n|s|=n, si∈{si∈{"(", ")"}}).
Print single string tt of length nn consisting of "0"-s and "1"-s. If titi is equal to 0 then character sisi belongs to RBS rr, otherwise sisi belongs to bb.
2 ()
11
4 (())
0101
10 ((()())())
0110001111
In the first example one of optimal solutions is s=s= "()()". rr is empty and b=b= "()()". The answer is max(0,1)=1max(0,1)=1.
In the second example it's optimal to make s=s= "(())(())". r=b=r=b= "()()" and the answer is 11.
In the third example we can make s=s= "((()())())((()())())". r=r= "()()()()" and b=b= "(()())(()())" and the answer is 22.
思维,我们维护一下使得两个的深度尽可能的小,也就是当其中一个大的时候,就往另一个补,以此类推
代码:
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<queue> #include<stack> #include<set> #include<vector> #include<map> #include<cmath> const int maxn=2e5+5; typedef long long ll; using namespace std; char str[maxn]; int main() { int n; cin>>n; scanf("%s",str); int s1=0,s2=0; int a[maxn]; for(int t=0;t<n;t++) { if(str[t]=='(') { if(s1<s2) { s1++; a[t]=0; } else { s2++; a[t]=1; } } else { if(s1<s2) { s2--; a[t]=1; } else { s1--; a[t]=0; } } } for(int t=0;t<n;t++) { printf("%d",a[t]); } return 0; }
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!