Day3下午解题报告
预计分数:20+40+30=90
实际分数:40+90+60=190
再次人品爆发&&手感爆发&&智商爆发
谁能告诉我为什么T1数据这么水。。
谁能告诉我为什么T2数据这么水。。
谁能告诉我为什么T3数据这么水。。
T1
https://www.luogu.org/problem/show?pid=T15476
比赛开始,果断放弃T1,。
去搞T2
最后还有40分钟的时候回来敲的T1的暴力。。
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<cmath>
- #include<algorithm>
- #define LL int
- using namespace std;
- const LL MAXN=1e6;
- const LL INF=0x7ffff;
- const int mod=1e9+;
- inline LL read()
- {
- char c=getchar();LL flag=,x=;
- while(c<''||c>'') {if(c=='-') flag=-;c=getchar();}
- while(c>=''&&c<='') x=x*+c-,c=getchar();return x*flag;
- }
- struct node
- {
- LL u,v,w,nxt;
- }edge[MAXN];
- LL head[MAXN];
- LL num=;
- inline void add_edge(LL x,LL y)
- {
- edge[num].u=x;
- edge[num].v=y;
- num++;
- }
- int vis[MAXN];
- int ans=;
- int n,m;
- void dfs(int now)
- {
- if(now==m)
- {
- ans=(ans+)%mod;
- return ;
- }
- if(vis[edge[now+].u]==)
- {
- vis[edge[now+].u]=;
- dfs(now+);
- vis[edge[now+].u]=;
- }
- if(vis[edge[now+].v]==)
- {
- vis[edge[now+].v]=;
- dfs(now+);
- vis[edge[now+].v]=;
- }
- }
- int main()
- {
- // freopen("girl.in","r",stdin);
- // freopen("girl.out","w",stdout);
- n=read(),m=read();
- for(int i=;i<=m;i++)
- {
- int x=read(),y=read();
- add_edge(x,y);
- }
- vis[edge[].u]=;
- dfs();
- vis[edge[].u]=;
- vis[edge[].v]=;
- dfs();
- printf("%d",ans);
- return ;
- }
- /*
- 5 4
- 1 2
- 3 2
- 4 5
- 4 5
- */
40分暴力
正解:
结论:
- 出现大于等于两个环的时候方案数为0
- 当时章鱼图的时候,分配方案唯一确定,方案数为2
- 没有环的图—>树—>方案数=点数(总会有一个点没有被分配到)
并查集维护连通性
- #include<cstdio>
- #include<cstdlib>
- #include<cstring>
- #include<cctype>
- using namespace std;
- const int BUF_SIZE = ;
- char buf[BUF_SIZE], *buf_s = buf, *buf_t = buf + ;
- #define PTR_NEXT() \
- { \
- buf_s ++; \
- if (buf_s == buf_t) \
- { \
- buf_s = buf; \
- buf_t = buf + fread(buf, , BUF_SIZE, stdin); \
- } \
- }
- #define readint(_n_) \
- { \
- while (*buf_s != '-' && !isdigit(*buf_s)) \
- PTR_NEXT(); \
- bool register _nega_ = false; \
- if (*buf_s == '-') \
- { \
- _nega_ = true; \
- PTR_NEXT(); \
- } \
- int register _x_ = ; \
- while (isdigit(*buf_s)) \
- { \
- _x_ = _x_ * + *buf_s - ''; \
- PTR_NEXT(); \
- } \
- if (_nega_) \
- _x_ = -_x_; \
- (_n_) = (_x_); \
- }
- const int maxn=;
- const int mo=;
- int n,m,en,size;
- bool vis[maxn],circle;
- struct edge
- {
- int e;
- edge *next;
- }*v[maxn],ed[maxn<<];
- void add_edge(int s,int e)
- {
- en++;
- ed[en].next=v[s];v[s]=ed+en;v[s]->e=e;
- }
- void dfs(int now,int pre)
- {
- vis[now]=true;
- size++;
- for (edge *e=v[now];e;e=e->next)
- if (e->e!=pre)
- {
- if (vis[e->e]) circle=true;
- else dfs(e->e,now);
- }
- }
- int main()
- {
- freopen("girl.in","r",stdin);
- freopen("girl.out","w",stdout);
- readint(n);
- readint(m);
- for (;m--;)
- {
- int s,e;
- readint(s);
- readint(e);
- add_edge(s,e);
- add_edge(e,s);
- }
- int ans=;
- for (int a=;a<=n;a++)
- if (!vis[a])
- {
- circle=false;
- size=;
- dfs(a,);
- if (circle) ans=(ans<<)%mo;
- else ans=(long long)ans*size%mo;
- }
- printf("%d\n",ans);
- return ;
- }
T2
https://www.luogu.org/problem/show?pid=T15479
T2好水,一眼秒,,只要保证偶数位为0就好了
然后乘法原理暴力统计一下就好了。
可是超出边界的怎么处理。。。
怎么处理。。。。
50分钟过去了。。
不管了,边写边想吧。。。。
怎么处理,,,,怎么处理。。啊啊啊啊。。。。
又50分钟过去了。。
感觉自己写了一坨shit。。。。
大概长这样
谁能告诉我这份代码在干什么。。。
为什么边界这么奇怪,,
直到现在我都搞不明白这份代码是怎么过掉50分的。。。。
我自己拍的时候平均7组错一组,。。。。
玄学。。。。。
最后一个点貌似炸long long了。。。
为什么会炸long long 。。。。。
然后把所有变量都改成long long之后炸了两个点。。。。。。。。。。。。
感觉我做了假题写了假代码跑了假分数开了假longlong
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<cmath>
- #include<algorithm>
- #define LL long long
- using namespace std;
- const LL MAXN=1e6;
- const LL INF=0x7ffff;
- inline LL read()
- {
- char c=getchar();LL flag=,x=;
- while(c<''||c>'') {if(c=='-') flag=-;c=getchar();}
- while(c>=''&&c<='') x=x*+c-,c=getchar();return x*flag;
- }
- LL fen[MAXN];
- LL num=;
- LL fastpow(LL a,LL p)
- {
- LL base=;
- while(p)
- {
- if(p&) base=base*a;
- a=a*a;
- p>>=;
- }
- return base;
- }
- LL ans=;
- LL powk[MAXN];
- int main()
- {
- //freopen("endless.in","r",stdin);
- //freopen("endless.out","w",stdout);
- LL n=read(),k=read();
- if(n<=)
- {
- for(LL i=;i<=n;i++)
- {
- num=;
- LL p=i;
- while(p) fen[++num]=p%k,p/=k;
- for(LL j=;j<=num;j++)
- p+=fen[j]*fastpow(-k,j-);
- if(p==i)
- {
- //printf("%d\n",i);
- ans++;
- }
- }
- printf("%lld",ans-);
- }
- else
- {
- if(n<k)
- {
- printf("%lld",n+);
- exit();
- }
- LL p=n;
- while(p) fen[++num]=p%k,p/=k;
- for(LL i=;i<num;i++)
- if((i-)%==)
- ans=ans*k;
- if(num%==&&num>)
- ans=ans*(fen[num]+);
- p=;
- for(int i=num-;i>=;i--)
- {
- if((i%==&&fen[i]>)) break;
- if(i%==) continue;
- int cha=(k-)-fen[i];
- for(int j=i-;j>=;j--) cha*=k;
- p+=cha;
- }
- printf("%lld",ans-p+);
- }
- return ;
- }
玄学的代码
- #include<cstdio>
- #include<cstdlib>
- #include<cstring>
- using namespace std;
- long long n,f[][];
- int k,bit[];
- int main()
- {
- freopen("endless.in","r",stdin);
- freopen("endless.out","w",stdout);
- while (~scanf("%I64d%d",&n,&k))
- {
- int num=;
- while (n)
- bit[++num]=n%k,n/=k;
- if (num&) f[][]=bit[num],f[][]=;
- else f[][]=,f[][]=;
- int now=,last=;
- for (int a=num-;a>=;a--)
- {
- now^=;last^=;
- if (a&) f[now][]=f[last][]*k+f[last][]*bit[a],f[now][]=f[last][];
- else
- {
- f[now][]=f[last][];
- f[now][]=;
- if (!bit[a]) f[now][]=f[last][];
- else f[now][]+=f[last][];
- }
- }
- printf("%I64d\n",f[now][]+f[now][]);
- }
- return ;
- }
正解数位DP
T3
https://www.luogu.org/problemnew/show/T15479
yy了一个比暴力还暴力的解法。。
不过貌似是正解的铺垫。。
暴力维护前缀和,每次dfs
本来以为只能拿30分的,结果水到了60分233333
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<cmath>
- #include<algorithm>
- #define LL long long
- using namespace std;
- const LL MAXN=1e6;
- const LL INF=0x7ffff;
- inline LL read()
- {
- char c=getchar();LL flag=,x=;
- while(c<''||c>'') {if(c=='-') flag=-;c=getchar();}
- while(c>=''&&c<='') x=x*+c-,c=getchar();return x*flag;
- }
- struct node
- {
- LL u,v,w,nxt;
- }edge[MAXN];
- LL head[MAXN];
- LL num=;
- inline void add_edge(LL x,LL y)
- {
- edge[num].u=x;
- edge[num].v=y;
- edge[num].nxt=head[x];
- head[x]=num++;
- }
- LL deep[MAXN];
- LL val[MAXN];
- LL a[MAXN];
- struct NODE
- {
- LL pos,pointval;
- }t[MAXN];
- void Make_deep(LL now)
- {
- for(LL i=head[now];i!=-;i=edge[i].nxt)
- {
- if(deep[edge[i].v]==)
- deep[edge[i].v]=deep[now]+,
- val[edge[i].v]=val[now]+a[edge[i].v],
- t[edge[i].v].pos=edge[i].v,
- Make_deep(edge[i].v);
- }
- }
- LL comp(const NODE &a,const NODE &b)
- {
- return a.pointval>b.pointval;
- }
- void dele(LL now)
- {
- for(LL i=head[now];i!=-;i=edge[i].nxt)
- {
- if(deep[edge[i].v]<deep[edge[i].u])
- {
- a[edge[i].v]=,val[edge[i].v]=,dele(edge[i].v);
- }
- }
- }
- int main()
- {
- // freopen("tour.in","r",stdin);
- // freopen("tour.out","w",stdout);
- LL n=read(),k=read();
- memset(head,-,sizeof(head));
- for(LL i=;i<=n;i++) a[i]=read();
- for(LL i=;i<=n-;i++)
- {
- LL x=read(),y=read();
- add_edge(x,y);
- add_edge(y,x);
- }
- deep[]=;val[]=a[];t[].pos=;
- LL ans=;
- while(k--)
- {
- memset(deep,,sizeof(deep));
- deep[]=;
- Make_deep();
- for(LL i=;i<=n;i++)
- t[i].pointval=val[t[i].pos];
- sort(t+,t+n+,comp);
- ans+=t[].pointval;
- dele(t[].pos);
- val[t[].pos]=;
- a[t[].pos]=;
- }
- printf("%lld",ans);
- return ;
- }
- /*
- 5 2
- 4 3 2 1 1
- 1 2
- 1 5
- 2 3
- 2 4
- //10
- 4 2
- 1 2 4 8
- 1 2
- 1 3
- 2 4
- //15
- 4 1
- 1 2 8 4
- 1 2
- 1 3
- 2 4
- //9
- */
超级大暴力
100分:
①考虑优化,每次dfs只会影响到一条链上的权值,会影响一段连续的区间,线段树维护。
删除的时候打标机,如果曾经被删除过就不删了
②树链剖分的思想,把孩子权值最大的当做重儿子 时间复杂度:$O(nlogn)$
dfs序+线段树维护贪心
- #include<cstdio>
- #include<cstdlib>
- #include<cstring>
- #include<cctype>
- #include<algorithm>
- using namespace std;
- const int BUF_SIZE = ;
- char buf[BUF_SIZE], *buf_s = buf, *buf_t = buf + ;
- #define PTR_NEXT() \
- { \
- buf_s ++; \
- if (buf_s == buf_t) \
- { \
- buf_s = buf; \
- buf_t = buf + fread(buf, , BUF_SIZE, stdin); \
- } \
- }
- #define readint(_n_) \
- { \
- while (*buf_s != '-' && !isdigit(*buf_s)) \
- PTR_NEXT(); \
- bool register _nega_ = false; \
- if (*buf_s == '-') \
- { \
- _nega_ = true; \
- PTR_NEXT(); \
- } \
- int register _x_ = ; \
- while (isdigit(*buf_s)) \
- { \
- _x_ = _x_ * + *buf_s - ''; \
- PTR_NEXT(); \
- } \
- if (_nega_) \
- _x_ = -_x_; \
- (_n_) = (_x_); \
- }
- #define wmt 1,cnt,1
- #define lson l,m,rt<<1
- #define rson m+1,r,rt<<1|1
- const int maxn=;
- int n,k,en,z[maxn],f[maxn],s[maxn],leaf[maxn],l[maxn],r[maxn];
- long long y[maxn<<|],col[maxn<<|];
- bool del[maxn];
- struct edge
- {
- int e;
- edge *next;
- }*v[maxn],*ve[maxn],ed[maxn];
- inline void add_edge(int s,int e)
- {
- en++;
- ed[en].next=v[s];v[s]=ed+en;v[s]->e=e;
- }
- #define update(rt) y[rt]=max(y[rt<<1],y[rt<<1|1]);
- #define push_col(rt)\
- if (col[rt])\
- {\
- col[rt<<]+=col[rt];y[rt<<]+=col[rt];\
- col[rt<<|]+=col[rt];y[rt<<|]+=col[rt];\
- col[rt]=;\
- }
- inline void modify(int l,int r,int rt,int nowl,int nowr,int delta)
- {
- if (nowl<=l && r<=nowr)
- {
- y[rt]+=delta;
- col[rt]+=delta;
- return;
- }
- push_col(rt);
- int m=(l+r)>>;
- if (nowl<=m) modify(lson,nowl,nowr,delta);
- if (m<nowr) modify(rson,nowl,nowr,delta);
- update(rt);
- }
- inline int query(int l,int r,int rt)
- {
- if (l==r) return l;
- push_col(rt);
- int m=(l+r)>>;
- if (y[rt<<]>y[rt<<|]) return query(lson);
- else return query(rson);
- }
- int main()
- {
- freopen("tour.in","r",stdin);
- freopen("tour.out","w",stdout);
- readint(n);
- readint(k);
- for (int a=;a<=n;a++)
- {
- readint(z[a]);
- }
- for (int a=;a<n;a++)
- {
- int p1,p2;
- readint(p1);
- readint(p2);
- f[p2]=p1;
- add_edge(p1,p2);
- }
- int root;
- for (int a=;a<=n;a++)
- if (!f[a]) root=a;
- int size=;
- s[]=root;
- for (int a=;a<=n;a++)
- ve[a]=v[a];
- memset(l,0x3f,sizeof(l));
- int cnt=;
- while (size)
- {
- int now=s[size];
- if (!ve[now])
- {
- if (!v[now])
- {
- l[now]=r[now]=++cnt;
- leaf[cnt]=now;
- }
- l[f[now]]=min(l[f[now]],l[now]);
- r[f[now]]=max(r[f[now]],r[now]);
- size--;
- }
- else
- {
- size++;
- s[size]=ve[now]->e;
- ve[now]=ve[now]->next;
- }
- }
- for (int a=;a<=n;a++)
- modify(wmt,l[a],r[a],z[a]);
- k=min(k,cnt);
- long long ans=;
- for (int a=;a<=k;a++)
- {
- int p=query(wmt);
- p=leaf[p];
- while (!del[p] && p)
- {
- modify(wmt,l[p],r[p],-z[p]);
- ans+=z[p];
- del[p]=true;
- p=f[p];
- }
- }
- printf("%I64d\n",ans);
- return ;
- }
总结
这一场比赛可以用两个字来评价
玄学
我感觉这场比赛题目难道炸,但是有7.8个AK的。。,
我感觉我的小伙伴们都应该考的不错,但是gryz集体考炸。。
我感觉我会挂成SB,但是莫名其妙多得100分。。
玄学。。。。。
Day3下午解题报告的更多相关文章
- Day1下午解题报告
预计分数:0+30+30=60 实际分数:0+30+40=70 T1水题(water) 贪心,按长度排序, 对于第一幅牌里面的,在第二个里面,找一个长度小于,高度最接近的牌 进行覆盖. 考场上的我离正 ...
- Day4下午解题报告
预计分数:30+30+0=60 实际分数:30+30+10=70 稳有个毛线用,,又拿不出成绩来,, T1 https://www.luogu.org/problem/show?pid=T15626 ...
- Day3上午解题报告
预计分数:100+40+50=190 实际分数:100+40+50=190 T1 https://www.luogu.org/problem/show?pid=T15365 表示从来没做过博弈论的题, ...
- Day2下午解题报告
预计分数:100+100+30=230 实际分数:100+100+30=230人品爆发&&智商爆发&&手感爆发 T3数据好水,,要是把数组开大一点的话还能多得10分,, ...
- Day5下午解题报告1
预计分数:100+60+30=190 实际分数:100+60+30=190 终于有一道无脑T1了哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈 ...
- 【百度之星2014~复赛 解题报告~正解】The Query on the Tree
声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站 ...
- 冲刺Noip2017模拟赛2 解题报告——五十岚芒果酱
题1 牛跑步(running) [题目描述] 新牛到部队,CG 要求它们每天早上搞晨跑,从 A 农场跑到 B 农场.从 A 农场到 B 农场中有 n- 个路口,分别标上号,A 农场为 号,B 农场为 ...
- 2014-03-01 春季PAT 1073-1076解题报告
今天下午的PAT考试状态不理想,回来怒刷了一遍,解题报告如下: 1073. Scientific Notation (20) 基本模拟题,将一长串的科学计数转换为普通的数字表示方式.思路是是数组存储输 ...
- 【LeetCode】481. Magical String 解题报告(Python)
[LeetCode]481. Magical String 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http:/ ...
随机推荐
- 安装Signavio Web设计器
在Jbpm3版本号中,这个著名的开源项目并没有基于浏览器的图形化流程设计器,结果导致流程设计一直停留在CS阶段. 比方我之前做过的一个OA项目.项目中採用的就是Jbpm3.因为它不支持在浏览器中的图形 ...
- FPGA设计中的电源管理(转载)
过去,FPGA设计者主要关心时序和面积使用率问题.但随着FPGA不断取代ASSP和ASIC器件,设计者们现正期望能够开发低功耗设计,在设计流程早期就能对功耗进行正确估算,以及管理和对与FPGA相关的各 ...
- DNS隧道和工具
DNS Tunneling及相关实现 转自:http://www.freebuf.com/sectool/112076.html DNS Tunneling,是隐蔽信道的一种,通过将其他协议封装在DN ...
- 设计兼容不同的屏幕尺寸的Android界面
Android的屏幕类型有几百种不同的尺寸,从小型的手机到大型的电视机.因此要使我们的应用程序兼容不同屏幕尺寸,才可以让我们的应用提供给更多的用户使用. 一.支持不同的屏幕尺寸 1.使用"w ...
- 异常:error 0152: No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SqlClient'
error 0152: No Entity Framework provider found for the ADO.NET provider with invariant name 'System. ...
- 基于CANopen DSP402的运动控制笔记
常用的mode of operation 有以下几种: 控制字 control word: 6--------------7---------------15--------------------7 ...
- useradd
功能说明:useradd命令可用于创建新的用户或者更改用户的信息. 语法格式:useradd [选项] [用户名]useradd -D [选项] 选项说明:1.使用useradd常规添加用户工作原理流 ...
- 【RHEL7/CentOS7基本配置】
目录 @ 相比于6.x的版本,Rhel7/CentOS7增加或改进了以下7大特性. 1.身份管理 kerberos的跨平台信任机制:kerberos将完全兼容微软活动目录,实现完全使用活动目录进行认证 ...
- Python, Django 性能分析工具的使用
最近接手的 Apache HUE 项目性能出现了问题,线上经常出现响应时间过长或因为时间过长而无法服务等问题.老大让我准备弄个性能分析工具,便于追踪和分析平台当前的瓶颈出现在哪里. 那就搞起吧!先从代 ...
- 重装python 和 yum
https://blog.csdn.net/ghostyusheng/article/details/https://segmentfault.com/q/1010000009194060/a-102 ...