提高组刷题营 DAY 2
1.滞空(jump/1s/64M) 





#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL mod = ;
inline void rd(LL &x)
{
x=;int f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
}
LL n,m,x[],y[],g,ans;
LL qpow(LL a)
{
LL res=,k=mod-;
while(k)
{
if(k&)res=res*a%mod;
a=a*a%mod;
k>>=;
}
return res;
}
LL _2 = qpow();
void down(LL x,LL h){x%=mod;h%=mod; ans += (x*x*m%mod)*qpow(*h); ans%=mod;}
void up(LL x,LL h) {x%=mod;h%=mod; ans += (m*h%mod) + ( (x*x*m%mod) *qpow(*h) )%mod; ans%=mod;}
void pi_4(LL x){x%=mod; ans += (m*x%mod)*_2; ans%=mod;}
void solve()
{
scanf("%lld%lld%lld",&n,&m,&g);
rd(x[]); rd(y[]);
for(int i=;i<=n;i++)
{
rd(x[i&]); rd(y[i&]);
if(y[i&]>y[!(i&)]) up(x[i&]-x[!(i&)],y[i&]-y[!(i&)]);
if(y[i&]<y[!(i&)]) down(x[i&]-x[!(i&)],y[!(i&)]-y[i&]);
if(y[i&]==y[!(i&)]) pi_4(x[i&]-x[!(i&)]);
}
printf("%lldJ",ans*g%mod);
}
int main()
{
freopen("jump.in","r",stdin);
freopen("jump.out","w",stdout);
solve();
fclose(stdin);
fclose(stdout);
return ;
}
2.放爆竹(bomb/1s/64M)




题解





but......暴力出奇迹,拿70pt
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<string>
#include<cstring>
#include<queue> using namespace std; inline int read()
{
int ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} const int maxn=;
int n,ans=,ans1,l1,l2;
string ss;
bool flag=;
struct node{
string s;
int len;
}chuan[maxn]; bool cmp(node x,node y)
{
if(x.len ==y.len ) return x.s >y.s ;
else return x.len >y.len ;
} int gcd(int x,int y)
{
return y==?x:gcd(y,x%y);
} int lcm(int x,int y){
return x*y/(gcd(x,y));
} int work(int x,int y)
{
int res=,answ=;
string s1=chuan[x].s,s2=chuan[y].s ;
int len1=chuan[x].len ,len2=chuan[y].len ;
int len=lcm(len1,len2);
for(int i=;i<len;i++){
if(s1[i%len1]!=s2[i%len2] ){
res=max(res,answ);
answ=;
break;
}
else{
answ++;
res=max(res,answ);
}
} return res;
} int main()
{
freopen("bomb.in","r",stdin);
freopen("bomb.out","w",stdout);
n=read();
for(int i=;i<=n;i++)
{
cin>>ss;
chuan[i].s =ss;
chuan[i].len =ss.size() ;
}
sort(chuan+,chuan+n+,cmp);
for(int i=;i<=n;i++){
if(flag) break;
for(int j=i+;j<=n;j++)
{
l1=chuan[i].len ,l2=chuan[j].len;
if(lcm(l1,l2)<ans){ flag=; break; }
ans1=work(i,j);
if(ans1>ans) ans=ans1;
}
}
printf("%d\n",ans);
return ;
}
正解代码:
#include <bits/stdc++.h> using std::max;
using std::strlen; const int N=,Mlen=,Node=N*Mlen*; int n,len[N],ans;
char s[N][Mlen]; struct Trie{
int son[Node][],node,app[Node],dep[Node],f[Node]; void init() {
son[][]=son[][]=;
app[]=dep[]=;
} int newnode(int d){
++node;
son[node][]=son[node][]=;
dep[node]=d;
app[node]=;
return node;
} void insert(char *s,int len,int t) {
int p=,add=;
while (t) {
for (int i=;i<len && add<=;++i) {
int &x=son[p][s[i]-''],pp=p;
p=x?x:x=newnode(dep[p]+); f[p]=pp;
app[p]++; add++;
}
t--;
}
} int FindAns() {
int ans=;
for (int i=;i<=node;++i) if (app[i]>=) {
ans=max(ans,dep[i]);
}
// for (int i=1;i<=node;++i) if (app[i]>=2 && ans==dep[i]) {
// int p=i;
// while (p) {
// putchar((p==son[f[p]][1])+'0');
// p=f[p];
// }
// putchar('\n');
// break;
// }
return ans;
} }tr; void Init() {
scanf("%d",&n);
for (int i=;i<=n;++i) {
scanf("%s",s[i]); len[i]=strlen(s[i]);
}
} void Solve() {
tr.init();
for (int i=;i<=n;++i) {
tr.insert(s[i],len[i],(-)/len[i]+);
}
printf("%d\n",tr.FindAns());
} int main() {
freopen("bomb.in","r",stdin);
freopen("bomb.out","w",stdout);
Init();
Solve();
fclose(stdin);
fclose(stdout);
return ;
}
3.pyy整队(queue,1s,128M)




代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define mid ((l+r)>>1)
const int N=2e5+,inf=0x3f3f3f3f;
int n,m,rt;
int L[N<<], R[N<<], v[N<<];
int a[N], b[N], pos[N], nxt[N], pre[N], cs, cnt;
void build(int &i,int l,int r)
{
i = ++cs;
if(l<r) build(L[i],l,mid), build(R[i],mid+,r), v[i] = min( v[L[i]] , v[R[i]] );
else v[i] = pos[l];
}
void alter(int i,int l,int r,int p)
{
if(l<r)
{
if(p<=mid) alter(L[i],l,mid,p);
else alter(R[i],mid+,r,p);
v[i] = min(v[L[i]],v[R[i]]);
}
else v[i] = ++cnt;
}
inline int query(int i,int l,int r,int k)
{
while(l<r)
{
if(v[L[i]]<=k) i = L[i], r = mid;
else i = R[i], l = mid + ;
}
return l;
}
void solve()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&a[i]), b[i] = a[i];
sort(b+,b++n);
for(int i=;i<=n;i++)//离散化a初始排列
{
a[i] = lower_bound(b+,b++n,a[i]) - b;
nxt[a[i-]] = a[i]; pre[a[i]] = a[i-];
pos[a[i]] = i;
}
build(rt,,n); cnt = n; int last = a[n];//last队尾
while(m--)
{
static char s[]; static int x,t;
scanf("%s%d",s,&x);
t = lower_bound(b+,b++n,x) - b;
if(s[]=='A')
{
if(!pre[t]) printf("-1\n");
else printf("%d\n",b[ query(rt,,n,pos[pre[t]]) ]);//查询小于等于pos[pre_t]的最小值的人
}
else
{
if(last==t)continue;
alter(rt,,n,t);//单点修改第t人pos
pos[t] = cnt;
nxt[pre[t]] = nxt[t]; pre[nxt[t]] = pre[t];//当前的前后驱修改
pre[t] = last; nxt[last] = t;
last = t;
}
}
sort(pos+,pos++n);
int tail = , ans = inf;
for(int i=;i<=n && tail<n;i++)
{
while(pos[tail] - pos[i] + <n && tail<=n) tail++;
if(tail>n || pos[tail] - pos[i] + >n) tail--;
ans = min(ans,i- + n-tail);//左右区间剩下的
}
printf("%d\n",ans);
}
int main()
{
freopen("queue.in","r",stdin);
freopen("queue.out","w",stdout);
solve();
fclose(stdin);
fclose(stdout);
return ;
}
提高组刷题营 DAY 2的更多相关文章
- 提高组刷题营 DAY 1 下午
DFS 深度优先搜索 通过搜索得到一棵树形图 策略:只要能发现没走过的点,就走到它.有多个点可走就随便挑一个,如果无路可走就回退,再看有没有没走过的点可走. 在图上寻找路径[少数可用最短路解决]:最短 ...
- 提高组刷题班 DAY 1 上午
低仿机器人(robo,1s,64M) 题解 大模拟 代码 #include <cstdio> #include <cstring> #include <iostream& ...
- 牛客CSP-S提高组赛前集训营1
牛客CSP-S提高组赛前集训营1 比赛链接 官方题解 before:T1观察+结论题,T2树形Dp,可以换根或up&down,T3正解妙,转化为图上问题.题目质量不错,但数据太水了~. A-仓 ...
- 牛客网CSP-S提高组赛前集训营Round4
牛客网CSP-S提高组赛前集训营 标签(空格分隔): 题解 算法 模拟赛 题目 描述 做法 \(BSOJ6377\) 求由\(n\)长度的数组复制\(k\)次的数组里每个连续子序列出现数字种类的和 对 ...
- NOIP2010提高组真题部分整理(没有关押罪犯)
目录 \(NOIP2010\)提高组真题部分整理 \(T1\)机器翻译: 题目背景: 题目描述: 输入输出格式: 输入输出样例: 说明: 题解: 代码: \(T2\)乌龟棋 题目背景: 题目描述: 输 ...
- NOIP2014提高组第二题联合权值
还是先看题吧: 试题描述 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi ,每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 ...
- 牛客CSP-S提高组赛前集训营3
A 货物收集 显然是一个二分答案的题. #include<iostream> #include<cstdio> #include<cstring> #include ...
- 【枚举】Vijos P1496 火柴棒等式 (NOIP2008提高组第二题)
题目链接: https://vijos.org/p/1496 题目大意: 给你n(n<24)根火柴棍,你可以拼出多少个形如“A+B=C”的等式?("+"和"=&qu ...
- 11.5NOIP2018提高组模拟题
书信(letter) Description 有 n 个小朋友, 编号为 1 到 n, 他们每人写了一封信, 放到了一个信箱里, 接下来每个人从中抽取一封书信. 显然, 这样一共有 n!种拿到书信的情 ...
随机推荐
- 四款免费好用的Bootstrap ui编辑器
Bootstrap带来了设计革命,本文介绍的四种免费Bootstrap在线设计工具,可视化所见所得设计网页,然后输出Html/CSS代码,其中有些甚至可以实现拖曳,也有可以设定自己的主题模板Theme ...
- 7.SpringMVC 配置式开发-ModelAndView和视图解析器
ModelAndView 1.Model(模型) 1.model的本质就是HashMap,向模型中添加数据,就是往HashMap中去添加数据 2.HashMap 是一个单向查找数组,单向链表数组 3. ...
- CHD-5.3.6集群上sqoop安装
Sqoop(发音:skup)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql.postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ...
- 第四章、前端之BOM和DOM
目录 第四章.前端之BOM和DOM 一.解释BOM和DOM 二.window对象 三.window子对象 四.弹出框 五.计时相关 六.HTML的DOM树 七.查找元素 八.节点操作 九.JS操作CS ...
- Linux磁盘及文件系统管理4
文件系统的使用: 首先要“挂载”:mount命令和umount命令 根据文件系统之外的其它文件系统要想能够被访问,都必须通过“关联”到根文件系统上的某个目录来实现,此关联操作即为“挂载”:此目录即为“ ...
- [Abp vNext微服务实践] - 添加中文语言
简介 abp vNext中提供了多语言功能,默认语言是英文,没有提供中文语言包.在业务开发中,定义权限后需要用中文的备注提供角色选择,本篇将介绍如何在abp vNext中加入中文语言. step1:添 ...
- Collection 和 Collections 有什么区别?(未完成)
Collection 和 Collections 有什么区别?(未完成)
- InheritableThreadLocal——父线程传递本地变量到子线程的解决方式及分析
转自https://blog.csdn.net/hewenbo111/article/details/80487252 上一个博客提到ThreadLocal变量的基本使用方式,可以看出ThreadLo ...
- flutter flutter_cupertino_date_picker 时间插件的用法
https://blog.csdn.net/sinat_37255207/article/details/100041023 https://github.com/wuzhendev/flutter- ...
- Bootstrap-轮播图-No.1
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...