到了之后看题,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. Linux 目录结构学习与简析 Part1

    linux目录结构学习与简析 by:授客 QQ:1033553122 说明: /             linux系统目录树的起点 =============== /bin      User Bi ...

  2. Linux下的进程类别(内核线程、轻量级进程和用户进程)--Linux进程的管理与调度(四)

    本文中出现的,内核线程,轻量级进程,用户进程,用户线程等概念,如果不太熟悉, 可以参见 内核线程.轻量级进程.用户线程三种线程概念解惑(线程≠轻量级进程) Linux进程类别 虽然我们在区分Linux ...

  3. HDU ACM 1879 继续畅通工程

    继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  4. php开发中遇到的一些问题

    php警告提示A session had already been started – ignoring session_start() 解决方案 判断 如果session_id 不存在,说明没有储存 ...

  5. 30个最常用的Linux系统命令行

    1.cd命令这是一个非常基本,也是大家经常需要使用的命令,它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径.如:cd /root/Docements # 切换到目录 ...

  6. MATLAB常微分方程的数值解法

    MATLAB常微分方程的数值解法 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ 一.实验目的 科学技术中常常要求解常微分方程的定解问题,所谓数值解法就是 ...

  7. 推荐5款简洁美观的Hexo主题

    2018-11-17 17:15:46 原文地址:http://www.izhongxia.com 以下是 <hexo 主题列表> 中挑选出来一些比较简洁美观的主题(存在个人主观意识,请勿 ...

  8. darknet优化经验-AlexeyAB大神经验

    目录 darknet优化经验 1. AlexeyAB改进项 2. Linux下编译选项 3. 训练经验 4. 提升检测效果 5. 总结 6. AlexeyAB大神改进 darknet优化经验 主要来自 ...

  9. rac添加新节点的步骤与方法(官方步骤与自我测试)

    Extending the Oracle Grid Infrastructure Home to the New NodeNow that the new node has been configur ...

  10. HTTPS协议,SSL协议及完整交互过程

    文章转自 https://blog.csdn.net/dfsaggsd/article/details/50910999 SSL 1.        安全套接字(Secure Socket Layer ...