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 ...
随机推荐
- Maven assembly插件输出文件乱码问题
使用Maven的<artifactId>maven-assembly-plugin</artifactId>插件导致输出的XML配置文件源文件的中文注释变成乱码,排查了多个地方 ...
- Media层
媒体层包含图形技术.音频技术和视频技术,这些技术相互结合就可为移动设备带来最好的多媒体体验,更重要的是,它们让创建外观音效俱佳的应用程序变得更加容易.您可以使用iOS的高级框架更快速地创建高级的图形和 ...
- iOS UIImage扩展方法(category):放大、旋转、合并UIImage、增加渐变层、添加阴影、调节透明度、保存到相册
一有用的 UIImage 扩展,支持(等比例)放大和旋转可在许多 App 中使用. UIImage-Extensions.h #import <Foundation/Foundation.h&g ...
- Difference between Tomcat's extraResourcePaths and aliases to access an external directory--转
Question: Simple question: In Tomcat7, what's the difference between using extraResourcePaths and al ...
- Mounting File Systems
1.Mounting File Systems Just creating a partition and putting a file system on it is not enough to s ...
- Linux 最大进程数
前言 使用环境:centos 7系统 一.查看用户打开的最大进程数 ulimit -a max user processes (-u) #系统限制某用户下最多可以运行多少进程 ...
- cogs 线型网络(状压dp)
/* 需要好大的空间..... 而且lowbit理解的不是很好 先放到博客里 以后慢慢研究 */ #include<iostream> #include<cstdio> #in ...
- C#_DBHelper_SQL数据库操作类.
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data; ...
- 深入理解BFC和Margin Collapse
深入理解BFC和Margin Collapse BFC的理解与应用 首先我们来看看w3c规范对BFC的解释,其实对于这种概念的学习上,我们总是建议首先寻找官方的定义,因为原则上来说官方的才是最权威 ...
- 解决ajax请求cors跨域问题
”已阻止跨源请求:同源策略禁止读取位于 ***** 的远程资源.(原因:CORS 头缺少 'Access-Control-Allow-Origin').“ ”已阻止跨源请求:同源策略禁止读取位于 ** ...