• Pinely Round 1 (Div. 1 + Div. 2)


    比赛链接:Dashboard - Pinely Round 1 (Div. 1 + Div. 2) - Codeforces

    A:思维

    题意:定义了一个序列,给定了三个整数n,a,b。问能否构造两个长度为n的序列,使得它们的最长前缀的长度为a,最长后缀为b。能构造则YES,否则NO

    思路:认真读题你就会发现。a和b是有关系的。为什么?

    仔细思考一下,要使得前缀长度为a,两个序列在a+1位置上的数就必须要不同,从而断开,使得前缀长度为a。后缀也同理。

    那么,断开的条件是什么?才能使得构造成功呢?

    结论:m>=2。为什么?

    必须满足a+1为断点,b-1为断点才能构造成功。

    当然,这里还有一个特判

    当n=a=b,那么就说明两个序列是相同的,一定可以构造成功 

    代码:

    1. #include
    2. #define all(v) v.begin(),v.end()
    3. #define int long long
    4. #define fast ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    5. #define pi acos(-1)
    6. using namespace std;
    7. const int INF=0x3f3f3f3f;
    8. const int N=1e3+10;
    9. typedef pair<int,int>PII;
    10. inline void solve(){
    11. int n,a,b;cin>>n>>a>>b;
    12. if(n==a&&n==b){
    13. cout<<"Yes\n";return;
    14. }
    15. if(n-(a+b)>=2) cout<<"Yes\n";
    16. else cout<<"No\n";
    17. }
    18. signed main(){
    19. fast;
    20. int T;cin>>T;
    21. while(T--) solve();
    22. }

    B:结论

    题意:给定一个环形数组,每次可以删除一个数,删除后的位置会合并掉。如果合并后存在两个相同的数字相邻,那么其中一个数会被立刻消除。每次操作可以删除一个数,求最多消除几次可以使得数组为空。

    结论:

    数的种类>=3,ans=n

    数的种类==2,ans=\frac{n}{2}+1

    数的种类==1,ans=1

    代码:

    1. #include
    2. #define all(v) v.begin(),v.end()
    3. #define int long long
    4. #define fast ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    5. #define pi acos(-1)
    6. using namespace std;
    7. const int INF=0x3f3f3f3f;
    8. const int N=1e3+10;
    9. typedef pair<int,int>PII;
    10. inline void solve(){
    11. int n;cin>>n;
    12. int cnt=0;//记录种类数
    13. map<int,int>mp;
    14. for(int i=1;i<=n;i++){
    15. int x;cin>>x;
    16. if(mp[x]==0) cnt++;
    17. mp[x]++;
    18. }
    19. if(n==1) cout<<"1\n";
    20. else if(cnt==2) cout<2+1<<"\n";
    21. else if(cnt>=3) cout<"\n";
    22. }
    23. signed main(){
    24. fast;
    25. int T;cin>>T;
    26. while(T--) solve();
    27. }

    C:构造

    题意:给定一个 n∗n 的 01 矩阵,要求构造 n 个满足要求的集合 A1,A2,A3,...,An ,使得 bij=1 的时候,集合 Ai 是集合 Aj 的真子集。

    思路:先扫一遍矩阵。当碰见{b_{ij}}^{}=1的时候 ,我们就将Ai中的元素全部放进Aj中。在放的时候,会出现Ai中的元素被更新的情况,这个时候再扫一遍即可。

    代码:

    1. #include
    2. #define all(v) v.begin(),v.end()
    3. #define int long long
    4. #define fast ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    5. #define pi acos(-1)
    6. using namespace std;
    7. const int INF=0x3f3f3f3f;
    8. const int N=1e3+10;
    9. typedef pair<int,int>PII;
    10. char b[N][N];
    11. inline void solve(){
    12. set<int>se[N];
    13. int n;cin>>n;
    14. for(int i=1;i<=n;i++){
    15. for(int j=1;j<=n;j++){
    16. cin>>b[i][j];
    17. se[i].insert(i);//给Ai一个初始值
    18. }
    19. }
    20. for(int i=1;i<=n;i++){
    21. for(int j=1;j<=n;j++){
    22. if(b[i][j]=='1'){
    23. for(auto x:se[i]){
    24. se[j].insert(x);//满足条件的情况下:将Ai放入Aj中
    25. }
    26. }
    27. }
    28. }
    29. for(int i=1;i<=n;i++){
    30. for(int j=1;j<=n;j++){
    31. if(b[i][j]=='1'){
    32. for(auto x:se[i]){
    33. se[j].insert(x);//放在A更新,再放入一次
    34. }
    35. }
    36. }
    37. }
    38. for(int i=1;i<=n;i++){//输出即可
    39. cout<size()<<" ";
    40. for(auto x:se[i]){
    41. cout<" ";
    42. }
    43. cout<<"\n";
    44. }
    45. }
    46. signed main(){
    47. fast;
    48. int T;cin>>T;
    49. while(T--) solve();
    50. }

     

  • 相关阅读:
    【NGINX--2】高性能负载均衡
    Flask学习笔记(七)
    连续词袋模型(Continous bag of words, CBOW)
    荧光EEM平滑教程(去除散射)
    java计算机毕业设计ssm+vue杂货网络销售及配送系统
    AirtestIDE编辑窗内,脚本内容消失,显示一片红色怎么办?
    人工智能引领环境保护的新浪潮:技术应用及其影响
    数据结构与算法
    分布式架构 服务容器化Docker
    算法与数据结构-贪心算法
  • 原文地址:https://blog.csdn.net/YuDuna/article/details/128162321