到了之后看题,T1一看发现真熟悉,和之前做的一道题真的像,然后内心:

这里是绍一啊,不可能就出这么简单的题

我题意没理解错啊,这不是单独计算每条边的贡献么

维护一个人数的大小,然后直接搞一波就可以了吧

......(狂码5mins)

(一测样例,过了)

这么爽,赶紧写个暴力+对拍

......(15mins later)

居然过了,瑟瑟发抖莫名自信

然后就真的A了T1不过真的很水

然后开T2,这种计算循环节的题目,lcm内的肯定可以做的啊

结果结合数据范围直接写了个暴力60pts的算法。

之后没有什么思路,感觉再推下去也写不出,然后就开始卡常

几发之后开T3,发现这个式子是\(O(n^3)\)计算的,还要套上一个\(q\)感觉要完

发现那个最大值很好求,直接RMQ之后\(O(1)\)求就可以了,但\(O(qn^2)\)至于30pts

想想怎么\(O(qn)\),然后就开始画图,结果YY着:

枚举每个点为最大值的情况感觉可以

然后找出左右边界的位置即可

这什么鬼,不是单调栈水一水的东西吗

(......马上码完调过样例)

然后一算大概210左右,然后就开始拍T3

期间上厕所遇到了yekehe,跟他说基准分绝壁210,他也表示十分认同。

回来发现拍了10mins后T3WA了!

吓得我一哆嗦,然后发现太大调不出,所以改了下数据范围,然后一直没拍出来。

后来感觉是个很小的细节flag最后忐忑的交了上去。

结果最后一测170,T1A了,T2多卡了10分,但T3爆零了。

后来一看sol发现没有考虑两个数相同的情况,我单调栈都写了小于号,但实际上应该是一个地方加等于的。

然后发现yekehe也和我一样T3爆零了。

最后看了下排名220已经很高了(最快的Rank2),这里%%%一发X_o_r dalao220pts

前面已经讲了很多了,这里简略的给出题解:

城市

题目要求的是\(\sum u\sum v\ dis(u,v)\)。

我们单独考虑每一条边对答案的贡献。我们DFS预处理出两边的人数,最后乘起来就好了。

因为这是一棵树,而树上路径唯一。因此他们必然经过这条边。

CODE

#include<cstdio>
#include<cctype>
#include<cstring>
using namespace std;
const int N=1000005,mod=1e9+7;
struct edge
{
int to,next;
}e[N<<1];
int head[N],n,x,y,cnt,num[N],tot,ans;
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch; while (!isdigit(ch=tc()));
while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
}
inline void double_add(int x,int y)
{
e[++cnt].to=y; e[cnt].next=head[x]; head[x]=cnt;
e[++cnt].to=x; e[cnt].next=head[y]; head[y]=cnt;
}
inline void inc(int &x,int y)
{
if ((x+=y)>=mod) x-=mod;
}
inline void DFS(int now,int fa)
{
register int i; inc(num[now],now);
for (i=head[now];~i;i=e[i].next)
if (e[i].to!=fa) DFS(e[i].to,now),inc(num[now],num[e[i].to]);
}
int main()
{
freopen("city.in","r",stdin); freopen("city.out","w",stdout);
register int i; read(n);
memset(head,-1,sizeof(head));
for (i=1;i<n;++i)
read(x),read(y),double_add(x,y);
DFS(1,-1); tot=1LL*(n+1)*n/2%mod;
for (i=1;i<=n;++i)
inc(ans,(1LL*num[i]*((tot-num[i]+mod)%mod))%mod);
return printf("%d",ans),0;
}

人工智障

由于我比较菜,到现在也不是很理解正解的玄学推导。

因此这里推个dalao写的blog:现场A掉此题的YPC dalao

然后给出我的抄来的CODE(写法可能有细微区别)

#include<cstdio>
#include<cctype>
using namespace std;
typedef long long LL;
const LL N=500005;
LL k,ans1,ans2,tot1,tot2,t,num[3],n,m,a[N],b[N],g;
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(LL &x)
{
x=0; char ch; while (!isdigit(ch=tc()));
while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
}
inline LL gcd(LL n,LL m)
{
return m?gcd(m,n%m):n;
}
int main()
{
freopen("ai.in","r",stdin); freopen("ai.out","w",stdout);
register LL i,j,s; read(n); read(m); read(k);
for (i=1;i<=n;++i) read(a[i]);
for (i=1;i<=m;++i)read(b[i]); g=gcd(n,m);
for (i=1;i<=g;++i)
{
num[0]=num[1]=num[2]=0;
for (j=i;j<=n;j+=g) ++num[a[j]];
for (j=i;j<=m;j+=g) ans1+=num[(b[j]+2)%3],ans2+=num[(b[j]+1)%3];
}
t=n/g*m; ans1*=k/t; ans2*=k/t; k%=t;
if (k)
{
for (s=1;s<=g;++s)
{
num[0]=num[1]=num[2]=0; LL tail=s;
for (i=1;i<=(k-1)/n+1;++i)
{
++num[b[tail]]; if (i<=(k-1)/n) tail=(tail+n-1)%m+1;
}
for (i=s;;i=(i+n-1)%m+1)
{
for (j=i;j<=n;j+=m)
{
if (j>(k-1)%n+1) --num[b[tail]];
ans1+=num[(a[j]+1)%3]; ans2+=num[(a[j]+2)%3];
if (j>(k-1)%n+1) ++num[b[tail]];
}
tail=(tail+n-1)%m+1; ++num[b[tail]]; --num[b[i]];
if ((i+n-1)%m+1==s) break;
}
}
}
return printf("%lld %lld",ans1,ans2),0;
}

循环

还是一道很套路的题,我们考虑对原来的式子:

\(\sum_{L=l}^{r}\sum_{R=L}^{r}max(x_{i})(L<=i<=R)\)

我们加一个RMQ就可以\(O(1)\)查询了。

然后考虑计算当一个点为最大值是它两边最远能扩展到哪里。

这还是前后两遍单调栈就可以解决的事情。

然后50pts到手。到后面的话由于套路性太强,以后再来讨论:

50~70ptsCODE(看机子的性能来决定分数)

#include<cstdio>
#include<cctype>
using namespace std;
const int N=500005;
int n,a[N],stack[N],top,front[N],back[N],num[N],q,l,r;
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch; while (!isdigit(ch=tc()));
while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
}
inline void write(long long x)
{
if (x>9) write(x/10);
putchar(x%10+'0');
}
inline long long solve(int l,int r)
{
register int i; long long tot=0;
for (i=l;i<=r;++i)
{
int L=front[i]<l?l-1:front[i],R=back[i]>r?r+1:back[i];
tot+=1LL*a[i]*(i-L)*(R-i);
}
return tot;
}
int main()
{
freopen("calc.in","r",stdin); freopen("calc.out","w",stdout);
register int i; read(n); read(q);
for (i=1;i<=n;++i) read(a[i]);
for (i=1;i<=n;++i)
{
while (top&&stack[top]<=a[i]) --top;
front[i]=num[top];
stack[++top]=a[i]; num[top]=i;
}
for (top=0,num[0]=n+1,i=n;i>=1;--i)
{
while (top&&stack[top]<a[i]) --top;
back[i]=num[top];
stack[++top]=a[i]; num[top]=i;
}
while (q--)
{
read(l); read(r);
write(solve(l,r)); putchar('\n');
}
return 0;
}

然后光荣炸裂。

绍一集训Round#1的更多相关文章

  1. 绍一集训Round#2

    Preface 感觉这次的题目是真的太水了,可能是为了让我们涨一波信心的吧. 不过最后一题没有想到那种玄学做法还是太菜了,还是要一波姿势的啊. 交换 一道入门难度题,根据排序不等式(又或是简单推导可以 ...

  2. 2018年山东省省队集训 Round 1 Day 2简要题解

    从这里开始 Problem A 生日礼物 Problem B 咕咕 Problem C 解决npc (相信来看这篇博客的人都有题面) T2以为可以线性递推,然后花了两个小时.然后想了两个小时T1,会了 ...

  3. ZZUACM 2015 暑假集训 round 01

    A. Encoding Problem Description Given a string containing only 'A' - 'Z', we could encode it using t ...

  4. 「山东省队集训2021 Round 1」 半夜

    考虑将 \(X\) 复制一次放到后面再对其长度为 \(n\) 的连续子串和 \(Y\) 求一波 \(\rm{Longest\ Common\ Subsequence}\) 就能得到 \(\Theta( ...

  5. [日常] NOIP前集训日记

    写点流水账放松身心... 10.8 前一天考完NHEEE的一调考试终于可以开始集训了Orz (然后上来考试就迟到5min, GG) T1维护队列瞎贪心, 过了大样例交上去一点也不稳...T出翔只拿了5 ...

  6. 路飞学城-Python开发集训-第3章

    学习心得: 通过这一章的作业,使我对正则表达式的使用直接提升了一个level,虽然作业完成的不怎么样,重复代码有点多,但是收获还是非常大的,有点找到写代码的感觉了,遗憾的是,这次作业交过,这次集训就结 ...

  7. PKUWC2019 Round 2 没去祭

    因为今年有两场 PKUWC,所以叫 PKUWC2019 Round 2. 因为一些沙雕原因,今年去不了了. Day 0 一如既往,没有集训就去上数学课,今天讲几何变换,一如既往的只会说"少女 ...

  8. 2019暑期金华集训 Day6 杂题选讲

    自闭集训 Day6 杂题选讲 CF round 469 E 发现一个数不可能取两次,因为1,1不如1,2. 发现不可能选一个数的正负,因为1,-1不如1,-2. hihoCoder挑战赛29 D 设\ ...

  9. QDEZ集训笔记【更新中】

    这是一个绝妙的比喻,如果青岛二中的台阶上每级站一只平度一中的猫,差不多站满了吧 自己的理解 [2016-12-31] [主席树] http://www.cnblogs.com/candy99/p/61 ...

随机推荐

  1. loadrunner 场景设计-设计与实践

    场景设计-设计与实践 by:授客 QQ:1033553122 以lr 11.0 自带Web Tours为例,进行以下测试 说明:以下测试仅供演示,学习设计思路 A.确定系统组件 简单B/S架构:Cli ...

  2. spring 引用Bean的属性值

    引用Bean的属性值 从Spring3.0开始,可以通过#{beanName.beanProp}的方式方便地引用另一个bean的属性值1.不需要使用PropertyPlaceholderConfigu ...

  3. Linux主机定期打补丁修复漏洞

    1.如图扫描出来的漏洞 不看不知道,一看吓一跳  2.Linux主机如何扫描漏洞 参照:Linux操作系统下查找漏洞的几种必备兵器 3.linux操作系统怎么样打补丁?linux系统升级软件 使用yu ...

  4. tkinter中button按钮控件(三)

    button控件 简单的实现: import tkinter wuya = tkinter.Tk() wuya.title("wuya") wuya.geometry(" ...

  5. python第四十二天 socket ---ssh

    用scoket 写一个简版的ssh 服务端: #!usr/bin/env python #-*-coding:utf-8-*- # Author calmyan import socket,os s= ...

  6. Jenkins的配置从节点中默认没有Launch agent via Java Web Start,该如何配置使用

    Jenkins的配置从节点中默认没有Launch agent via Java Web Start,如下图所示,而这种启动方式在Windows上是最方便的. 如何设置才能让出来呢? 1:打开" ...

  7. 如何检查oracle的归档日志及空间占用率,清除归档日志

    如何解决“归档日志已满问题” 问题描述: 所用数据库为 Oracle 10g ,模式为归档模式,oracle 系统默认的归档空间为2G,由于日志过多,空间写满,数据库的redo文件不能归档,而出现or ...

  8. The Art of Unit Testing With Examples in .NET

    The Art of Unit Testing With Examples in .NET

  9. Git的上传步骤

    Git的上传步骤 1.Git的命令基础 Git是当下最流行的版本控制工具(VCS),由linux系统之父linus开发.它能实现 团队中的代码协作开发,它在代码同步和代码管理方面功能强大,理念先进. ...

  10. Appium 实战练习一

    # -*- coding:utf-8 -*- ''' Created on Sep 30, 2018 @author: SaShuangYiBing Comment: ''' import time ...