solve 4/11

补题:5/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[];
while(scanf("%d",&n)!=EOF)
{
for(int i=;i<=n;i++) scanf("%d",&a[i]);
if(n==) printf("32\n");
else printf("891\n");
}
}

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=;
using namespace std;
inline int rd()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int tot;
int a,b,c,d,k,n,l;
int sum[],mu[],pri[],X[],Y[];
bool mark[];
void getmu()
{
mu[]=;
for(int i=;i<=;i++)
{
if(!mark[i]){mu[i]=-;pri[++tot]=i;}
for(int j=;j<=tot&&i*pri[j]<=;j++)
{
mark[i*pri[j]]=;
if(i%pri[j]==) { mu[i*pri[j]]=;break; }
else mu[i*pri[j]]=-mu[i];
}
}
for(int i=;i<=;i++) sum[i]=sum[i-]+mu[i];
}
int cal(int n,int m)
{
if(n>m) swap(n,m);
int ans=,pos;
for(int i=;i<=n;i=pos+)
{
pos=min(n/(n/i),m/(m/i));
ans=(ans+1ll*(sum[pos]-sum[i-])*(n/i)*(m/i))%P;
}
return ans;
}
int main()
{
getmu();
scanf("%d",&n);
for(int i=;i<=n;i++)
if(mu[i]!=)
{
X[++l]=i;
Y[l]=mu[i];
}
ll su=;
for(int i=;i<=l;i++)
{
a=;b=n;c=;d=n;k=X[i];
a--;c--;
a/=k;b/=k;c/=k;d/=k;
ll ans=cal(b,d);
if(Y[i]==) su=(su+ans+P)% P;
else su=(su-ans+P)%P;
}
printf("%lld\n",su);
}

G 排列

Code:zz

Thinking:zz

原序列p的前缀最小值数组肯定是非递增的,如果原序列p是递减的,那么q是递减的,否则,如果出现“1,2,3”这种排列,它的前缀最小数组是“1,1,1”,后一位是小于等于前一位的,q是“1,2,3”,这样q的这种部分就会出现递增的情况。因此,从前往后遍历整个q数组,如果递减,那么对应位置的p排列的地方就应该尽量小;如果遇到递增的地方,那么那片地方的数对应的p排列的地方应该尽量大,并且为了字典序最小,p排列的那片地方应该递增。

//#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[],ans[];
int main(void)
{
//ios::sync_with_stdio(false);
int n,i,z1,z2,pos1,pos2,j;
while(~scanf("%d",&n))
{
for(i = ;i <= n;i++)
{
scanf("%d",c + i);
}
z1 = ;
z2 = n;
for(i = ;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 - ] + )
{
ans[c[i]] = z2--;
}
else
{
break;
}
} pos2 = i - ;
// printf("* %d %d\n",pos1,pos2);
for(j = pos1;pos1 < pos2 && j <= pos1 + (pos2 - pos1) / ;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 = ;i <= n;i++)
{
printf("%d",ans[i]);
if(i != n)
{
printf(" ");
}
}
printf("\n");
}
return ;
}

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=;
int f[][],ans[][],z[][];
int n,m,q,l,r,a,b,c,d,an=;
ll qpow(ll a,ll b,ll p)
{
ll ret=;a%=p;
while(b)
{
if(b&) ret=ret*a%p;
b/=;a=a*a%p;
}
return ret;
}
void init()
{
for(int i=;i<=;i++)
{
f[i][]=i*(i+)/;
for(int j=;j<=i;j++)
f[i][j]=(i-j+)*j;
}
}
int main()
{
init();
scanf("%d%d%d",&n,&m,&q);
for(int i=;i<=n;i++)
{
scanf("%d%d",&l,&r);
for(int j=l;j<=r;j++)
{
int sp=r-l+;
ans[i][j]=1ll*f[sp][j-l+]*qpow(f[sp][],p-,p)%p;
}
}
for(int i=;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+]--;
}
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++) z[i][j]+=z[i][j-];
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(z[i][j]==)
{
an=(an+ans[i][j])%p;
}
printf("%d\n",an);
}

I 石头剪刀布

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

补题:kk

按照题意描述,所有y挑战x的关系最后会形成一棵树的结构,n个人的总方案数是 3n 种,假设一个人被挑战(主场作战)a次,挑战别人(客场)b次,那么这个人存活到最后的方案数就是3n*(2/3)a*(1/3)b

也就是我们知道这个a和b就可以得到答案了,那要怎么维护呢。

这里用到并查集(jls niub!)

我们用w表示一个节点总共比赛的场次数,v表示主场作战的场次数,如果我们现在把y这个集合并向x这个集合(y挑战x),那么对于XW和Xv肯定都加一,而Yw也加一,如果我们接下来能很好的合并这些信息,那我们就AC了。

这里想了很久,才想明白要怎么做。我们先考虑暴力一点的并查集,就是不路径压缩,那每个节点就可以向上把所有父节点的信息全部加起来,就是我们最后要的某一个节点的W和V了,但是这样做会TLE,因为我们没有路径压缩,查找的时间复杂度很可能退化成O(n),但是我们又不能路径压缩(为什么不行,大家可以尝试一下,反正我自闭了一下午加一晚上)。

普通的带权并查集我们用的都是路径压缩版本的,而这里我们要按秩合并,这样查找的时间复杂度就可以被优化到O(logn)。

曾经我一直以为带权并查集的路径压缩和按秩合并是同一个东西,这道题真的学到了。。

#include<bits/stdc++.h>
#define CLR(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=;
int fa[maxn],Rank[maxn];
ll w[maxn],v[maxn];
int n,m;
int op,x,y;
ll p= ;
struct node{
int fx;
ll w,v;
};
ll qpow(ll a,ll b){
a%=p;
ll res=;
while(b>)
{
if(b&){
res*=a;
res%=p;
}
b>>=;
a=a*a%p;
}
return res;
}
void init(){
for(int i=;i<=n;i++){
fa[i]=i;
w[i]=;
v[i]=;
Rank[i]=;
}
}
node find(int x){
if(x==fa[x]) return {fa[x],w[x],v[x]}; int tep=fa[x];
node e;
e.w=w[x],e.v=v[x];
while(tep!=fa[tep]){
e.w+=w[tep],e.v+=v[tep];
tep=fa[tep];
}
e.fx=tep;
e.v+=v[tep],e.w+=w[tep];
return e;
} void baba(int x,int y){
node ex=find(x),ey=find(y);
if(ex.fx!=ey.fx){
w[ex.fx]+=;
v[ex.fx]+=;
w[ey.fx]+=;
v[ey.fx]+=;
if(Rank[ex.fx]>=Rank[ey.fx])
{
w[ey.fx]-=w[ex.fx];
v[ey.fx]-=v[ex.fx];
fa[ey.fx]=ex.fx;
Rank[ex.fx]++;
}else{
w[ex.fx]-=w[ey.fx];
v[ex.fx]-=v[ey.fx];
fa[ex.fx]=ey.fx;
Rank[ey.fx]++;
} }
}
int main(){
while(cin>>n>>m)
{
init();
ll res=qpow(,n);
ll ans;
while(m--)
{
scanf("%d%d",&op,&x);
if(op==){
scanf("%d",&y);
baba(x,y);
}else{
node ex=find(x);
ll a=ex.v;
ll b=ex.w-ex.v;
ans=res*qpow(qpow(,b),p-)%p*qpow(,a)%p*qpow(qpow(, a),p-)%p;
printf("%lld\n",ans);
}
}
}
}

训练总结:

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

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

zz:今天做了一道签到题以后就开始跟着金老师研究24点,但是除了手写打表没什么贡献,后来又想了石头剪刀布和几何题,都没什么想法,最后也没做出来。

2019 CCPC-Wannafly Winter Camp Day3(Div2, onsite)的更多相关文章

  1. CCPC-Wannafly Winter Camp Day3 (Div2, onsite)

    Replay Dup4: 没想清楚就动手写? 写了两百行发现没用?想的还是不够仔细啊. 要有莽一莽的精神 X: 感觉今天没啥输出啊, 就推了个公式?抄了个板子, 然后就一直自闭A. 语文差,题目没理解 ...

  2. 2020 CCPC Wannafly Winter Camp Day1 C. 染色图

    2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...

  3. 2019 CCPC-Wannafly Winter Camp Day1 (Div2, onsite)

    solve:4/11 补题:6/11 A 机器人 补题:zz 这是一道分类讨论的题目,有一个规律就是如果必须要从第一个区到第二个区,那么最多转区两次(1到2一次,2到1一次),然后分类讨论即可,只要细 ...

  4. 2019 CCPC-Wannafly Winter Camp Day7(Div2, onsite)

    solve 6/11 补题: A.迷宫 Code:zz Thinking:zz kk 把每个节点的深度都处理出来,同一深度的点的冲突度为 (x-1),x为同层次点数减一. 然后冲突度不断下传(冲突度为 ...

  5. 2019 CCPC-Wannafly Winter Camp Day2(Div2, onsite)

    solve 4/11 A Erase Numbers II Code:KK Thinking :KK 用ans表示当前最优答案,maxx表示遍历到的最大数字,一开始ans肯定等于a[ 1 ]+a[ 2 ...

  6. 2019 CCPC-Wannafly Winter Camp Day4(Div2, onsite)

    slove 6/11 A.夺宝奇兵 Code:zz Thinking:zz 贪心即可.这条路线里,点n1和点n2肯定是相连的,接下来,点(n-1)1和点(n-1)2分别是和n1和点n2相连的,一共有两 ...

  7. 2019 CCPC-Wannafly Winter Camp Day5(Div2, onsite)

    solve 5/11 补题:7/11 A Cactus Draw Code:zz Thinking :zz 题意:要在n*n的网格内画上一棵节点数为n树,使得没有边相交. 很好想的构造题,因为网格有n ...

  8. CCPC Wannafly Winter Camp Div2 部分题解

    Day 1, Div 2, Prob. B - 吃豆豆 题目大意 wls有一个\(n\)行\(m\)列的棋盘,对于第\(i\)行第\(j\)列的格子,每过\(T[i][j]\)秒会在上面出现一个糖果, ...

  9. CCPC-Wannafly Winter Camp Day5 (Div2, onsite) Sorting(线段树)

    题目链接 题意 对序列进行三种操作: 1.区间求和. 2.将区间小于等于$x$的数不改变相对顺序的前提下放到$x$左边,用同样规则将比$x$大的放到右边. 3.将区间大于$x$的数不改变相对顺序的前提 ...

随机推荐

  1. CentOS-yum基本使用

    CentOS: yum URL: ftp://172.16.0.1/pub/ YUM: yellow dog, Yellowdog Update Modifier yum repository: yu ...

  2. 4款最受欢迎的Mac原型工具

    原型工具中Wireframe, Mockup和prototype之间的有什么不同? 无论你是一名刚入行的UX/UI设计师,还是入行多年的老手,在制作原型的过程中一定接触或听说过其中很重要的三个原型术语 ...

  3. 导入excel精华版

    //须引入 NPOI, NPOI.OOXML, NPOI.Openxml4Net, NPOI.OpenxmlFormats等程序集 自己去下载吧 NPOI组件很好用不可能下不到自己去吧,通常去百度网盘 ...

  4. 打开程序出现.Net Framework Initialization Error – Unable to find a version of the runtime to run this applicatio的解决办法

    部署一个VS2010开发的程序时遇到 了一个非常奇怪的问题,客户端上已经安装了.net framework 4.0,但运行时还是会弹出错误: .Net Framework Initialization ...

  5. SQL虚拟数字辅助表

    虚拟数字辅助表是一个整数序列,可以用来完成多种不同的任务,如生成日期跟时间值序列,及分裂值列表.要用查询逻辑产生一个大的整数序列,可以使用交叉连接(cross join). 交叉联接(cross jo ...

  6. javascript总结21:javascript-JSON与遍历

    1 什么是JSON JavaScript Object Notation(JavaScript对象表示形式) JavaScript的子集 JSON和对象字面量的区别 JSON的属性必须用双引号引号引起 ...

  7. 从零开始学习前端JAVASCRIPT — 7、JavaScript基础EVENT

    1:事件驱动 1)事件:所谓事件就是js侦测到的用户的操作或是页面的一些行为(怎么发生的) 2)事件源对象:引发事件的元素.(发生在谁的身上) 3)事件处理程序:对事件处理的程序或是函数 (发生了什么 ...

  8. XJOI 3605 考完吃糖(DAG图dfs)

    题目描述: 期末考试考完了,分数也出来了,大家准备吃糖庆祝一下,为了鼓励同学们下学期能取得更好的成绩,司马红豆同学让n个同学站成一排,如果某个同学的分数比相邻的一个同学要高,那么他得到的糖果就会比这个 ...

  9. (原创)Log4Net 在多层项目中的使用小记

    这几天刚好在调整一个项目,把一些自己不是很清楚的东西先试验一下,这篇文章主要是对我在项目中需要使用Log4Net的一些记录.网上有很多相关的教程,但是各有各的说法,我结合我自己这个项目的需要,首先,项 ...

  10. window.open之postMessage传参数

    这次要实现一个window.open打开子视窗的同时传参数到子视窗,关闭的时候返回参数. 当然简单的做法非常简单,直接在window.open的URL之后接参数即可,但是毕竟get method的参数 ...