2017-10-28 noip模拟赛by WISCO 信息组
第一次做模拟赛,自我感觉良好(大概是这套题比较简单)
T1 名称为“数据结构”,这也太坑了点……233
要维护一个数列(初始为零),支持区间加与查询。
查询的是一个区间中有多少数满足min<=(a[i]*i%mod)<=max,其中min、max、mod是一开始给出来的,a[i]表示这个数的值,i表示这个数的编号
n<=80000,一开始修改与查询个数<=1e6,后面会跟不超过1e7个查询
我看到这道题,想到了线段树,主要觉得这样好查询一个区间内有多少满足条件的
可是,由于条件比较诡异,所以菜鸡的我只能单点修改……最后查询呢,每一次logn
这样得了50分
正解:差分!
首先看到题目后面会接一堆查询吗,那可以用前缀和维护啊!(用线段树每次都logn,前缀和只需提前处理一下然后O(1)就好了,我是何苦啊……)
前面的,就是差分了。每次区间加时a[l]+=x,a[r+1]-=x就可以了,查询时每个点这时的值就是a[1]+...+a[i]
这有些类似树状数组中的区间加诶,但前面的查询是一个点一个点查,所以不用树状数组,直接数组就行了
代码:
(特别注意:有的地方要转long long啊,幸亏样例良心,否则我要go die 了)
#include<cstdio>
#include<iostream>
using namespace std; typedef long long ll;
const int MAXN = ;
ll a[MAXN];
int b[MAXN];
int n,opt,mod,Min,Max,Q; int main()
{
int i,y,l,r,ans;
ll sum,x;
char ch;
scanf("%d%d",&n,&opt);
scanf("%d%d%d",&mod,&Min,&Max); while(opt--){
cin>>ch;
if(ch=='A'){
scanf("%d%d%lld",&l,&r,&x);
a[l]+=x;a[r+]-=x;
}
else{
scanf("%d%d",&l,&r);
sum=;ans=;
for(i=;i<=r;i++){
sum+=a[i];
if(i>=l)
{
y=(sum*i)%mod;
if(y>=Min && y<=Max) ans++;
}
}
printf("%d\n",ans);
}
} sum=;
for(i=;i<=n;i++){
sum+=a[i];
y=sum*i%mod;
if(y>=Min && y<=Max) b[i]=b[i-]+;
else b[i]=b[i-];
}
scanf("%d",&Q);
while(Q--){
scanf("%d%d",&l,&r);
printf("%d\n",b[r]-b[l-]);
} return ;
}
T2 “答案错误”
非常有趣的一道数学题~
凭借多年积累的找规律技巧,构造出了答案 (YEAH)
具体题目及证明 略……
但是提交上去竟只有90分!!有一个点被卡常了(悲伤)
回来看看,发现是找规律没太彻底,多了两个if语句,下次要注意了……
代码:
#include<cstdio>
#include<iostream>
using namespace std; typedef long long ll;
int n,Q;
ll k; int main()
{
int ans,r;
ll x;
scanf("%d%d",&n,&Q); while(Q--){
scanf("%lld",&k);
x=k-;
ans=;
while(x){
if(x%==) ans++;
x>>=;
}
if(ans%==) printf("X\n");
else printf("Z\n");
} return ;
}
T3 “部落冲突”
n个部落,n-1条双向边形成一棵树,相邻部落有时会打仗,有时会停战
打仗时两个部落间的道路不能通行
在某个时间,查询某两个部落是否可以互相到达
看完题,想到这就是一道树链剖分吗,兴高采烈地写了一遍。结果90分,被卡常了一个点(悲伤)
正解:树上差分!
每一次两个点间的路径拆成两个点分别到lca的路径
维护一下每个点到根节点的链中有几条路打仗
判断是就看S(u)+S(v)-2*S(lca(u,v))是否为零就好啦
怎么维护呢?
按dfs序来,对于每一条打仗的边,从进这个点的时间戳开始+1,出这个点的时间戳开始-1,维护前缀和
边边点点的要想清楚!!!
前缀和用树状数组维护,每次查询logn
代码:
#include<cstdio>
#include<iostream>
using namespace std; const int MAXN = ;
struct node{
int v;
node *next;
}pool[*MAXN],*h[MAXN];
int cnt;
void addedge(int u,int v){
node *p=&pool[++cnt],*q=&pool[++cnt];
p->v=v;p->next=h[u];h[u]=p;
q->v=u;q->next=h[v];h[v]=q;
} int vis[MAXN],fa[MAXN],dep[MAXN],size[MAXN],son[MAXN];
int top[MAXN],rk[MAXN],w[MAXN],tot;
void dfs1(int u){
int v,sonnum=,Mson=;
size[u]=;
vis[u]=;
for(node *p=h[u];p;p=p->next){
v=p->v;
if(!vis[v]){
fa[v]=u;
dep[v]=dep[u]+;
dfs1(v);
size[u]+=size[v];
if(size[v]>sonnum) sonnum=size[v],Mson=v;
}
}
son[u]=Mson;
}
void dfs2(int u){
int v;
v=son[u];
if(v){
top[v]=top[u];
rk[v]=++tot;
dfs2(v);
}
for(node *p=h[u];p;p=p->next){
v=p->v;
if(fa[v]==u && v!=son[u]){
top[v]=v;
rk[v]=++tot;
dfs2(v);
}
}
w[u]=++tot;
}
int lca(int x,int y){
int f1=top[x],f2=top[y];
while(f1!=f2){
if(dep[f1]<dep[f2]) swap(f1,f2),swap(x,y);
x=fa[f1];f1=top[x];
}
if(dep[x]>dep[y]) swap(x,y);
return x;
} struct Bit{
int c[MAXN*];
int lowbit(int x){
return x&(-x);
}
int sum(int x){
int ret=;
while(x>){
ret+=c[x];
x-=lowbit(x);
}
return ret;
}
void add(int x,int y){
while(x<=MAXN*){
c[x]+=y;
x+=lowbit(x);
}
}
}d; int hisnum,his[MAXN]; int main()
{
int n,m,x,y,i,l,f;
char ch;
scanf("%d%d",&n,&m);
for(i=;i<n;i++) scanf("%d%d",&x,&y),addedge(x,y); dep[]=;dfs1();
top[]=;rk[]=;tot=;dfs2(); for(i=;i<=m;i++){
cin>>ch;
if(ch=='C'){
scanf("%d%d",&x,&y);
if(y==fa[x]) swap(x,y);
his[++hisnum]=y;
d.add(rk[y],);
d.add(w[y],-);
}
else if(ch=='U'){
scanf("%d",&x);
y=his[x];
d.add(rk[y],-);
d.add(w[y],);
}
else{
scanf("%d%d",&x,&y);
l=lca(x,y);
f=d.sum(rk[x])+d.sum(rk[y])-*d.sum(rk[l]);
if(f==) printf("Yes\n");
else printf("No\n");
}
} // system("pause");
return ;
}
总结:
1.不要把思路老局限在一个东西上,比如第一题
2.灵活变通,不要学死
比如,树上差分也可以完成许多树链剖分可完成的东西啊!
3.前缀和是一个好东西,要学会用它
4.差分也是个好东西,要学会用它
5.写完代码后,记得修改一下耗时多的地方,再将代码完美一下。不要像第二题一样……(好心痛)
6.学会分析复杂度
第一题后面那些查询用前缀和我竟没想到……66
7.注意开long long
2017-10-28 noip模拟赛by WISCO 信息组的更多相关文章
- 2017 10.25 NOIP模拟赛
期望得分:100+40+100=240 实际得分:50+40+20=110 T1 start取了min没有用,w(゚Д゚)w O(≧口≦)O T3 代码3个bug :数组开小了,一个细节没注意, ...
- 2017.10.28 QB模拟赛 —— 下午
题目链接 T1 按x值排序 遇到第二种牌插入 遇到第一种牌 查询<=y 的最小值 删除他 splay multiset cys大佬说 multiset就是不去重的set, #include &l ...
- 2017.10.28 QB模拟赛 —— 上午
题目链接 T1 1e18 内的立方数有 1e6个 直接枚举可过 二分最优 考场用set 死慢.. #include <cstdio> int t; long long p; int ma ...
- 10.17 NOIP模拟赛
目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...
- 10.16 NOIP模拟赛
目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...
- 2018.10.16 NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 100 + 20 = 220\) 实际得分:\(100 + 100 + 30 = 230\) 辣鸡模拟赛.. T1T2都是一眼题,T3考验卡常数还只有一档暴力分. ...
- 2016.10.30 NOIP模拟赛 day2 PM 整理
满分:300分 直接全部爆零,真的是很坑啊! 10.30的题目+数据:链接:http://pan.baidu.com/s/1jHXLace 密码:i784 T1: 题目中的难点就是每次折叠的点可能应经 ...
- 2016.10.30 NOIP模拟赛 day2 AM 整理
题目+数据:链接:http://pan.baidu.com/s/1gfBg4h1 密码:ho7o 总共得了:130分, 1:100分 2:30分(只会这30分的暴力) 3:0(毫无思路) 虽然不高, ...
- 2017.5.27 NOIP模拟赛(hzwer2014-5-16 NOIP模拟赛)
期望得分:100+100+60+30=290 实际得分:100+20+60+0=180 当务之急:提高一次正确率 Problem 1 双色球(ball.cpp/c/pas) [题目描述] 机房来了新一 ...
随机推荐
- dotnet 判断程序当前使用管理员运行降低权使用普通权限运行
有一些程序是不想通过管理员权限运行的,因为在很多文件的读写,如果用了管理员权限程序写入的程序,其他普通权限的程序是无法直接访问的.本文告诉大家如何判断当前的程序是通过管理员权限运行,然后通过资源管理器 ...
- 【12.78%】【codeforces 677D】Vanya and Treasure
time limit per test1.5 seconds memory limit per test256 megabytes inputstandard input outputstandard ...
- git 上传当前分支
因为我现在的分支是的名很长,每次需要上次当前分支需要写很多代码,是不是有很简单方法上传当前分支. 如果要上传一个分支到仓库 origin 那么就需要使用下面的命令 git push origin 分支 ...
- 由Request Method:OPTIONS初窥CORS
刚接触前端的时候,以为HTTP的Request Method只有GET与POST两种,后来才了解到,原来还有HEAD.PUT.DELETE.OPTIONS…… 目前的工作中,HEAD.PUT.DELE ...
- 根据经纬度查询附近几公里的门店(<5)代表5公里
select * from 表名 where status=1 and isopen =0 and jingyingtype=1 and waimai=1 and bstatus = 1 and (a ...
- UE4 中的 C++ 与 蓝图交互
1.Unreal 引擎提供了两种创建新 Gameplay 元素的方法:C++ 和 蓝图视觉脚本. 通过 C++,程序员构建基础游戏系统:设计师可以基于此系统为场景 / 游戏创建自定义的游戏玩法. 这种 ...
- Liquibase 使用(全)
聊一个数据库脚本的版本工具 Liquibase,官网在这里 ,初次看到,挺神奇的,数据库脚本也可以有版本管理,同类型的工具还有 flyway . 开发过程经常会有表结构和变更,让运维来维护的话,通常会 ...
- lintcode入门37-算法实现
lintcode入门级算法题37 一.题目 反转一个3位整数 反转一个只有3位数的整数. 样例 样例 1: 输入: number = 123 输出: 321 样例 2 ...
- Python用PIL将PNG图像合成gif时如果背景为透明时图像出现重影的解决办法
最近在用PIL合成PNG图像为GIF时,因为需要透明背景,所以就用putpixel的方法替换背景为透明,但是在合成GIF时,图像出现了重影,在网上查找了GIF的相关资料:GIF相关资料 其中有对GIF ...
- 从两个角度理解为什么 JS 中没有函数重载
函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表(参数个数.类型.顺序)的函数,这组函数被称为重载函数.重载函数通常用来声明一组功能相似的函数,这样做减少了函数名的数量,避免了名字空 ...