2019 CCPC-Wannafly Winter Camp Day3(Div2, onsite)

solve 4/11

A 二十四点*

Code:pai爷  zz

Thinking :pai爷

打表找规律,1张牌 10个不可能的 2张牌有 43 种不可能的 3张牌 有74 种不可能的 4 张牌有 5 种不可能的

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<string>
#include<map>
#include<queue>
#include<vector>
#include<stack>
#define ll long long
#define maxn 401000
int  main()
{
    int n,a[20];
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        if(n==6) printf("32\n");
        else  printf("891\n");
    }
}
View Code

B 集合

分类加二分

留坑

E 精简改良

生成树状压dp  dp[ s ] [ i ] 表示s状态(节点组成)下,以i为根的树的信息。

留坑

F 小清新数论

Code:pai爷

Thinking:pai爷

莫比乌斯反演简单题

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<string>
#include<map>
#include<queue>
#include<vector>
#include<stack>
#define ll long long
#define maxn 401000
const int P=998244353;
using namespace std;
inline int rd()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
int tot;
int a,b,c,d,k,n,l;
int sum[10000005],mu[10000005],pri[10000005],X[10000005],Y[10000005];
bool mark[10000005];
void getmu()
{
    mu[1]=1;
    for(int i=2;i<=10000000;i++)
    {
        if(!mark[i]){mu[i]=-1;pri[++tot]=i;}
        for(int j=1;j<=tot&&i*pri[j]<=10000000;j++)
        {
            mark[i*pri[j]]=1;
            if(i%pri[j]==0) { mu[i*pri[j]]=0;break; }
            else mu[i*pri[j]]=-mu[i];
        }
    }
    for(int i=1;i<=10000000;i++) sum[i]=sum[i-1]+mu[i];    
}
int cal(int n,int m)
{
    if(n>m) swap(n,m);
    int ans=0,pos;
    for(int i=1;i<=n;i=pos+1)
    {
        pos=min(n/(n/i),m/(m/i));
        ans=(ans+1ll*(sum[pos]-sum[i-1])*(n/i)*(m/i))%P;
    }
    return ans;
}
int main()
{
    getmu();
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
       if(mu[i]!=0)
       {
            X[++l]=i;
            Y[l]=mu[i];
       }
    ll su=0;
    for(int i=1;i<=l;i++)
    {
        a=1;b=n;c=1;d=n;k=X[i];
        a--;c--;
        a/=k;b/=k;c/=k;d/=k;
        ll ans=cal(b,d);
        if(Y[i]==1) su=(su+ans+P)% P;
        else su=(su-ans+P)%P;
    }
    printf("%lld\n",su);
}
View Code

G 排列

Code:zz

Thinking:zz

差分约束+逆元

//#pragma comment(linker, "/STACK:102400000,102400000")
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<math.h>
#include<cmath>
#include<time.h>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<algorithm>
#include<numeric>
#include<stack>
#include<bitset>
#include<unordered_map>
const int maxn = 0x3f3f3f3f;
const double EI = 2.71828182845904523536028747135266249775724709369995957496696762772407663035354594571382178525166427;
const double PI = 3.141592653589793238462643383279;
using namespace std;
int c[100010],ans[100010];
int main(void)
{
    //ios::sync_with_stdio(false);
    int n,i,z1,z2,pos1,pos2,j;
    while(~scanf("%d",&n))
    {
        for(i = 1;i <= n;i++)
        {
            scanf("%d",c + i);
        }
        z1 = 1;
        z2 = n;
        for(i = 1;i <= n;)
        {
            if(c[i] == z2)
            {
                //printf("  %d %d %d\n",i,c[i],z1);
                ans[c[i]] = z1++;
                //printf("%d %d %d\n",ans[c[i]],c[i],ans[5]);
                i++;
            }
            else
            {
                ans[c[i]] = z1++;
                i++;
                pos1 = i;
                for(;i <= n;i++)
                {
                    if(c[i] == c[i - 1] + 1)
                    {
                        ans[c[i]] = z2--;
                    }
                    else
                    {
                        break;
                    }
                }
                
                pos2 = i - 1;
            //    printf("* %d %d\n",pos1,pos2);
                for(j = pos1;pos1 < pos2 && j <= pos1 + (pos2 - pos1) / 2;j++)
                {
            //        printf("1111 %d %d %d %d %d %d\n",c[j],c[pos2 - j + pos1],ans[c[j]],c[pos2 - j + pos1],j,pos2 - j + pos1);
                    int tmp = ans[c[j]];
                    ans[c[j]] = ans[c[pos2 - j + pos1]];
                    ans[c[pos2 - j + pos1]] = tmp;
            //        printf("2222 %d %d %d %d\n",c[j],c[pos2 - j + pos1],ans[c[j]],c[pos2 - j + pos1]);
                }
            }
        }
        //printf("   %d\n",ans[5]);
        for(i = 1;i <= n;i++)
        {
            printf("%d",ans[i]);
            if(i != n)
            {
                printf(" ");
            }
        }
        printf("\n");
    }
    return 0;
}
View Code

H 涂鸦*

Code:pai爷

Thinking:pai爷

题解待补

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<string>
#include<map>
#include<queue>
#include<vector>
#include<stack>
#define ll long long
#define maxn 401000
const int p=998244353;
int f[1010][1010],ans[1010][1010],z[1010][1010];
int n,m,q,l,r,a,b,c,d,an=0;
ll qpow(ll a,ll b,ll p)
{
    ll ret=1;a%=p;
    while(b)
    {
        if(b&1) ret=ret*a%p;
        b/=2;a=a*a%p;
    }
    return ret;
}
void init()
{
    for(int i=1;i<=1000;i++)
    {
       f[i][0]=i*(i+1)/2;
       for(int j=1;j<=i;j++)
              f[i][j]=(i-j+1)*j;
    }
}
int  main()
{
   init();
   scanf("%d%d%d",&n,&m,&q);
   for(int i=1;i<=n;i++)
   {
        scanf("%d%d",&l,&r);
        for(int j=l;j<=r;j++) 
        {
            int sp=r-l+1;
            ans[i][j]=1ll*f[sp][j-l+1]*qpow(f[sp][0],p-2,p)%p; 
     } 
   }
   for(int i=1;i<=q;i++)
   {
           scanf("%d%d%d%d",&a,&b,&c,&d);
           for(int j=a;j<=c;j++)
           {
               z[j][b]++;
               z[j][d+1]--;
        }
   }
   for(int i=1;i<=n;i++)
      for(int j=1;j<=m;j++) z[i][j]+=z[i][j-1];
   for(int i=1;i<=n;i++)
      for(int j=1;j<=m;j++)
          if(z[i][j]==0)
          {
              an=(an+ans[i][j])%p;
          }
    printf("%d\n",an);
}
View Code

I 石头剪刀布

带权并查集 (树好像也可以做?)

留坑


训练总结:

kk:今日贼菜,0贡献,键盘都没摸一下,石头剪刀布想到用带权并查集表示关系,但不会算情况数是多少,然后就换想法了?自己会的东西还是太少了,pai爷牛逼,zz牛逼!

pai爷:今天24点题目读错背锅了,之后知道是这样的就打表找不可能的情况,花了很多时间。整个人状态不是很好,做题缺少了节奏。最后一小时没有什么想法。

zz:

猜你喜欢

转载自www.cnblogs.com/mountaink/p/10306362.html