NOIOL #2 爆零记
没有假是真的爆零了,原因:万恶的文操。不管怎样写份题解吧。
T1:
做题经历:看了下题发现:不是 edu 的原题吗?兴奋地拿出赛中写的程序搞上去。
大约比赛开始 30min 后开始发现 \(k\) 可以等于 \(1\),然后急忙特判了个 \(1\) 就没了。
预计得分(不计文操):100
题解:
由于 \(\operatorname{lcm}(p1,p2) \le 10^{20}\),所以我们可以将带子的长度看做 \(\infty\)。
不妨设 \(p_1<p_2\)。
显然最长的一段连续的相同的色块只可能是红色。
那么我们肯定要贪心的将公共部分染成蓝色。
这样题目就转化为:是否存在整数 \(a\) 使得 \([ap_2+1,(a+1)p_2-1]\) 中 \(p_1\) 的个数 \(\geq k\)
由于 \(p1\) 和 \(p2\) 不一定互质,可以将它们都除以它们的 \(\gcd\)。
根据扩展欧几里得,一定存在正整数 \(x,y\) 使得 \(xp_1-yp_2=1\)。那么我们需检查 \([yp_2+1,(y+1)p_2-1]\) 中是否有 \(\geq k\) 个 \(p_1\) 的倍数。
这可以用 \(\texttt{exgcd}\) 求出,不过进一步发现这里的 \(x,y\) 是什么不重要,因为 \(yp_2+1\) 已经是一个 \(p_2\) 的倍数,我们只需比较 \((x+k-1)p_1+1\) 与 \((y+1)p_2-1\) 的关系,即 \((k-1)p_1+2\) 与 \(p_2\) 的关系。如果 \((k-1)p_1+2 \leq p_2\),答案为 No;反之答案为 Yes。
注意判 \(k=1\)
//Coded by tzc_wk
/*
数据不清空,爆零两行泪。
多测不读完,爆零两行泪。
边界不特判,爆零两行泪。
贪心不证明,爆零两行泪。
D P 顺序错,爆零两行泪。
大小少等号,爆零两行泪。
变量不统一,爆零两行泪。
越界不判断,爆零两行泪。
调试不注释,爆零两行泪。
溢出不 l l,爆零两行泪。
*/
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define fz(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define foreach(it,v) for(__typeof(v.begin()) it=v.begin();it!=v.end();it++)
#define all(a) a.begin(),a.end()
#define giveup(...) return printf(__VA_ARGS__),0;
#define fill0(a) memset(a,0,sizeof(a))
#define fill1(a) memset(a,-1,sizeof(a))
#define fillbig(a) memset(a,0x3f,sizeof(a))
#define fillsmall(a) memset(a,0xcf,sizeof(a))
#define mask(a) (1ll<<(a))
#define maskx(a,x) ((a)<<(x))
#define _bit(a,x) (((a)>>(x))&1)
#define _sz(a) ((int)(a).size())
#define filei(a) freopen(a,"r",stdin);
#define fileo(a) freopen(a,"w",stdout);
#define fileio(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
#define eprintf(...) fprintf(stderr,__VA_ARGS__)
#define put(x) putchar(x)
#define eoln put('\n')
#define space put(' ')
#define y1 y_chenxiaoyan_1
#define y0 y_chenxiaoyan_0
#define int long long
typedef pair<int,int> pii;
inline int read(){
int x=0,neg=1;char c=getchar();
while(!isdigit(c)){
if(c=='-') neg=-1;
c=getchar();
}
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x*neg;
}
inline void print(int x){
if(x<0){
putchar('-');
print(abs(x));
return;
}
if(x<=9) putchar(x+'0');
else{
print(x/10);
putchar(x%10+'0');
}
}
inline int qpow(int x,int e,int _MOD){
int ans=1;
while(e){
if(e&1) ans=ans*x%_MOD;
x=x*x%_MOD;
e>>=1;
}
return ans;
}
signed main(){
int T=read();
while(T--){
int x=read(),y=read(),z=read();
if(z==1){
puts("No");
continue;
}
int gcd=__gcd(x,y);
x/=gcd;y/=gcd;
// cout<<x<<" "<<y<<endl;
if(x*(z-1)+2<=y||y*(z-1)+2<=x) puts("No");
else puts("Yes");
}
return 0;
}
/*
3 4 6 8 9 12
*/
T2:
做题经历:50 分做法太水不过了,不能满足我的要求,因此一直在想满分做法。
想了 \(~25\) min,想到了一个线段树做法,就开始写。
写+调大约共用时 \(30\) 分钟。然后造极端数据发现跑了 3000ms /fad
疯狂卡常,耗在卡常上的时间堪比写程序的时间。register、inline 什么的全用上了,然后也没有发现明显的优化效果。
据说是取模的常数大?
预计得分(不计文操):70~100(不知道 CCF 数据毒不毒)
题解:
首先值域是 \(10^9\) 就暗示着需要离散化。
我们枚举左端点 \(l\),考虑当左端点为 \(l\) 的区间对答案的贡献,把这些贡献全部加在一起就是最终的答案。
题目就简化为求 \(\sum\limits_{i=l}^n f(l,i)^2\)
对于 \([l,n]\) 中出现过的数 \(x\),我们找出它在 \([l,n]\) 中出现最靠左的位置 \(pos_x\)。我们记 \(t_i\) 为 \(f(l,i)\) 的值。倒着循环 \(l\),考虑左端点从 \(l+1\) 变为 \(l\) 的影响,假设原来的 \(pos_{a_l}\) 为 \(l'\),那么会发生以下两件事:
- \(pos_{a_l}\) 会变为 \(l\)
- \(t_l,t_{l+1},\dots,t_{l'-1}\) 的值将全部加 \(1\)。因为 \(a_l\) 这个数在 \([l+1,l],[l+1,l+1],\dots,[l+1,l'-1]\) 中没有出现过,而在 \([l,l],[l,l+1],\dots,[l,l'-1]\) 出现过了。
那么现在就变成了下面的问题:
- 区间加某个数
- 求区间中所有数平方的和
这个可以用线段树来实现。考虑区间加上某个数 \(k\),那么平方和变为:
\]
\]
\]
维护区间平方和和区间和就可以做到 \(\mathcal O(1)\) 更新了。
//Coded by tzc_wk
/*
数据不清空,爆零两行泪。
多测不读完,爆零两行泪。
边界不特判,爆零两行泪。
贪心不证明,爆零两行泪。
D P 顺序错,爆零两行泪。
大小少等号,爆零两行泪。
变量不统一,爆零两行泪。
越界不判断,爆零两行泪。
调试不注释,爆零两行泪。
溢出不 l l,爆零两行泪。
*/
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define fz(i,a,b) for(register int i=a;i<=b;i++)
#define fd(i,a,b) for(register int i=a;i>=b;i--)
#define foreach(it,v) for(__typeof(v.begin()) it=v.begin();it!=v.end();it++)
#define all(a) a.begin(),a.end()
#define giveup(...) return printf(__VA_ARGS__),0;
#define fill0(a) memset(a,0,sizeof(a))
#define fill1(a) memset(a,-1,sizeof(a))
#define fillbig(a) memset(a,0x3f,sizeof(a))
#define fillsmall(a) memset(a,0xcf,sizeof(a))
#define mask(a) (1ll<<(a))
#define maskx(a,x) ((a)<<(x))
#define _bit(a,x) (((a)>>(x))&1)
#define _sz(a) ((int)(a).size())
#define filei(a) freopen(a,"r",stdin);
#define fileo(a) freopen(a,"w",stdout);
#define fileio(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
#define eprintf(...) fprintf(stderr,__VA_ARGS__)
#define put(x) putchar(x)
#define eoln put('\n')
#define space put(' ')
#define y1 y_chenxiaoyan_1
#define y0 y_chenxiaoyan_0
#define int long long
typedef pair<int,int> pii;
inline int read(){
int x=0,neg=1;char c=getchar();
while(!isdigit(c)){
if(c=='-') neg=-1;
c=getchar();
}
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x*neg;
}
inline void print(int x){
if(x<0){
putchar('-');
print(abs(x));
return;
}
if(x<=9) putchar(x+'0');
else{
print(x/10);
putchar(x%10+'0');
}
}
inline int qpow(int x,int e,int _MOD){
int ans=1;
while(e){
if(e&1) ans=ans*x%_MOD;
x=x*x%_MOD;
e>>=1;
}
return ans;
}
const int MOD=1e9+7;
int n,a[1000005],key[1000005],hs[1000005],cnt=0;
struct node{
int l,r;
int sum,sqr;
int lz;
} s[1000005<<2];
inline void build(int k,int l,int r){
s[k].l=l;s[k].r=r;
if(l==r) return;
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
}
inline void pushup(int k){
s[k].sqr=s[k<<1].sqr+s[k<<1|1].sqr;
if(s[k].sqr>MOD) s[k].sqr-=MOD;
s[k].sum=s[k<<1].sum+s[k<<1|1].sum;
if(s[k].sum>MOD) s[k].sum-=MOD;
}
inline void pushdown(int k){
if(!s[k].lz) return;
s[k<<1].sqr=(s[k<<1].sqr+2*s[k].lz*s[k<<1].sum+(s[k<<1].r-s[k<<1].l+1)*s[k].lz*s[k].lz)%MOD;
s[k<<1].sum=(s[k<<1].sum+(s[k<<1].r-s[k<<1].l+1)*s[k].lz)%MOD;
s[k<<1].lz+=s[k].lz;
s[k<<1|1].sqr=(s[k<<1|1].sqr+2*s[k].lz*s[k<<1|1].sum+(s[k<<1|1].r-s[k<<1|1].l+1)*s[k].lz*s[k].lz)%MOD;
s[k<<1|1].sum=(s[k<<1|1].sum+(s[k<<1|1].r-s[k<<1|1].l+1)*s[k].lz)%MOD;
s[k<<1|1].lz+=s[k].lz;
s[k].lz=0;
}
inline void modify(int k,int l,int r,int x){
if(l<=s[k].l&&s[k].r<=r){
s[k].sqr=(s[k].sqr+2*x*s[k].sum+(s[k].r-s[k].l+1)*x*x)%MOD;
s[k].sum=(s[k].sum+(s[k].r-s[k].l+1)*x)%MOD;
s[k].lz+=x;
return;
}
pushdown(k);
int mid=(s[k].l+s[k].r)>>1;
if(r<=mid) modify(k<<1,l,r,x);
else if(l>mid) modify(k<<1|1,l,r,x);
else modify(k<<1,l,mid,x),modify(k<<1|1,mid+1,r,x);
pushup(k);
}
inline int query(int k,int l,int r){
if(l<=s[k].l&&s[k].r<=r){
return s[k].sqr;
}
pushdown(k);
int mid=(s[k].l+s[k].r)>>1;
if(r<=mid) return query(k<<1,l,r);
else if(l>mid) return query(k<<1|1,l,r);
else return (query(k<<1,l,mid)+query(k<<1|1,mid+1,r))%MOD;
}
int lst[1000005];
signed main(){
n=read();
fz(i,1,n) a[i]=read();
fz(i,1,n) key[i]=a[i];
sort(key+1,key+n+1);
fz(i,1,n) if(key[i]!=key[i-1]) hs[++cnt]=key[i];
fz(i,1,n) a[i]=lower_bound(hs+1,hs+cnt+1,a[i])-hs;
fz(i,1,cnt) lst[i]=n+1;
build(1,1,n);
int ans=0;
fd(i,n,1){
modify(1,i,lst[a[i]]-1,1);
ans=(ans+query(1,i,n))%MOD;
// cout<<query(1,i,n)<<endl;
lst[a[i]]=i;
}
cout<<ans<<endl;
return 0;
}
/*
6
1 2 1 3 2 1
*/
T3:
做题经历:由于做完 T2 之后划了 \(40\) 分钟的水,时间不太够了。再加上一开始 ix35 神仙还发了个贴说看不懂样例(雾,信就是 ix35 在假,因为他不久就狂切掉了这道题),让我以为是道毒瘤题就没往下写。
因此花了 \(20\) 分钟写了个暴力 \(40\) 分程序就走人了。
赛后看了下题解发现思路其实也没那么超纲。
不管怎样赛后再填吧。
赛后 \(30\) 分钟心情还是蛮好的。
然后发现要文操。
呃呃呃呃呃……什么东西。
最后,爆零选手 ET2006 衷心提醒大家:
忘文件操作,爆零两行泪。
NOIOL #2 爆零记的更多相关文章
- Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals)爆零记
昨晚一个瓜皮说今晚有cf,听说是晚间场,我瞅了一眼,娃,VK Cup,上分的好机会,看着比赛时间就有点心酸了,0:35,当时一直在纠结要不要打的问题,当时想着应该不难吧,要不打一下吧,要不还是看看题先 ...
- HNOI2019 爆零记
HNOI2019爆零记 day \(-inf\) ~ day \(0\) 开学一周之后才停的课,停课之后就开始每天被包菜.我三月份几乎没有更博,就是因为每天都被虐的自闭了. day \(0\) 本来是 ...
- PKUWC 2019&WC 2019爆零记
PKUWC 2019&WC 2019爆零记 毕竟过了很久了,杂七杂八的东西就不写了,并且除成绩之外的内容不保证其正确性. Day1 T1:看到这道题很舒服啊,枚举top序算合法图的数量,状压D ...
- 雅礼集训1-9day爆零记
雅礼集训1-9day爆零记 先膜一下虐爆我的JEFF巨佬 Day0 我也不知道我要去干嘛,就不想搞文化科 (文化太辣鸡了.jpg) 听李总说可以去看(羡慕)各路大佬谈笑风声,我就报一个名吧,没想到还真 ...
- [日常] NOIWC 2018爆零记
开个坑慢慢更(逃 (然而没准会坑掉?) day 0 大概 $8:30$ 就滚去雅礼了qwq 过去的时候发现并没有人...进报到处楼门的时候还被强行拍照围观了一波OwO 然后就领了HZ所有人的提包和狗牌 ...
- CTS&&APIO2019爆零记
如果你只好奇测试相关请跳至day 2 day 3 day 6 scoi 2019 之后 由于实力问题,省选的时候排名在三十多,显然是没有进队.不过可能是受过的打击比较多,所以还没有特别颓废,甚至连 ...
- NOIp 0916 爆零记
题目来自神犇chad 上次爆零是说着玩,这次真的爆零了QAQ 好吧貌似是TYVJ的模拟赛打多了..一直按照TYVJ的格式提交的压缩包.. 然后莫名其妙就AK了hhh 来的时候迟到了半小时,昨晚痛苦的补 ...
- GDKOI2016 爆零记
滚粗了非常伤心>_< day 0 老师通知能够去试机,于是非常愉快地将近三点半左右的时间到了二中.然后发现老师已经准备关机房了,说我怎么才来.. .喂喂喂不是说三点半到五点的么 晚上本来想 ...
- HNOI2019爆零记
HNOI2019真-爆零祭 我怎么这么菜QAQ day-37 从学科溜过来搞OI. 班主任一直在谈论我退役的事情,这就是NOIP挂分的后果...说我没考好就找理由,人家xxxxxxx可不是xxxxxx ...
随机推荐
- Unity——计时器功能实现
Unity计时器 Demo展示 介绍 游戏中有非常多的计时功能,比如:各种cd,以及需要延时调用的方法: 一般实现有一下几种方式: 1.手动计时 float persistTime = 10f flo ...
- 【UE4 C++ 基础知识】<3> 基本数据类型、字符串处理及转换
基本数据类型 TCHAR TCHAR就是UE4通过对char和wchar_t的封装 char ANSI编码 wchar_t 宽字符的Unicode编码 使用 TEXT() 宏包裹作为字面值 TCHAR ...
- [源码解析] Pytorch 如何实现后向传播 (1)---- 调用引擎
[源码解析] Pytorch 如何实现后向传播 (1)---- 调用引擎 目录 [源码解析] Pytorch 如何实现后向传播 (1)---- 调用引擎 0x00 摘要 0x01 前文回顾 1.1 训 ...
- gson中TypeAdapter实现自定义序列化操作
最近在项目中遇到这么一个问题,我们后台需要向前端返回一个 json 数据,就是将一个地理位置对象以json的格式返回到前台,但是这个地理位置对象中的经纬度是Double数据类型,项目中规定,如果经纬度 ...
- MySQL 的架构与组件
MySQL 的逻辑架构图设计图 连接/线程处理:管理客户端连接/会话[mysql threads] 解析器:通过检查SQL查询中的每个字符来检查SQL语法,并为每个SQL查询生成 SQL_ID. 此 ...
- 基于屏幕空间的实时全局光照(Real-time Global Illumination Based On Screen Space)
目录 Reflective Shadow Maps(RSM) RSM 的重要性采样 RSM 的应用与缺陷 Screen Space Ambient Occulsion(SSAO) SSAO Blur ...
- 转:Linux常用命令总结
学习linux也有一阵子了,现总结一些常用的linux操作命令,方便大家查找1. cd命令这个命令是最基本的也是最常用的.它用于切换当前目录,可以是绝对路径,也可以是相对路径.例:cd /root/h ...
- Vivado Synth/Place Faild但是没有给出error信息
最近遇到一个现象,以前可以编译通过的工程,修改之后发现Synthesis编译报错,而且没有给出error信息,以前也出现过无故place 失败但是没有给出error信息的现象,查看错误日志输出文件,出 ...
- 【Azure 存储服务】代码版 Azure Storage Blob 生成 SAS (Shared Access Signature: 共享访问签名)
问题描述 在使用Azure存储服务,为了有效的保护Storage的Access Keys.可以使用另一种授权方式访问资源(Shared Access Signature: 共享访问签名), 它的好处可 ...
- 权限控制-RBAC(Role-Based Access Control)
RBAC是基于角色的权限访问控制,在RBAC中角色与权限相连,用户通过成为某个角色而得到角色的权限,这就极大的简化了权限的管理,用户和角色多对多,角色和权限多对多,由此产生用户表.角色表.权限表,用户 ...