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 ...
 
随机推荐
- 建立企业内部mavenserver并使用Android Studio公布公共项目
			
由于Android Studio使用了Gradle构建工具,在library依赖的处理上是将被依赖的library作为一个module引入(拥有一份完整的library拷贝),而Eclipse的ADT ...
 - ulimit -n修改单进程可打开最大文件数目
			
对所有用户都生效: vi /etc/profile 添加一行如下: ulimit -n 65535 执行source /etc/profile生效,不需要重启服务器. $ source /etc/pr ...
 - Vitamio 多媒体框架 介绍
			
功能 Vitamio 是一款 Android 与 iOS 平台上的全能多媒体开发框架,全面支持硬件解码与 GPU 渲染.Vitamio 凭借其简洁易用的 API 接口赢得了全球众多开发者的青睐.到目前 ...
 - codevs 3693 数三角形
			
/* n*m个点中选3个 再排除三点共线 共线分两类 1 在横线或者竖线上 m*C(n,3) n*C(m,3) 2 在对角线上 这个比较麻烦 以为对角线和矩阵是一一对应的 我们转化成求矩阵 并且保证有 ...
 - .net错误处理机制(转)
			
asp.net 提供了4中错误机制:Page_Error事件>ErrorPage属性>Application_Error事件> <customErrors>配置项 ① P ...
 - [Linux]三种方案在Windows系统下安装ubuntu双系统(转)
			
在学习linux的过程中,ubuntu无疑是初学者的最佳选择. 下面来列举给Windows系统安装ubuntu双系统的三种方法. 一.虚拟机安装(不推荐) 使用工具:Vmware 如果不是因为迫不得已 ...
 - CSS和CSS3中的伪元素和伪类(总结)
			
好多人伪类和伪元素分清楚,其实就是一句话,“伪类的效果可以通过添加一个实际的类来达到,而伪元素的效果则需要通过添加一个实际的元素才能达到”. CSS中伪类包括: :first-child :lang ...
 - css ie hack整理
			
网上有很多关于ie hack的文章,可能由于文章发布后ie的版本还在升级.所以导致有些hack写法已经不适用了.以下是本人整理的ie6-11的一些hack常用写法.(以下默认文档模式为标准模式) 1. ...
 - PHP语言中使用JSON
			
原文地址:http://www.ruanyifeng.com/blog/2011/01/json_in_php.html 在PHP语言中使用JSON 目前,JSON已经成为最流行的数据交换格式之一,各 ...
 - PartialViewResult用法
			
后台代码 ) { IList<TestModel> lstTestModel = this.GetModelList(categoryid); return PartialView(lst ...