题解——Codeforces Round #508 (Div. 2) T2 (构造)

按照题意构造集合即可

注意无解情况的判断

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <map>
using namespace std;
int n,sum;
int main(){
  scanf("%d",&n);
  if(n==1){
    printf("No\n");
    return 0;
  }
  sum=(n+1)*n/2;
//  printf("%d\n",sum);
  for(int i=2;i<=sum;i++){
      for(int j=1;j<=sqrt(i);j++){
        if(i%j==0){
        if(j!=i/j){
        if(j!=1&&sum!=i){
            if((sum-i)%j==0){
              vector<int> ax,bx;
              int cnta=0,cntb=0;
              int now=n;
              for(int k=i;k>0;){
                if(k>=now){
                  k-=now;
                  cnta++;
                  ax.push_back(now);
                  now--;
                }
              else{
                cntb++;
                bx.push_back(now);
                now--;
                }
              }
              while(now){
                bx.push_back(now);
                now--;
                cntb++;
              }
              printf("Yes\n");
              printf("%d ",cnta);
              for(int i=0;i<ax.size();i++)
                printf("%d ",ax[i]);
              printf("\n");
              printf("%d ",cntb);
              for(int i=0;i<bx.size();i++)
                printf("%d ",bx[i]);
              printf("\n");
              return 0;
            }
          }
        if(i/j!=1&&sum!=i){
          if((sum-i)%(i/j)==0){
            vector<int> ax,bx;
            int cnta=0,cntb=0;
              int now=n;
              for(int k=i;k>0;){
                if(k>=now){
                  k-=now;
                  cnta++;
                  ax.push_back(now);
                  now--;
                }
              else{
                cntb++;
                bx.push_back(now);
                now--;
                }
              }
              while(now){
                bx.push_back(now);
                now--;
                cntb++;
              }
              printf("Yes\n");
              printf("%d ",cnta);
              for(int i=0;i<ax.size();i++)
                printf("%d ",ax[i]);
              printf("\n");
              printf("%d ",cntb);
              for(int i=0;i<bx.size();i++)
                printf("%d ",bx[i]);
              printf("\n");
              return 0;
            }
          }
        }
      else{
        if(j!=1&&i!=sum)
          if((sum-i)%j==0){
            vector<int> ax,bx;
            int cnta=0,cntb=0;
              int now=n;
              for(int k=i;k>0;){
                if(k>=now){
                  k-=now;
                  cnta++;
                  ax.push_back(now);
                  now--;
                }
              else{
                cntb++;
                bx.push_back(now);
                now--;
                }
              }
            while(now){
              bx.push_back(now);
              now--;
              cntb++;
            }
            printf("Yes\n");
            printf("%d ",cnta);
            for(int i=0;i<ax.size();i++)
              printf("%d ",ax[i]);
            printf("\n");
            printf("%d ",cntb);
            for(int i=0;i<bx.size();i++)
              printf("%d ",bx[i]);
            printf("\n");
            return 0;
          }
        }
      }
    }
  }
  printf("No\n");
  return 0;
}

原文地址:https://www.cnblogs.com/dreagonm/p/9602507.html

时间: 2024-11-09 17:25:14

题解——Codeforces Round #508 (Div. 2) T2 (构造)的相关文章

题解——Codeforces Round #508 (Div. 2) T1 (模拟)

依照题意暴力模拟即可A掉 #include <cstdio> #include <algorithm> #include <cstring> #include <set> using namespace std; char s[100100]; int n,k,barrel[30]; int main(){ scanf("%d %d",&n,&k); scanf("%s",s+1); for(int i

题解——Codeforces Round #508 (Div. 2) T3 (贪心)

贪心的选取最优解 然后相减好 记得要开long long #include <cstdio> #include <algorithm> #include <cstring> #include <set> #include <queue> #define int long long using namespace std; int ansa=0,ansb=0,posa=1,posb=1,n,a[1000100],b[1000100]; bool c

Codeforces Round #306 (Div. 2) (构造)

A. Two Substrings 题意:给一个字符串,求是否含有不重叠的子串"AB"和"BA",长度1e5. 题解:看起来很简单,但是一直错,各种考虑不周全,最后只能很蠢的暴力,把所有的AB和BA的位置求出来,能有一对AB和BA不重叠即可. 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 char a[100005]; 5 vector<int> ab; 6 vector<i

CF1103C Johnny Solving (Codeforces Round #534 (Div. 1)) 思维+构造

题目传送门 https://codeforces.com/contest/1103/problem/C 题解 这个题还算一个有难度的不错的题目吧. 题目给出了两种回答方式: 找出一条长度 \(\geq \frac nk\) 的路径: 找出 \(k\) 个简单环,满足长度不是 \(3\) 的倍数,并且每个环至少存在一个点不在别的环中. 很显然题目并不是要你随便挑一种回答方式开始单独研究.最有可能的情况是两种回答方式可以替补. 如果我们随便作出原图的一棵生成树,如果最长的路径长度 \(\geq \f

题解Codeforces Round #595 (Div. 3)(CF1249)

开题1小时(雾)严重影响我的提交以及做题心情..我刚开题就发现有人阿克了.. 实际上这场div3真心简单良心很休闲. A:送分题,先排序,每次枚举一下这个数可以加到哪个集合里,加进去就行. 1 #include<stdio.h> 2 #include<algorithm> 3 #define it register int 4 #define il inline 5 using namespace std; 6 const int N=1000005; 7 int a[N],o[N

Codeforces Round #604 (Div. 2)D(构造)

构造,枚举起点,如果一个序列成立,那么将它reverse依然成立,所以两个方向(从小到大或从大到小)没有区别,选定一个方向进行探测,直到探测不到以后回头,只要所给数据能成立,那么能探测进去就能探测出来,否则就不能构造. 1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 int num[7]; 5 int sum; 6 int main(){ 7 ios::sync_with_std

题解Codeforces Round #597 (Div. 2)

A:送分,裸的gcd. 1 #include<stdio.h> 2 #define il inline 3 #define it register int 4 int T,a,b,d; 5 il void gcd(int a,int b){ 6 if(!b){d=a;return;} 7 gcd(b,a%b); 8 } 9 il void fr(int &num){ 10 num=0;char c=getchar();int p=1; 11 while(c<'0'||c>'

题解 Codeforces Round #615 (Div. 3) (CF1294)

A:判断一下和是不是3的倍数,由于只加不减,所以还要判断有没有大于和的1/3. 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #define it register int 5 #define ct const int 6 #define il inline 7 using namespace std; 8 int T,a,b,c,n,x; 9 namespace io{ 10 il c

Codeforces Round #508 (Div. 2)

A char s[100005]; int cnt[26]; void test_case() { int n, k; scanf("%d%d%s", &n, &k, s + 1); for(int i = 1; i <= n; ++i) ++cnt[s[i] - 'A']; int minL = INF; for(int i = 0; i < k; ++i) minL = min(minL, cnt[i]); printf("%d\n"