到了之后看题,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. (网页)logback的使用和logback.xml详解(转)

    转自博客园:行走在云端的愚公: 一.logback的介绍 Logback是由log4j创始人设计的另一个开源日志组件,官方网站: http://logback.qos.ch.它当前分为下面下个模块: ...

  2. Scala并发编程【消息机制】

    1.入门 package actor import scala.actors.Actor import scala.actors.migration.ActorDSL /** * Created by ...

  3. TensorFlow实现Softmax回归(模型存储与加载)

    # -*- coding: utf-8 -*- """ Created on Thu Oct 18 18:02:26 2018 @author: zhen "& ...

  4. 性能测试—JMeter 常用元件(四)

    <零成本web性能测试>第三章 Web性能测试脚本录制与开发中JMeter常用测试元件 测试计划描述了JMeter运行时将会执行的一系列步骤,一个完整的测试计划包含一个或多个线程组.逻辑控 ...

  5. python第二十三天-----作业中

    #!usr/bin/env python #-*-coding:utf-8-*- # Author calmyan import os ,sys,time from core import trans ...

  6. Python数据分析_Pandas_窗函数

    窗函数(window function)经常用在频域信号分析中.我其实不咋个懂,大概是从无限长的信号中截一段出来,然后把这一段做延拓变成一个虚拟的无限长的信号.用来截取的函数就叫窗函数,窗函数又分很多 ...

  7. centos7下安装指定版本mysql5.7.23

    现在mysql版本已经到MySQL 8.0(GA)稳定版本了,所以需求是想简单又快速在centos7下安装指定版本例如MySQL 5.7(GA)版本有下面这种方法 首先需要到mysql官网这里下载对应 ...

  8. 三种方法更改MAC OS X下的HOSTS文件

    1.终端更改 用程序里面打开终端(terminal),输入 sudo vi /etc/hosts 然后提示输入系统密码 hosts文件就自动打开了 接着输入 i 进入编辑模式 将添加的网站,ip拷贝进 ...

  9. MySQL客户端工具的选择

    最近因系统云化项目,学习使用MySQL集群,为了找一款顺手的mysql客户端,反复使用了多个工具,并筛选出一个自认为最满意的,在此分享. 先说我的选择:SQLyog. 尝试的客户端:Toad for ...

  10. 社交网络编程API之iOS系统自带分享

    社交网络编程API 社交网络编程主要使用iOS提供的Social框架,目前Social框架主要包含两个类: SLComposeViewController 提供撰写社交信息(如微博信息)的视图控制器, ...