暑假集训test-8-31(am)
1.字符串匹配
看到题目以为真是字符串题结果是数学题。。70分做法很傻逼然而我更傻逼只有30。。。
正解是发现两个位置会匹配当且仅当mod gcd(lena,lenb)同余,在一个lcm(lena,lenb)的长度内所有模gcd同余的位置会一一匹配。我大概只能感性理解一下和随便证一下模gcd同余则可以匹配。
然后用乘法原理计数。代码超短的。
//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define Formylove return 0
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int N=2e6+;
typedef long long LL;
typedef double db;
using namespace std;
int n,m,cnt[],lena,lenb;
LL ans;
char a[N],b[N]; template<typename T>void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} LL gcd(LL a,LL b) { return !b?a:gcd(b,a%b); } #define ANS
int main() {
#ifdef ANS
freopen("string.in","r",stdin);
freopen("string.out","w",stdout);
#endif
read(n); read(m);
scanf("%s",a); lena=strlen(a);
scanf("%s",b); lenb=strlen(b);
LL d=gcd(lena,lenb);
For(t,,d-) {
memset(cnt,,sizeof(cnt));
For(i,,lena/d-)
cnt[a[i*d+t]-'a']++;
For(i,,lenb/d-)
ans+=cnt[b[i*d+t]-'a'];
}
ans*=n*d/lenb;
printf("%lld\n",ans);
Formylove;
}
2.积木大赛
感觉这题很傻逼啊。少有的不是模板但是可以秒切的题。
枚举最高点的位置,二分最高点,再往左右二分满足最高点条件(从最高点开始依次减1)的最近位置,这个可以用st表或者线段树什么的维护。算算要达到最高点积木够不够即可。
//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define Formylove return 0
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int N=;
typedef long long LL;
typedef double db;
using namespace std;
int n,m;
LL h[N],st1[N][],st2[N][],sum[N],ans; template<typename T>void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} void make_st() {
For(i,,n) st1[i][]=h[i]+i,st2[i][]=h[i]+(n-i+);
For(j,,) For(i,,n) {
if(i+(<<j)-<=n)
st1[i][j]=max(st1[i][j-],st1[i+(<<j-)][j-]);
if(i-(<<j)+>=)
st2[i][j]=max(st2[i][j-],st2[i-(<<j-)][j-]);
}
} int ck(int pos,LL x) {
int l=pos,r=pos;
Rep(i,,) if(r+(<<i)-<=n&&st1[r][i]<x+pos)
r+=(<<i);
Rep(i,,) if(l-(<<i)+>=&&st2[l][i]<x+(n-pos+))
l-=(<<i);
LL nd=;
if(l<||r>n) return ;
if(l+<=pos) {
l++;
nd=nd+(x+x-(pos-l))*(pos-l+)/-(sum[pos]-sum[l-]);
}
if(r->=pos) {
r--;
nd=nd+(x+x-(r-pos))*(r-pos+)/-(sum[r]-sum[pos-]);
}
return nd-(x-h[pos])<=m;
} LL solve(int pos) {
LL l=h[pos],r=h[pos]+m,rs=l;
while(l<=r) {
int mid=((l+r)>>);
if(ck(pos,mid)) rs=mid,l=mid+;
else r=mid-;
}
return rs;
} #define ANS
int main() {
#ifdef ANS
freopen("block.in","r",stdin);
freopen("block.out","w",stdout);
#endif
read(n); read(m);
For(i,,n) read(h[i]),sum[i]=sum[i-]+h[i];
make_st();
For(i,,n)
ans=max(ans,solve(i));
printf("%lld\n",ans);
Formylove;
}
3.考古研究
30分和70分还是比较好做,但是傻逼地搞了好久t1然后这天考得就很爆炸。

一张我的草稿:
就是草稿,所以非常乱。
继续70分是思路,倒着考虑最后地表的每个点经过若干次沉降后到达的位置。
对于这个转过的网格图,从左到右x从1~n,从上到下y从1~n,每个格子上的权值就是它的x坐标减y坐标除以2
操作逆过来,一种是选x较大的一部分区间x+=2*L,一种是选y较小的部分区间y-=2*L
每次操作线段树上二分在操作范围内的区间,区间修改即可。直接二分好写很多就没写线段树上二分了。

//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define Formylove return 0
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int N=;
typedef long long LL;
typedef double db;
using namespace std;
int n,m; template<typename T>void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} struct node {
int x,d,l;
}q[N]; #define lc x<<1
#define rc (x<<1|1)
#define mid ((l+r)>>1)
struct sgtree {
LL lz[N<<];
void down(int x) {
if(!lz[x]) return ;
lz[lc]+=lz[x]; lz[rc]+=lz[x];
lz[x]=;
} void update(int x,int l,int r,int ql,int qr,int v) {
if(l>=ql&&r<=qr) {
lz[x]+=v; return ;
}
down(x);
if(ql<=mid) update(lc,l,mid,ql,qr,v);
if(qr>mid) update(rc,mid+,r,ql,qr,v);
} LL qry(int x,int l,int r,int pos) {
if(l==r) return lz[x];
down(x);
if(pos<=mid) return qry(lc,l,mid,pos);
else return qry(rc,mid+,r,pos);
}
}sgx,sgy; #define ANS
int main() {
#ifdef ANS
freopen("geologic.in","r",stdin);
freopen("geologic.out","w",stdout);
#endif
read(n); read(m);
For(i,,m) {
read(q[i].x);
read(q[i].d);
read(q[i].l);
}
For(i,,n) sgx.update(,,n,i,i,i),sgy.update(,,n,i,i,i);
Rep(i,m,) {
if(q[i].d==) { //down
int l=,r=n,rs=-;
while(l<=r) {
if(sgx.qry(,,n,mid)<=q[i].x) rs=mid,l=mid+;
else r=mid-;
}
if(rs!=-) sgy.update(,,n,,rs,-*q[i].l);
}
else { //right
int l=,r=n,rs=-;
while(l<=r) {
if(sgy.qry(,,n,mid)>q[i].x) rs=mid,r=mid-;
else l=mid+;
}
if(rs!=-) sgx.update(,,n,rs,n,*q[i].l);
}
}
For(i,,n) printf("%lld\n",(sgx.qry(,,n,i)-sgy.qry(,,n,i))/);
Formylove;
}
暑假集训test-8-31(am)的更多相关文章
- STL 入门 (17 暑假集训第一周)
快速全排列的函数 头文件<algorithm> next_permutation(a,a+n) ---------------------------------------------- ...
- 2015UESTC 暑假集训总结
day1: 考微观经济学去了…… day2: 一开始就看了看一道题目最短的B题,拍了半小时交了上去wa了 感觉自己一定是自己想错了,于是去拍大家都过的A题,十分钟拍完交上去就A了 然后B题写了一发暴力 ...
- 暑假集训Day2 互不侵犯(状压dp)
这又是个状压dp (大型自闭现场) 题目大意: 在N*N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. ...
- 暑假集训Day1 整数划分
题目大意: 如何把一个正整数N(N长度<20)划分为M(M>=1)个部分,使这M个部分的乘积最大.N.M从键盘输入,输出最大值及一种划分方式. 输入格式: 第一行一个正整数T(T<= ...
- 2013ACM暑假集训总结-致将走上大三征途的我
回想起这个暑假,从开始与雄鹰一起的纠结要不要进集训队,与吉吉博博组队参加地大邀请赛,害怕进不了集训队.当时激励我月份开始接触的,记得当时在弄运动会来着,然后就问了雄鹰一些输入输出的东西,怀着满心的期待 ...
- [补档]暑假集训D6总结
考试 不是爆零,胜似爆零= = 三道题,就拿了20分,根本没法玩好吧= = 本来以为打了道正解,打了道暴力,加上个特判分,应该不会死的太惨,然而--为啥我只有特判分啊- - 真的是惨. 讲完题觉得题是 ...
- [补档]暑假集训D5总结
%dalao 今天又有dalao来讲课,讲的是网络流 网络流--从入门到放弃:7-29dalao讲课笔记--https://hzoi-mafia.github.io/2017/07/29/27/ ...
- [补档]暑假集训D1总结
归来 今天就这样回来了,虽然心里极其不想回来(暑假!@#的只有一天啊喂),但还是回来了,没办法,虽然不喜欢这个地方,但是机房却也是少数能给我安慰的地方,心再累,也没有办法了,不如好好集训= = %da ...
- 暑假集训(2)第七弹 -----今年暑假不AC(hdu2037)
J - 今年暑假不AC Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:32768KB 64 ...
- [补档]暑假集训D3总结
考试 集训第一次考试,然而- - 总共四道题,两道打了DFS,一道暴力,一道~~输出样例~~乱搞,都是泪啊- - 目前只改了三道,回头改完那道题再上题解吧- - T2 [Poi2010]Monot ...
随机推荐
- C/C++ 智能指针线程池
//这个线程池存在一定的BUG 如果没有多线程编程基础的先生请谨慎使用 //我放弃了这种模板方式的线程池,最好不要使用!!!!!!! ThreadPool.h { #ifndef __THREADPO ...
- Vue学习笔记【1】——什么是Vue.js
什么是Vue.js Vue.js 是目前最火的一个前端框架,React是最流行的一个前端框架(React除了开发网站,还可以开发手机App, Vue语法也是可以用于进行手机App开发的,需要借助于We ...
- Ubuntu 18.04 安装 python3.7
Ubuntu 18.04系统内置了Python 3.6和Python 2.7版本,以下是在Ubuntu 18.04系统中安装Python 3.7版本的方法. 1. 执行所有升级# sudo apt u ...
- pandas for python
http://pandas.pydata.org/pandas-docs/stable/user_guide/index.html 不算太难,需要拿一本线性代数看看矩阵原理即可.重点在于考虑如何运用, ...
- noip2007 tg day1t1 统计数字
题目描述 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*10^9).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出 ...
- 汇编检测OD代码
repnz指令说明:重复执行其后面的指令,CX或ECX存放最多比较次数,DI或EDI存放查找表首地址,AL或AX或EAX存放想查找的内容.当(CX或ECX)= 0 或 ZF=1 退出重复,否则,(CX ...
- PHP 图形验证码
一段生成图形验证码的代码,向原创作者致谢. 1.将以下代码保存为 txm.php ,注:直接运行该页面是没有结果的,要用另一页面引用,请看步骤2 <?php session_start(); $ ...
- 在linux服务器中网站环境搭建好了.能看到首页,其他页面404解决
Linux开启url重写的方法:1.打开 apache 里httpd.conf(通常是在/etc/httpd/conf目录里)2.找到 #LoadModule rewrite_module modul ...
- 从客户端中检测到有潜在危险的 request.form值 以及 request.querystring[解决方法]
一.从客户端中检测到有潜在危险的request.form值 当页面编辑或运行提交时,出现“从客户端中检测到有潜在危险的request.form值”问题,该怎么办呢?如下图所示: 下面博主汇总出现这种错 ...
- LeetCode 相交链表&环形链表II
题目链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/ 题目连接:https://leetcode-cn.com ...