vijos国庆节模拟赛之繁星春水
A.闪烁的繁星
题目:https://vijos.org/p/1881
题解:貌似做过小白逛公园或者序列操作都可以秒出吧,就是pushup函数比较麻烦,不过仔细想一想就知道了。
代码:
- #include<cstdio>
- #include<cstdlib>
- #include<cmath>
- #include<cstring>
- #include<algorithm>
- #include<iostream>
- #include<vector>
- #include<map>
- #include<set>
- #include<queue>
- #include<string>
- #define maxn 250000+1510
- #define maxm 500+100
- #define eps 1e-10
- #define ll long long
- #define pa pair<int,int>
- #define for0(i,n) for(int i=0;i<=(n);i++)
- #define for1(i,n) for(int i=1;i<=(n);i++)
- #define for2(i,x,y) for(int i=(x);i<=(y);i++)
- #define for3(i,x,y) for(int i=(x);i>=(y);i--)
- #define mod 1000000007
- using namespace std;
- inline int read()
- {
- int x=,f=;char ch=getchar();
- while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
- while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
- return x*f;
- }
- int n,m;
- struct seg{int l,r,ls,rs,lx,rx,mx;}t[*maxn];
- void build(int k,int l,int r)
- {
- t[k].l=l;t[k].r=r;t[k].lx=t[k].rx=t[k].mx=t[k].ls=t[k].rs=;
- if(l==r)return;
- int mid=(l+r)>>;
- build(k<<,l,mid);build(k<<|,mid+,r);
- }
- void pushup(int k)
- {
- int l=k<<,r=k<<|,mid=(t[k].l+t[k].r)>>;
- t[k].ls=t[l].ls;t[k].rs=t[r].rs;
- t[k].lx=t[l].lx;
- t[k].rx=t[r].rx;
- t[k].mx=max(t[l].mx,t[r].mx);
- if(t[l].rs!=t[r].ls)
- {
- t[k].mx=max(t[k].mx,t[l].rx+t[r].lx);
- if(t[l].mx==mid-t[k].l+)t[k].lx=max(t[k].lx,t[l].mx+t[r].lx);
- if(t[r].mx==t[k].r-mid)t[k].rx=max(t[k].rx,t[r].mx+t[l].rx);
- }
- //cout<<t[k].l<<' '<<t[k].r<<' '<<t[k].ls<<' '<<t[k].rs<<' '<<t[k].lx<<' '<<t[k].rx<<' '<<t[k].mx<<endl;
- }
- void change(int k,int x)
- {
- int l=t[k].l,r=t[k].r,mid=(l+r)>>;
- if(l==r){t[k].rs=-t[k].rs;t[k].ls=t[k].rs;return;}
- if(x<=mid)change(k<<,x);else change(k<<|,x);
- pushup(k);
- }
- int main()
- {
- freopen("input.txt","r",stdin);
- freopen("output.txt","w",stdout);
- n=read();m=read();
- build(,,n);
- while(m--)change(,read()),printf("%d\n",t[].mx);
- return ;
- }
B.石阶上的砖
题目:https://vijos.org/p/1882
题解:这种题我居然没有做出来T_T
正解是把每个数减去它的相对高度之后降问题转化为一个单变量绝对值和的最小值,显然是中位数。。。
为何我考试的时候以为是神题就放弃了。。。
以后碰到带绝对值的就往中位数想!
代码:(考场上的sb骗分)
- #include<cstdio>
- #include<cstdlib>
- #include<cmath>
- #include<cstring>
- #include<algorithm>
- #include<iostream>
- #include<vector>
- #include<map>
- #include<set>
- #include<queue>
- #include<string>
- #define inf 1000000000000000
- #define maxn 500000
- #define maxm 500+100
- #define eps 1e-10
- #define ll long long
- #define pa pair<int,int>
- #define for0(i,n) for(int i=0;i<=(n);i++)
- #define for1(i,n) for(int i=1;i<=(n);i++)
- #define for2(i,x,y) for(int i=(x);i<=(y);i++)
- #define for3(i,x,y) for(int i=(x);i>=(y);i--)
- #define mod 1000000007
- using namespace std;
- inline ll read()
- {
- ll x=,f=;char ch=getchar();
- while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
- while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
- return x*f;
- }
- ll n,ans,a[][maxn];
- ll f(ll x){return x>?x:-x;}
- inline ll check(ll x)
- {
- ll t=;
- for0(i,)
- for1(j,n)
- t+=f(a[i][j]-(x+f(j-(n+)/)));
- return t;
- }
- int main()
- {
- freopen("input.txt","r",stdin);
- freopen("output.txt","w",stdout);
- n=read();
- for0(i,)
- for1(j,n)
- a[i][j]=read();
- ans=inf;
- for0(i,)
- for1(j,n)
- ans=min(ans,check(a[i][j]));
- printf("%lld\n",ans);
- return ;
- }
代码:(正解)
- #include<cstdio>
- #include<cstdlib>
- #include<cmath>
- #include<cstring>
- #include<algorithm>
- #include<iostream>
- #include<vector>
- #include<map>
- #include<set>
- #include<queue>
- #include<string>
- #define inf 1000000000
- #define maxn 1000000
- #define maxm 500+100
- #define eps 1e-10
- #define ll long long
- #define pa pair<int,int>
- #define for0(i,n) for(int i=0;i<=(n);i++)
- #define for1(i,n) for(int i=1;i<=(n);i++)
- #define for2(i,x,y) for(int i=(x);i<=(y);i++)
- #define for3(i,x,y) for(int i=(x);i>=(y);i--)
- #define mod 1000000007
- using namespace std;
- inline ll read()
- {
- ll x=,f=;char ch=getchar();
- while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
- while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
- return x*f;
- }
- ll n,a[*maxn];
- inline ll f(ll x){return x>?x:-x;}
- int main()
- {
- freopen("input.txt","r",stdin);
- freopen("output.txt","w",stdout);
- n=read();
- for1(i,n)a[i]=read()-f(i-(n+)/);
- for1(i,n)a[n+i]=read()-f(i-(n+)/);
- sort(a+,a+*n+);
- ll ans=;
- for1(i,*n)ans+=f(a[i]-a[n]);
- printf("%lld\n",ans);
- return ;
- }
C.月光的魔法
题目:https://vijos.org/p/1883
题解:这题比较有意思,考场上大部分时间都在想这题。
每个圆本来只能增加1个平面
会出现更多 是因为一些圆首尾相接把一个大圆割成了两部分
先把圆转化为线段
找出每个圆的第一个祖先
意思就是 完全包含而又最小的圆
然后按左端点递增,左端点相同则右端点越远越优先排序
然后我yy了一个dfs,是这样的
- void dfs(int x)
- {
- while(m<=n&&a[m].y<=a[x].y)
- {
- fa[m]=x;
- m++;
- dfs(m-);
- }
- }
因为右端点比x小,而且左端点在x右边的圆一定被x完全包含,而我们只需要一级,所以把这个过程递归下去。
然后就可以求出每个点i的fa[i]了
然后这样扫一遍
- for1(i,n)s[fa[i]]+=a[i].y-a[i].x;
- int ans=n+;
- for1(i,n)if(s[i]==a[i].y-a[i].x)ans++;
此题就over了。
不知神犇们还有什么更好的方法,我感觉我的方法比较猎奇。。。
代码:
- #include<cstdio>
- #include<cstdlib>
- #include<cmath>
- #include<cstring>
- #include<algorithm>
- #include<iostream>
- #include<vector>
- #include<map>
- #include<set>
- #include<queue>
- #include<string>
- #define inf 100000000000
- #define maxn 500000
- #define maxm 500+100
- #define eps 1e-10
- #define ll long long
- #define pa pair<int,int>
- #define for0(i,n) for(int i=0;i<=(n);i++)
- #define for1(i,n) for(int i=1;i<=(n);i++)
- #define for2(i,x,y) for(int i=(x);i<=(y);i++)
- #define for3(i,x,y) for(int i=(x);i>=(y);i--)
- #define mod 1000000007
- using namespace std;
- inline ll read()
- {
- ll x=,f=;char ch=getchar();
- while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
- while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
- return x*f;
- }
- struct rec{ll x,y;}a[maxn];
- int n,m,ans,fa[maxn];
- ll s[maxn];
- inline bool cmp(rec a,rec b)
- {
- return a.x<b.x||(a.x==b.x&&a.y>b.y);
- }
- void dfs(int x)
- {
- while(m<=n&&a[m].y<=a[x].y)
- {
- fa[m]=x;
- m++;
- dfs(m-);
- }
- }
- int main()
- {
- freopen("input.txt","r",stdin);
- freopen("output.txt","w",stdout);
- n=read();
- for1(i,n)
- {
- ll x=read(),y=read();
- a[i].x=x-y;a[i].y=x+y;
- }
- sort(a+,a+n+,cmp);
- m=;
- a[].y=inf;
- dfs();
- for1(i,n)s[fa[i]]+=a[i].y-a[i].x;
- int ans=n+;
- for1(i,n)if(s[i]==a[i].y-a[i].x)ans++;
- printf("%d\n",ans);
- return ;
- }
D.诗情
题目:https://vijos.org/p/1884
题解:考场上只会2^m*n的递推,简直sb。。。MLE+TLE
因为昨天刚做了一道类似的T_T
话说暴力枚举每个位置上的数也比这个快把T_T
然后搬运一份正解:
(用meet-in-the-middle的思想。先一遍dfs暴力求出长度为[n/2]的情况下([x]表示对x下取整),某一hash值f有多少个串与之对应。
求出33对于2^m的逆元inv,然后反向dfs后半段。可以秒出。)
竟如此简单。。。 话说在黑书上看过这种思想啊,当时为什么没想出来T_T
有几个细节需注意:
1)因为gcd(33,1<<m)==1,所以33对1<<m有逆元
2)33模1<<m的逆元=power(33,phi(1<<m)-1)=power(33,(1<<(m-1))-1)
3)因为 a xor b xor b=a,所以反向搜的时候直接异或就可以,这应该是此题的特殊之处吧,
代码:(考场上暴力DP)
- #include<cstdio>
- #include<cstdlib>
- #include<cmath>
- #include<cstring>
- #include<algorithm>
- #include<iostream>
- #include<vector>
- #include<map>
- #include<set>
- #include<queue>
- #include<string>
- #define inf 1000000000
- #define maxn 1050000
- #define maxm 500+100
- #define eps 1e-10
- #define ll long long
- #define pa pair<int,ll>
- #define for0(i,n) for(int i=0;i<=(n);i++)
- #define for1(i,n) for(int i=1;i<=(n);i++)
- #define for2(i,x,y) for(int i=(x);i<=(y);i++)
- #define for3(i,x,y) for(int i=(x);i>=(y);i--)
- #define mod 1000000007
- using namespace std;
- inline int read()
- {
- int x=,f=;char ch=getchar();
- while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
- while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
- return x*f;
- }
- ll n,k,m,sum,cnt,mx,f[][maxn];
- int main()
- {
- freopen("input.txt","r",stdin);
- freopen("output.txt","w",stdout);
- n=read();k=read();m=read();
- f[][]=;sum=;mx=<<m;
- for1(i,n)
- {
- cnt=;
- for0(j,mx-)
- if(f[i-][j])
- {
- cnt++;
- for1(k,)
- f[i][((j*)^k)%mx]+=f[i-][j];
- if(cnt==sum)break;
- }
- sum*=;
- }
- cout<<f[n][k]<<endl;
- return ;
- }
代码:(正解)
- #include<cstdio>
- #include<cstdlib>
- #include<cmath>
- #include<cstring>
- #include<algorithm>
- #include<iostream>
- #include<vector>
- #include<map>
- #include<set>
- #include<queue>
- #include<string>
- #define inf 1000000000
- #define maxn 500+100
- #define maxm 500+100
- #define eps 1e-10
- #define ll long long
- #define pa pair<int,int>
- #define for0(i,n) for(int i=0;i<=(n);i++)
- #define for1(i,n) for(int i=1;i<=(n);i++)
- #define for2(i,x,y) for(int i=(x);i<=(y);i++)
- #define for3(i,x,y) for(int i=(x);i>=(y);i--)
- #define mod 1000000007
- using namespace std;
- inline ll read()
- {
- ll x=,f=;char ch=getchar();
- while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
- while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
- return x*f;
- }
- ll n,k,m,inv,res,mx1,mx2,sum[<<];
- inline void dfs(int dep,ll s)
- {
- if(dep==mx1)sum[s%m]++;
- else for1(i,)dfs(dep+,((s<<)+s^i)%m);
- }
- inline void dfs2(int dep,ll s)
- {
- if(dep==mx2)res+=sum[s%m];
- else for1(i,)dfs2(dep+,((s^i)*inv)%m);
- }
- inline ll power(ll x,ll y)
- {
- ll t=;
- for(;y;y>>=,x=(x*x)%m)
- if(y&)t=(t*x)%m;
- return t;
- }
- int main()
- {
- freopen("input.txt","r",stdin);
- freopen("output.txt","w",stdout);
- n=read();k=read();m=<<read();inv=power(,(m>>)-);
- mx1=(n+)>>;mx2=n>>;dfs(,);dfs2(,k);
- cout<<res<<endl;
- return ;
- }
以后一定要多动脑想一想,不要误以为t2这种sb题不可做!!!
vijos国庆节模拟赛之繁星春水的更多相关文章
- 「Vijos 1284」「OIBH杯NOIP2006第二次模拟赛」佳佳的魔法阵
佳佳的魔法阵 背景 也许是为了捕捉猎物(捕捉MM?),也许是因为其它原因,总之,佳佳准备设计一个魔法阵.而设计魔法阵涉及到的最关键问题,似乎就是那些带有魔力的宝石的摆放-- 描述 魔法阵是一个\(n ...
- Nescafe #29 NOIP模拟赛
Nescafe #29 NOIP模拟赛 不知道这种题发出来算不算侵权...毕竟有的题在$bz$上是权限题,但是在$vijos$似乎又有原题...如果这算是侵权的话请联系我,我会尽快删除,谢谢~ 今天开 ...
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- NOI模拟赛 Day1
[考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...
- NOIP第7场模拟赛题解
NOIP模拟赛第7场题解: 题解见:http://www.cqoi.net:2012/JudgeOnline/problemset.php?page=13 题号为2221-2224. 1.car 边界 ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 小奇模拟赛9.13 by hzwer
2015年9月13日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿(explo) [题目背景] 小奇要开采一些矿物,它驾驶着一台带有钻头(初始能力值w)的飞船,按既定路线依次飞 ...
- PKUSC 模拟赛 day1 下午总结
下午到了机房之后又困又饿,还要被强行摁着看英文题,简直差评 第一题是NOIP模拟赛的原题,随便模拟就好啦 本人模拟功力太渣不小心打错了个变量,居然调了40多分钟QAQ #include<cstd ...
随机推荐
- ASP.NET MVC框架开发系列课程 (webcast视频下载)
课程讲师: 赵劼 MSDN特邀讲师 赵劼(网名“老赵”.英文名“Jeffrey Zhao”,技术博客为http://jeffreyzhao.cnblogs.com),微软最有价值专家(ASP.NET ...
- 沧海一声笑,移动应用的CRASH原因我找到! --记最新款数字化測试“星云測试“的使用攻略
沧海一声笑,移动应用的CRASH原因我找到! --记最新款数字化測试"星云測试"的使用攻略 世界进步那么快,非常多新奇的点子层出不穷,于是我们创业.我们做最酷的手机应用,做最轰炸的 ...
- android 回调机制实例!
详细实现为在类中定义接口.在接口的实现方法中传入參数(也能够不传). 在调用类中传入新建的接口.并实现未实现的方法. public class CallBackClass { //传入对应的接口作为參 ...
- 单向链表JAVA代码
//单向链表类 publicclassLinkList{ //结点类 publicclassNode{ publicObject data; ...
- Ubuntu 14.04 配置vsftpd实现FTP服务器 - 通过FTP连接AWS
测试主机:亚马逊AWS EC2 系统:Ubuntu 14.04 想用AWS来做服务器玩,结果发现其不能像简单使用阿里云服务器那样用ftp连接,反正也不熟悉ftp服务器搭建,那就乘这个机会学习一下如何利 ...
- C#中的序列化与反序列化
眼看XX鸟的课程关于C#的知识点就要学完了,翻看网络中流传的教程还是发现了一个课程中没有讲到的知识点:序列化与反序列化 无奈还是了解一下并操作一番,以备后用吧 介绍:就是将对象信息转化为二进制信息以便 ...
- CSS3 之动画及兼容性调优
由于CSS3动画对低版本的浏览器的支持效果并不是很好,特别是IE9及以下版本,更是无法支持. 所以有时候一些简单的动画效果,还只是用js代码来实现,但是效率偏低,而且效果有些偏生硬,不够顺滑. 毕竟用 ...
- Spring 3.0就这么简单读书笔记
一般情况下,spring容器中的大部分Bean都是单实例的,所以一般无须通过@Repository.@Service.@Component等注解的value属性为Bean指定名称,也无须使用@Qual ...
- C#中yield用法
yield 关键字向编译器指示它所在的方法是迭代器块.编译器生成一个类来实现迭代器块中表示的行为.在迭代器块中,yield 关键字与 return 关键字结合使用,向枚举器对象提供值.这是一个返回值, ...
- 关于在head里的link href=<%=%>,其中前置百分号给编码了的解决方案
做了一个项目,主要是能够自动换模板,实际就是插入数据库那个css名称,然后前台取出那个值,放入getcss变量里(getcss自己定义的一个变量),然后通过link href=<%=%>取 ...