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. SOUI3.0仿Android插值动画使用方法

    在Android系统中,有插值动画,数值动画,属性动画,帧动画. 帧动画,在SOUI里可以通过AnimateImg这个控件来实现,其它几种动画3.0之前不支持,需要类似动画效果,只能自己通过定时器去实 ...

  2. leetcode 113 path Sum II 路径和

    递归先序遍历+vector<int>容器记录路径 /** * Definition for a binary tree node. * struct TreeNode { * int va ...

  3. 博客侧边栏公告html代码

    前一小段是时钟: 后一段是百度统计,但是显示不出来. 网站概况 - 百度统计 https://tongji.baidu.com/web/25880379/overview/index 趋势分析 - 百 ...

  4. 第十届山东省acm省赛补题(2)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4124 L Median Time Limit: 1 Second      ...

  5. 学习kettle遇到的问题

    一. 解决mysql连接缺少驱动问题:http://www.mamicode.com/info-detail-1724584.html 1.下载驱动 https://dev.mysql.com/dow ...

  6. GCC 环境变量 & eclipse CDT 头文件配置

     转:http://blog.csdn.net/statdm/article/details/7751000 GCC 环境变量 & eclipse CDT 头文件配置   在unix 下使用e ...

  7. Vue-cli项目与element导航菜单控件的结合使用以及遇到的问题

    1.基本使用 第一种常用写法:导航菜单与 router-view 的配合使用 将所用的导航菜单数据编写成一个数组的形式,提高维护性: 在utils工具文件夹中建立utils.js文件: import ...

  8. Java基础语法--IDEA快捷键

    Ctrl+Shift + Enter,语句完成“!”,否定完成,输入表达式时按 “!”键Ctrl+E,最近的文件Ctrl+Shift+E,最近更改的文件Shift+Click,可以关闭文件Ctrl+[ ...

  9. realloc ------ 扩大malloc得到的内存空间

    char* p = malloc(1024);char* q = realloc(p,2048); 现在的问题是我们应该如何处理指针 p. 刚开始按照我最直观的理解,如果就是直接将 p = NULL; ...

  10. IntelliJ IDEA 2019.3 这回真的要飞起来了,新特性抢先看!

    IntelliJ IDEA 才公布下一个主要版本 2019.3 的 Roadmap,近日就发布了 IntelliJ IDEA 2019.3 的首个早期访问版本(即 EAP 版本),版本号为 2019. ...