C

树的性质是点-边=1

森林联通块计数都可以这么做所以直接维护前缀和再把边界处理一下就好了

//Love and Freedom.
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#define inf 20021225
#define ll long long
#define N 2100
using namespace std;
int read()
{
int f=,s=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-; ch=getchar();}
while(ch>=''&&ch<='') s=s*+ch-'',ch=getchar();
return f*s;
}
int a[N][N],p[N][N],e[N][N],hp[N][N],lp[N][N],n,m; char ch[N];
int main()
{
n=read(),m=read(); int Q=read();
for(int i=;i<=n;i++)
{
scanf("%s",ch+);
for(int j=;j<=m;j++)
{
a[i][j]=ch[j]-'';
p[i][j]=p[i-][j]+p[i][j-]-p[i-][j-]+a[i][j];
e[i][j]=e[i-][j]+e[i][j-]-e[i-][j-]+(a[i][j]&a[i-][j])+(a[i][j-]&a[i][j]);
hp[i][j]=hp[i][j-]+(a[i][j]&a[i-][j]);
lp[i][j]=lp[i-][j]+(a[i][j]&a[i][j-]);
}
}
while(Q--)
{
int h1=read(),l1=read(),h2=read(),l2=read();
int poi=p[h2][l2]-p[h2][l1-]-p[h1-][l2]+p[h1-][l1-];
//printf("%d %d %d %d\n",p[h2][l2],p[h2][l1-1],p[h1-1][l2],p[h1-1][l1-1]);
int ed=e[h2][l2]-e[h2][l1-]-e[h1-][l2]+e[h1-][l1-];
//printf("%d ",ed);
ed -= hp[h1][l2]-hp[h1][l1-];
ed -= lp[h2][l1]-lp[h1-][l1];
//printf("%d %d %d %d\n",hp[h1][l2],hp[h1][l1-1],lp[h2][l1],lp[h1-1][l1]);
printf("%d\n",poi-ed);
}
return ;
}

C

D

神仙思路题(我没脑子)

考虑首先AB的最长公共前缀一定可以丢掉

然后下一位B是1A是0

我么设这一位为p

考虑[A,1<<p)的答案和[1<<p,B]的答案

显然只取前面一个集合的答案就是(1<<p)-A

只取后面的 我们考虑B接下来最高位的一个1 记为k

那么答案就是[1<<p,(1<<p) + (1<<k+1)  -1]

最后考虑两个都取 答案是[(1<<p)+A,(2<<p)-1]

发现后面两个需要取并

这类题的思路主要在于取值是区间因此答案也是区间

//Love and Freedom.
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#define inf 20021225
#define ll long long
using namespace std;
int read()
{
int f=,s=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-; ch=getchar();}
while(ch>=''&&ch<='') s=s*+ch-'',ch=getchar();
return f*s;
}
int main()
{
ll a,b; scanf("%lld%lld",&a,&b); ll ans=;
if(a==b) return puts(""),;
for(int i=;~i;i--)
if((a>>i&)!=(b>>i&))
{
a&=(1ll<<i+)-; b&=(1ll<<i)-;
ll p=1ll<<i; ans+=p-a;
for(;~i;i--) if(b>>i&) break;
i++; ans+=1ll<<i; a=max(1ll<<i,a);
//printf("%lld %lld %lld\n",ans,i,a);
ans+=p-a;
break;
}
printf("%lld\n",ans);
return ;
}

D

E

其实就差一步了(枯了

考虑一个点能染的点

有显然的两种

1.xj<xi vj>vj

2.xj>xi vj<vi

我们继续考虑一些复杂的

发现对于位置位于当前点之前的速度最大的点若比它的速度大的话就一定会把所有速度小于这个最大值的所有点染色(想想为什么?)

后面的同理

所以按照速度排序以后变成了区间覆盖的方案数

显然可以线段树优化(哦其实可以直接前缀和优化 可惜我懒qwq)

所以就做完了

//Love and Freedom.
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#define inf 20021225
#define ll long long
#define N 200100
#define mdn 1000000007
#define ls (x<<1)
#define rs (x<<1|1)
#define mid (l+r>>1)
using namespace std;
int read()
{
int f=,s=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-; ch=getchar();}
while(ch>=''&&ch<='') s=s*+ch-'',ch=getchar();
return f*s;
}
void upd(int &x,int y){x+=x+y>=mdn?y-mdn:y;}
int t[N<<];
void pushup(int x){t[x]=(t[ls]+t[rs])%mdn;}
void modify(int x,int l,int r,int d,int val)
{
if(l==r){upd(t[x],val); return;}
if(d<=mid) modify(ls,l,mid,d,val);
else modify(rs,mid+,r,d,val);
pushup(x);
}
int query(int x,int l,int r,int LL,int RR)
{
if(LL<=l&&RR>=r) return t[x]; int ans=;
if(LL<=mid) upd(ans,query(ls,l,mid,LL,RR));
if(RR>mid) upd(ans,query(rs,mid+,r,LL,RR));
return ans;
}
struct node{int x,v,idx,idv;}a[N];
struct seg{int l,r;}s[N];
bool operator<(seg a,seg b){return a.r<b.r||(a.r==b.r&&a.l<b.l);}
bool cmpv(node x,node y){return x.v<y.v;}
bool cmpx(node x,node y){return x.x<y.x;}
int pre[N],suf[N],n,v[N];
int main()
{
n=read();
for(int i=;i<=n;i++) a[i].x=read(),a[i].v=read();
sort(a+,a+n+,cmpv);
for(int i=;i<=n;i++) a[i].idv=i,v[i]=a[i].v;
sort(a+,a+n+,cmpx); //suf[n+1]=inf*99;
for(int i=;i<=n;i++)
{
if(i==) pre[]=a[].idv;
else
{
if(a[i].v>v[pre[i-]]) pre[i]=a[i].idv;
else pre[i]=pre[i-];
}
a[i].idx=i;
}
for(int i=n;i;i--)
{
if(i==n) suf[n]=a[n].idv;
else
{
if(a[i].v<v[suf[i+]]) suf[i]=a[i].idv;
else suf[i]=suf[i+];
}
}
modify(,,n,,);
for(int i=;i<=n;i++)
{
int r=pre[a[i].idx],l=suf[a[i].idx];
s[i].l=l; s[i].r=r;
}
sort(s+,s+n+);
for(int i=;i<=n;i++)
{
int l=s[i].l,r=s[i].r;
int val=query(,,n,l-,r);
modify(,,n,r,val);
}
printf("%d\n",query(,,n,n,n));
return ;
}

E

F

第一问显然是Fib(昨天刚好学类欧于是反应贼快)

第二问还8会 等我咕会

我去世了 下一周 我们就考到了这个题/px

具体做法很神仙 我懒得写了 大概就是考虑递推出来的组数都不会特别多

然后考虑再从上一层推出当前答案即可

//Love and Freedom.
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<vector>
#define inf 20021225
#define ll long long
#define pa pair<ll,ll>
#define mp make_pair
#define pb push_back
#define mdn 1000000007
using namespace std;
int read()
{
int f=,s=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-; ch=getchar();}
while(ch>=''&&ch<='') s=s*+ch-'',ch=getchar();
return f*s;
}
ll fib[]; vector<pa> ans[];
int work(ll a,ll b,ll x,ll y)
{
int cur=;
if(x>=b&&y>=a+b) (cur+=(y-a)/b%mdn)%mdn;
if(y>=b&&x>=a+b) (cur+=(x-a)/b%mdn)%mdn;
return cur;
}
int main()
{
int top; fib[]=fib[top=]=;
while(fib[top]<=4e18) ++top,fib[top]=fib[top-]+fib[top-];
ans[].pb(mp(0ll,1ll)),ans[].pb(mp(0ll,2ll));
for(int i=;i+<=top;i++)
{
for(int j=;j<ans[i].size();j++)
{
ll x=ans[i][j].first,y=ans[i][j].second; x+=y;
while(x<=fib[i+]+fib[i])
{
if(x>y) ans[i+].pb(mp(y,x));
x+=y;
}
}
}
int q=read();
while(q--)
{
ll x,y; scanf("%lld%lld",&x,&y);
if(x>y) swap(x,y); int cur=;
while(fib[cur+]<=y&&fib[cur+]<=x) cur++;
printf("%d ",cur); int sum=;
if(cur==){printf("%lld\n",x%mdn*y%mdn); continue;}
for(int i=;i<ans[cur-].size();i++)
(sum+=work(ans[cur-][i].first,ans[cur-][i].second,x,y))%=mdn;
printf("%d\n",sum);
}
return ;
}

F

AGC015做题记录的更多相关文章

  1. UOJ 做题记录

    UOJ 做题记录 其实我这么弱> >根本不会做题呢> > #21. [UR #1]缩进优化 其实想想还是一道非常丝播的题目呢> > 直接对于每个缩进长度统计一遍就好 ...

  2. project euler做题记录

    ProjectEuler_做题记录 简单记录一下. problem 441 The inverse summation of coprime couples 神仙题.考虑答案为: \[\begin{a ...

  3. Sam做题记录

    Sam做题记录 Hihocoder 后缀自动机二·重复旋律5 求一个串中本质不同的子串数 显然,答案是 \(\sum len[i]-len[fa[i]]\) Hihocoder 后缀自动机三·重复旋律 ...

  4. 退役IV次后做题记录

    退役IV次后做题记录 我啥都不会了.... AGC023 D 如果所有的楼房都在\(S\)同一边可以直接得出答案. 否则考虑最左最右两边的票数,如果左边>=右边,那么最右边会投给左边,因为就算车 ...

  5. 退役III次后做题记录(扯淡)

    退役III次后做题记录(扯淡) CF607E Cross Sum 计算几何屎题 直接二分一下,算出每条线的位置然后算 注意相对位置这个不能先搞出坐标,直接算角度就行了,不然会卡精度/px flag:计 ...

  6. 退役II次后做题记录

    退役II次后做题记录 感觉没啥好更的,咕. atcoder1219 历史研究 回滚莫队. [六省联考2017]组合数问题 我是傻逼 按照组合意义等价于\(nk\)个物品,选的物品\(\mod k\) ...

  7. BJOI做题记录

    BJOI做题记录 终于想起还要做一下历年省选题了2333 然而咕了的还是比做了的多2333 LOJ #2178. 「BJOI2017」机动训练 咕了. LOJ #2179. 「BJOI2017」树的难 ...

  8. FJOI2017前做题记录

    FJOI2017前做题记录 2017-04-15 [ZJOI2017] 树状数组 问题转化后,变成区间随机将一个数异或一,询问两个位置的值相等的概率.(注意特判询问有一个区间的左端点为1的情况,因为题 ...

  9. [日记&做题记录]-Noip2016提高组复赛 倒数十天

    写这篇博客的时候有点激动 为了让自己不颓 还是写写日记 存存模板 Nov.8 2016 今天早上买了两个蛋挞 吃了一个 然后就做数论(前天晚上还是想放弃数论 但是昨天被数论虐了 woc noip模拟赛 ...

随机推荐

  1. The file is inaccessible to Server.

    ArcGIS Unable to Start serviceserver安装后,启动服务失败,报错信息如下:Unable to Start service. Error (Server object  ...

  2. windows环境下PostgreSQL的安装

    1.首先在如下链接下载PostgreSQL的压缩包,我这里下载的是postgresql-12.1-1-windows-x64-binaries.zip. https://www.enterprised ...

  3. Linux安装MySql5.7及配置(yum安装)

    Linux安装MySql5.7及配置(yum安装) [root@xld ~]# rpm -q centos-release centos-release-7-7.1908.0.el7.centos.x ...

  4. IntelliJ IDEA 2019.1.1 maven框架web.xml中web-app版本过低导致不能正常使用EL表达式的解决方案

     1.软件版本 IDEA版本:IntelliJ IDEA 2019.1.1 maven版本:apache-maven-3.6.1 Tomcat版本:tomcat-8.5 2.问题描述 IDEA使用如下 ...

  5. word2vec (CBOW、分层softmax、负采样)

    本文介绍 wordvec的概念 语言模型训练的两种模型CBOW+skip gram word2vec 优化的两种方法:层次softmax+负采样 gensim word2vec默认用的模型和方法 未经 ...

  6. 【Linux开发】【Qt开发】Qt界面键盘、触摸屏、鼠标的响应设置

    USB键盘 经过一番搜索,发现对Qt键盘的支持主要关系到两个方面: 1. 键盘类型确定: 4.7以前的Qt版本,如果是PS2圆孔键盘,Qt编译时需加上选项:-qt-kbd-vr41xx(未测试):如果 ...

  7. pyhton之解析html的表格

    #!/usr/bin/env python3 # -*- coding: utf-8 -*- __author__ = 'jiangwenwen' from bs4 import BeautifulS ...

  8. docker配置文件不生效

    1.查看docker配置文件位置 systemctl status docker.service 2.修改docker配置文件 vim /lib/systemd/system/docker.servi ...

  9. [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块)

    [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块) 题面 求 \[\sum_{i=1}^{n} \sum_{j=1}^{m} \mathrm{lcm}(i,j)\] 分析 \[\su ...

  10. 题解 AT1357 【n^p mod m】

    此题就是快速幂取模 先简单讲一讲快速幂 首先,快速幂的目的就是做到快速求幂,假设我们要求a^b,按照朴素算法就是把a连乘b次,这样一来时间复杂度是O(b)也即是O(n)级别,快速幂能做到O(logn) ...