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)的更多相关文章

  1. STL 入门 (17 暑假集训第一周)

    快速全排列的函数 头文件<algorithm> next_permutation(a,a+n) ---------------------------------------------- ...

  2. 2015UESTC 暑假集训总结

    day1: 考微观经济学去了…… day2: 一开始就看了看一道题目最短的B题,拍了半小时交了上去wa了 感觉自己一定是自己想错了,于是去拍大家都过的A题,十分钟拍完交上去就A了 然后B题写了一发暴力 ...

  3. 暑假集训Day2 互不侵犯(状压dp)

    这又是个状压dp (大型自闭现场) 题目大意: 在N*N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. ...

  4. 暑假集训Day1 整数划分

    题目大意: 如何把一个正整数N(N长度<20)划分为M(M>=1)个部分,使这M个部分的乘积最大.N.M从键盘输入,输出最大值及一种划分方式. 输入格式: 第一行一个正整数T(T<= ...

  5. 2013ACM暑假集训总结-致将走上大三征途的我

    回想起这个暑假,从开始与雄鹰一起的纠结要不要进集训队,与吉吉博博组队参加地大邀请赛,害怕进不了集训队.当时激励我月份开始接触的,记得当时在弄运动会来着,然后就问了雄鹰一些输入输出的东西,怀着满心的期待 ...

  6. [补档]暑假集训D6总结

    考试 不是爆零,胜似爆零= = 三道题,就拿了20分,根本没法玩好吧= = 本来以为打了道正解,打了道暴力,加上个特判分,应该不会死的太惨,然而--为啥我只有特判分啊- - 真的是惨. 讲完题觉得题是 ...

  7. [补档]暑假集训D5总结

    %dalao 今天又有dalao来讲课,讲的是网络流 网络流--从入门到放弃:7-29dalao讲课笔记--https://hzoi-mafia.github.io/2017/07/29/27/   ...

  8. [补档]暑假集训D1总结

    归来 今天就这样回来了,虽然心里极其不想回来(暑假!@#的只有一天啊喂),但还是回来了,没办法,虽然不喜欢这个地方,但是机房却也是少数能给我安慰的地方,心再累,也没有办法了,不如好好集训= = %da ...

  9. 暑假集训(2)第七弹 -----今年暑假不AC(hdu2037)

    J - 今年暑假不AC Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64 ...

  10. [补档]暑假集训D3总结

    考试 集训第一次考试,然而- -   总共四道题,两道打了DFS,一道暴力,一道~~输出样例~~乱搞,都是泪啊- - 目前只改了三道,回头改完那道题再上题解吧- - T2 [Poi2010]Monot ...

随机推荐

  1. appium1.4+华为8.0执行自动化脚本,报启动session失败,原因是unicode_ime_apk\Uni codeIME-debug.apk在手机上已存在,再次安装失败,导致启动session失败,解决办法:换高版本的appium

    最开始做Android自动化测试时,通过执行脚本发现报,已安装UnicodeIME-debug.apk,再次安装失败,当时觉得这个apk对我来说没用,就把D:\Program Files (x86)\ ...

  2. Copying Books

    Copying Books 给出一个长度为m的序列\(\{a_i\}\),将其划分成k个区间,求区间和的最大值的最小值对应的方案,多种方案,则按从左到右的区间长度尽可能小(也就是从左到右区间长度构成的 ...

  3. vue-cli 项目配置

    vue viewport <meta name="viewport" content="width=device-width,initial-scale=1,min ...

  4. 一些DP杂题

    1. [HNOI2001] 产品加工 一道简单的背包,然而我还是写了很久QAQ 时间范围是都小于5 显然考虑一维背包,dp[i]表示目前A消耗了i的最小B消耗 注意 if(b[i]) dp[j]=dp ...

  5. window安装reidis完成之后,想要把数据存入redis,必须开扩展,不然报错,redis windows phpstudy 安装扩展

    redis windows phpstudy 安装扩展   1.http://windows.php.net/downloads/pecl/releases/redis/3.1.5rc1/ 2.htt ...

  6. img标签+map的使用

    img标签+map的使用 img标签含有一个usemap属性,用法相当于锚点的使用,usemap="#useName".然后就是map标签,具体代码: <body> & ...

  7. 面向对象(三)——组合、多态、封装、property装饰器

    组合.多态.封装.property装饰器 一.组合 1.什么是组合 组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象 class Foo(): pass class Bar(): pas ...

  8. Java通道

    通道(Channel)是数据源和Java程序之间的开放连接,用于执行I/O操作.Channel接口在java.nio.channels包中.通道(Channel)接口只声明了两个方法:close()和 ...

  9. kafka相关业务必会操作命令整理

    参考:https://kafka.apache.org 服务相关命令 1.启动/停止zk > bin/zookeeper-server-start.sh config/zookeeper.pro ...

  10. html5语义化标签大全

    常见的语义化标签有 <article>.<section>.<nav>.<aside>.<header>.<footer> 详细 ...