预计分数: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下午解题报告的更多相关文章

  1. Day1下午解题报告

    预计分数:0+30+30=60 实际分数:0+30+40=70 T1水题(water) 贪心,按长度排序, 对于第一幅牌里面的,在第二个里面,找一个长度小于,高度最接近的牌 进行覆盖. 考场上的我离正 ...

  2. Day4下午解题报告

    预计分数:30+30+0=60 实际分数:30+30+10=70 稳有个毛线用,,又拿不出成绩来,, T1 https://www.luogu.org/problem/show?pid=T15626 ...

  3. Day3上午解题报告

    预计分数:100+40+50=190 实际分数:100+40+50=190 T1 https://www.luogu.org/problem/show?pid=T15365 表示从来没做过博弈论的题, ...

  4. Day2下午解题报告

    预计分数:100+100+30=230 实际分数:100+100+30=230人品爆发&&智商爆发&&手感爆发 T3数据好水,,要是把数组开大一点的话还能多得10分,, ...

  5. Day5下午解题报告1

    预计分数:100+60+30=190 实际分数:100+60+30=190 终于有一道无脑T1了哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈 ...

  6. 【百度之星2014~复赛 解题报告~正解】The Query on the Tree

    声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站 ...

  7. 冲刺Noip2017模拟赛2 解题报告——五十岚芒果酱

    题1 牛跑步(running) [题目描述] 新牛到部队,CG 要求它们每天早上搞晨跑,从 A 农场跑到 B 农场.从 A 农场到 B 农场中有 n- 个路口,分别标上号,A 农场为 号,B 农场为 ...

  8. 2014-03-01 春季PAT 1073-1076解题报告

    今天下午的PAT考试状态不理想,回来怒刷了一遍,解题报告如下: 1073. Scientific Notation (20) 基本模拟题,将一长串的科学计数转换为普通的数字表示方式.思路是是数组存储输 ...

  9. 【LeetCode】481. Magical String 解题报告(Python)

    [LeetCode]481. Magical String 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http:/ ...

随机推荐

  1. Log4j2打印一行日志时返回本行日志的字符串

    import org.apache.logging.log4j.Level; import org.apache.logging.log4j.core.impl.Log4jLogEvent; impo ...

  2. ArcGIS 空间查询

    public static bool QueryMessPoint(IActiveView activeView, IFeatureClass featureClass, string whereCl ...

  3. nginx和apache

    apache所占用的内存资源较多,并且处理较慢 apache的全部模块都支持动静态编译 apache对Fcgi的支持不好 apache不支持epoll apache相对于nginx是一个庞然大物 ng ...

  4. D3.js 整体展示篇

    近期一段时间研究社会成员网络关系图的一些可视化展示,对大数据可视化这片荒漠一筹莫展的自己,幸好发现了D3这片充满活力的绿洲.我决定在这块宝地贪婪地大餐一番. 本文介绍主要来自官网翻译及用户使用后感想资 ...

  5. To new is C++; To malloc is C; To mix them is sin (混淆C++中的new和C中的malloc是一种犯罪)

    Introduction One of the most common questions that get asked during interviews for C++ programmers i ...

  6. UVALive - 6269 Digital Clock 模拟

    UVALive - 6269 Digital Clock 题意:时钟坏了,给你一段连续的时间,问你现在可能的时间是多少. 思路:直接模拟,他妈的居然这场就跪在了这题,卧槽,他妈的就在111行,居然多打 ...

  7. HDU 1005 Number Sequence(矩阵)

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...

  8. 简单的字符串压缩--C代码

    #include <stdio.h> #include <string.h> bool compress(char *str) { char *p=str,c; ; if(!s ...

  9. Firefox 浏览器有用的插件

    1.Undo Closed Tabs Button或Undo Closed Tabs Button (revived) 恢复关闭的标签页 2.NetVideohunter Video Download ...

  10. 解决电信或网通的DNS劫持

    大家有没有碰到访问一些不存在域名或者网站时,浏览器本应显示一个网址不存在之类的信息,但是因为现在很多ISP做了DNS劫持将不存在的域名或网址重定向到ISP的广告页面,烦人的狠.其实tomato可以解决 ...