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 ...
随机推荐
- JNI调用native方法出现 java.lang.UnsatisfiedLinkError: XXXclass.XXXmethod()异常的解决办法
昨天拿到JNI的Android工程Demo,然后把demo整合到开发的主线工程上,发现调用JNI方法一直抛同一个异常 java.lang.UnsatisfiedLinkError: XXXclass. ...
- 【经典面试题】实现平方根函数sqrt
本文将从一道经典的面试题说起:实现平方根函数,不得调用其它库函数. 函数原型声明例如以下: double Sqrt(double A); 二分法 二分法的概念 求,等价于求方程的非负根(解).求解方程 ...
- atitit。浏览器缓存机制 and 微信浏览器防止缓存的设计 attilax 总结
atitit.浏览器缓存机制 and 微信浏览器防止缓存的设计 attilax 总结 1. 缓存的一些机制 1 1.1. http 304 1 1.2. 浏览器刷新的处理机制 1 1.3. Expir ...
- Windows与自定义USB HID设备通信说明.
1 . 所使用的典型 Windows API CreateFile ReadFile WriteFile 以下函数是 DDK 的内容: HidD_SetFeature HidD_GetFeatur ...
- 使用多线程完成Socket
public class Service { //服务器 public static void main(String[] args) { ServerSocket serverSocket=null ...
- html图像入门
在HTML中,图像由<img>标签定义. <img>是空标签,意思是说,它只包含属性,并且没有闭合标签. 要在页面上显示图像,需要使用源属性src, src指的是"s ...
- activiti总结
1.activiti如何修改登录用户名?在哪个数据库里面添加. 2.activiti的启动和部署在http://activiti.org/userguide/index.html#demo.setup ...
- Android开发手记(14) 使用MediaPlayer播放mp3
1.获取MediaPlayer实例 (1)可以直接通过new或者create方式: 调用setDataSource和create的区别是,create时已经执行了MediaPlayer.prepare ...
- JUnit报initializationError的解决方法
在新搭建的环境上测试时,一个模块发现错误: java.lang.NoClassDefFoundError:org/hamcrest/SelfDescribing 一看就是缺少Class.多方查找,发现 ...
- OC之字符串 NSString与NSMutableString
一.NSString 不可变字符串的操作1)将字符串常量对象直接赋值给字符串引用 NSString *str1=@"hello"; 字符串对象的输出格式:NSLog(@" ...