BZOJ 刷题记录 PART 6

【BZOJ2709】水的二分加验证。但是好像被读入萎到了。。。

【BZOJ3229】强大的算法见此。被机房的一堆大神“推荐”,于是被坑了。。。写了一个下午。。。

【BZOJ3631】这道题给我的启示是:要多想想算法。开始一直在打树链剖分,打到一半忽然在众神犇的提(bi)示(shi)下,发现有O(N)的方法。试想:如果要支持区间修改(加减),最后再查询,可以用什么方法?固然,线段树和树状数组等等都可以,但是最好的显然是类似于前缀和的思想。比如在L~R加上一个数,可以再L处+K,在R+1处-K。然后最后的时候从头到尾扫过去、累加即可。      

那么这道题实际上是在树上做这个类似的操作。当然,求LCA的时候要用tarjan,否则效率又变回去了。

以下是代码。wri是为了调整,最后输出的是wri和sum的和。

void bfs(int k)
{
  for (int i=1;i<n;i++)
  {
    int x=opt[i],y=opt[i+1];
    sum[ans[i]]-=2;
    sum[x]++;sum[y]++;
    wri[y]--;wri[ans[i]]++;
  }
  int h=0,t=1;q[1]=1;
  while (h<t) 
  {
    int now=q[++h];
    for (int i=end[now];i;i=a[i].next)
    {
      int go=a[i].go;if (go==fa[now]) continue;
      q[++t]=go;
    }
  }
  for (int j=t;j;j--) 
  {
    int k=q[j];
    sum[fa[k]]+=sum[k];
  }
}

【BZOJ3609】打表找规律。据说是版权问题?就不说了。

【BZOJ1212】啊哈哈哈,又被我DP使过去啦!

【BZOJ2823&1666&1667】以前查来的题解。。。好像是谁的论文来着。

初始圆为1,2作为直径的圆。
For i=2 to n
If i不在当前圆内 then
    把当前圆设为以1,i为直径的圆
     For j=2 to i-2
     If j不在当前圆内 then
     把当前圆设为以j,i为直径的圆{确定初始圆}
         For k=1 to j-1
         If k不在当前圆内 then
            把当前圆设为I,j,k三点确定的圆。{确定三点确定的圆}
输出当前圆

【BZOJ1802】真的是好题。我们先来考虑在开头的时候放的尽量的少。

①如果有两个相邻的红格,那么我可以在放好后之后到达任何一个点!于是第一问就是0。至于第二问,找出所有相邻的红格,直接用DP往左右扫。

 for (int i=k-1;i;i--)
    f[i]=min(f[i],f[i+1]+f[i+2]);

②否则必须在偶数格放棋子,扫一遍即可。

for (i=2;i<n;i++)
    if (a[i]&a[i+1]) {flag=1;break;}
  if (!flag) 
  {
    for (i=2;i<n;i++)
      if (!(i&1)) a[i]?ans2++:ans1++;
    printf("%lld\n%lld",ans1,ans2);
    return 0;
  }
  memset(f,60,sizeof(f));
  for (i=1;i<=n;i++) if (a[i]) f[i]=1;
  for (i=2;i<n;i++) 
    if (a[i]&a[i+1]) bfs_left(i),bfs_right(i+1);
  for (i=2;i<n;i++) 
    if (!(i&1)) ans2+=f[i];

【BZOJ3574】题解传送门(跪SYC大爷!)

【BZOJ1873】写的天昏地暗!我觉得有必要贴一下代码。

#include<cstdio>
#include<cstring>
#include<map>
#include<string>
#define N 20005
#define P 41
using namespace std;
map<string,int>pre;
const char Num[11][P]={"","","","killing spree","dominating","mega kill",
"unstoppable","wicked sick","monster kill","godlike","beyond godlike"};
const char Wri[11][P]={"","","","is on a killing spree!","is dominating!",
"has a mega kill!","is unstoppable!","is wicked sick!","has a monster kill!",
"is godlike!","is beyond godlike. someone kill him!"};
char a[P],b[P],Time[P],ch[P];
int belong[N],num[N],kill[N],last[N],death[2];
int A,B,now_Time,ok_kill,ALL,n,i,Q;
bool check()
{
  A=pre[a];B=pre[b];
  return A&&B&&A!=B;
}
void get_Time(){now_Time=(Time[0]*10+Time[1])*60+Time[3]*10+Time[4];}
void First()
{
  if (A==B) {printf("%s has killed himself.\n",a);return;}
  if (!ok_kill) {printf("%s has been killed by %s.\n",b,a);return;}
  if (num[B]>=3) {printf("%s has just ended %s's %s.\n",a,b,Num[num[B]<=10?num[B]:10]);num[B]=0;return;}
  printf("%s pawned %s's head.\n",a,b);num[B]=0;
  if (ok_kill&&!ALL) ALL=1,printf("%s just drew first blood.\n",a);
}
void Second()
{
  if (!ok_kill) return;
  num[A]++;
  if (num[A]>=3) 
  {
    if (num[A]<=10) printf("%s %s\n",a,Wri[num[A]]);
    else printf("%s %s\n",a,Wri[10]);
  }
}
void Third()
{
  if (!ok_kill) return;
  if (kill[A]&&now_Time<=last[A]+10) 
  {
    if (kill[A]==1) printf("%s just got a Double Kill!\n",a);
    else printf("%s just got a Triple Kill!\n",a);
  }
  else kill[A]=0;
  kill[A]++;last[A]=now_Time;
}
void Fourth()
{
  if (!ok_kill) return;
  int now=belong[B];death[now]++;death[now^1]=0;
  if (death[now]>=5) 
    printf("The %s is OWNING!\n",!now?"Scourge":"Sentinel");
}
int main()
{
  freopen("1873.out","w",stdout);
  scanf("%d",&n);
  for (i=1;i<=n;i++)
    scanf("%s%d",a,&belong[i]),pre[a]=i;
  scanf("%d",&Q);ALL=0;
  while (Q--)
  {
    scanf("%s%s%s%s%s%s",Time,b,ch,ch,ch,a);
    ok_kill=check();get_Time();
    First();Second();Third();Fourth();
  }
  return 0;
}

【BZOJ1925*】至今还觉得奇怪的DP(递推、组合数)。有空去看看。

【BZOJ1819】好题目!用dfs序的性质,树状数组维护,还要求LCA。开始忘了怎么在dfs序的树状数组中维护某个点的子树的信息,去问了RZZ,后来发现根本就是傻X问题啊。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: bzoj作为一个计算机竞赛的在线评测系统,不仅可以提供大量的目供程序员练习和学习,还可以帮助程序员提升算法和编程能力。为了更好地利用bzoj进行目的学习和,制定一个bzoj计划是非常有必要的。 首先,我们需要合理安排时间,每天留出一定的时间来做bzoj目。可以根据自己的时间安排,每天挑选适量的目进行解答。可以先从难度较低的目开始,逐渐提高难度,这样既能巩固基础知识,又能挑战自己的思维能力。 其次,要有一个计划和目标。可以规划一个每周或每月的目数量目标,以及每个阶段要学习和掌握的算法知识点。可以根据bzoj目分类,如动态规划、图论、贪心算法等,结合自己的实际情况,有针对性地选择目进行学习。 此外,要充分利用bzoj提供的资源。bzoj网站上有很多高质量的解和优秀的解代码,可以参考和学习。还有相关的讨论区,可以与其他程序员交流和讨论,共同进步。 最后,要坚持并保持思考。做不是单纯为了数量,更重要的是学会思考和总结。遇到难时,要有耐心,多思考,多尝试不同的解法。即使不能一次性解出来,也要学会思考和分析解过程,以及可能出现的错误和优化。 总之,bzoj计划的关键在于合理安排时间、制定目标、利用资源、坚持思考。通过有计划的,可以提高算法和编程能力,并培养解决问的思维习惯,在计算机竞赛中取得更好的成绩。 ### 回答2: bzoj计划是指在bzoj这个在线测评系统上制定一套学习和的计划,并且将计划记录在excel表格中。该计划主要包括以下几个方面的内容。 首先是学习目标的设定。通过分析自己的水平和知识缺口,可以设定一个合理的目标,比如每天解决一定数量的目或者提高特定的算法掌握程度。 其次是目选择的策略。在excel表格中可以记录下自己选择的目编号、目类型和难度等信息。可以根据目的类型和难度来安排每天的计划,确保自己可以逐步提高技巧和解能力。 然后是学习进度的记录和管理。将每天的完成情况记录在excel表格中,可以清晰地看到自己的学习进度和任务完成情况。可以使用图表等功能来对学习进度进行可视化展示,更好地管理自己的学习计划。 同时,可以在excel表格的备注栏中记录下每道目的解思路、关键点和需要复习的知识点等信息。这样可以方便自己回顾和总结,巩固所学的知识。 最后,可以将excel表格与其他相关资料进行整合,比如算法教材、目解析和学习笔记等。这样可以形成一个完整的学习档案,方便自己进行系统的学习和复习。 总之,bzoj计划excel的制定和记录可以帮助我们更加有条理和高效地进行学习和。通过合理安排学习目标和目选择策略,记录学习进度和思路,并整合其他学习资料,我们可以提高自己的解能力,并在bzoj上取得更好的成绩。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值