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:/ ...
随机推荐
- vue2.0 vue-loader
vue-cli npm install 脚手架: vue-loader 1.0 -> new Vue({ el: '#app', components:{App} }) 2.0-> new ...
- 数字信号处理C语言集(1.1 随机数的产生)
main.cpp 所建工程文件如下图所示 uniform.h #ifndef _UNIFORM_H_ #define _UNIFORM_H_ double uniform(double a,doub ...
- DNS隧道和工具
DNS Tunneling及相关实现 转自:http://www.freebuf.com/sectool/112076.html DNS Tunneling,是隐蔽信道的一种,通过将其他协议封装在DN ...
- zzulioj--1816--矩形(好题数学)
1816: 矩形 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 88 Solved: 24 SubmitStatusWeb Board Descri ...
- 如何快速复制Windows警告提示消息对话框内容
凡是使用过计算机的朋友,都遇到过系统发出的警告提示消息对话框,如图所示. 哇!好长的一串英文错误警告,这要手写到什么时候呢?不!现在不用这么麻烦了. 你只要鼠标选中这个提示框Ctrl+C,然后打开你的 ...
- 笔记本E450机械硬盘数据迁移到固态硬盘
背景: E450机械硬盘使用速度过慢,但E450只有一个SATA位,无法直接使用 “分区助手”迁移. 处理: 1.将固态硬盘通过USB口外接在笔记本上 2.正常打开E450,进入桌面 3.对固态硬盘进 ...
- 洛谷——P1043 数字游戏
https://www.luogu.org/problem/show?pid=1043 题目描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要 ...
- Android 採用HTML设计界面
由于Android软件开发分工眼下还没有细化,程序猿往往须要负责软件界面的开发,尽管软件的界面图片已经由美工设计好了.可是假设使用layout技术把软件做成美丽的界面确实非常困难,而是也比較耗时.An ...
- JAVA基础针对自己薄弱环节总结02(循环)
循环 A:水仙花. classShuiXianHua { public static void main(String[] args) { for(int i=101;i<1000;i++) { ...
- .Net 自动属性结合手动属性
Model using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace ...