提高组刷题营 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!种拿到书信的情 ...
随机推荐
- go语言字符串函数小结
拼接字符串 func Join(a []string, sep string) string, 拼接字符串,将一个[]string的切片通过分隔符,拼接成一个字符串,类似于PHP的implode() ...
- 翻译应用将在Win8.1系统中取消下载安装
自Windows8.Windows Phone 7.1和Windows Phone 8受到影响之后,微软又正式宣布停止对翻译应用提供支持服务.Microsoft Translator这款应用将从Win ...
- Error:Execution failed for task ':app:compileDebugJavaWithJavac'
百度一下呗 查找了各种解决方案,都不对症. 最后发现,造成这种异常的原因有很多.具体的还是要去终端编译,查看到底是什么地方出错了,然后具体问题具体分析. 终端进入项目的根目录,然后输入命令 ./gra ...
- 记一次CDN大量探测处理方法,UA限制返回403
起因: 发现源站流量阶段性异常,基本上每2小时高发到50M左右,并持续30分钟左右 排除过程: 在流量正常的时候,排查了各种可能性,均未果,观察监控,在流量再次增大时,发现该服务器上某一域名的访问日志 ...
- Istio调用链埋点原理剖析—是否真的“零修改”分享实录(下)
调用链原理和场景 正如Service Mesh的诞生是为了解决大规模分布式服务访问的治理问题,调用链的出现也是为了对应于大规模的复杂的分布式系统运行中碰到的故障定位定界问题.大量的服务调用.跨进程.跨 ...
- 牛客练习赛51 C 勾股定理 (数学,结论)
链接:https://ac.nowcoder.com/acm/contest/1083/C来源:牛客网 题目描述 给出直角三角形其中一条边的长度n,你的任务是构造剩下的两条边,使这三条边能构成一个直角 ...
- 关于IO的同步,异步,阻塞,非阻塞
上次写了一篇文章:Unix IO 模型学习.恰巧在这次周会的时候,@fp1203 (goldendoc成员之一) 正好在讲解poll和epoll的底层实现.中途正好讨论了网络IO的同步.异步.阻塞.非 ...
- SARS病毒 (生成函数 + 快速幂)
链接:https://ac.nowcoder.com/acm/contest/992/A来源:牛客网 题目描述 目前,SARS 病毒的研究在世界范围内进行,经科学家研究发现,该病毒及其变种的 DNA ...
- 一个restframework快速实例
首先在settings.py中引入 INSTALLED_APPS = [ ...... 'rest_framework', ......] 相关模型结构如下: class custume(models ...
- 埋点(Event Tracking)vs 无埋点(Codeless Tracking) vs 可视化埋点(Visual Event Tracking)
在理解什么是埋点之前,首先需要了解一些基础知识:(以下摘自:http://www.chinawebanalytics.cn/auto-event-tracking-good-bad-ugly/) 我们 ...