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. LoadRunner之关联

    一.什么是关联 关联就是将服务器动态返回变化的值保存为一个参数以供后面需要用到的地方使用. 二.什么时候需要关联 1.服务器返回中存在动态变化的值,一般是类似session.token这样的无规则数据 ...

  2. 正则表达式——推荐使用 Unicode 编码

      常见的正则表达式的文档都是关于英文(ASCII字符)的,英文开发者通常也只需要处理ASCII字符,不需要处理中文这类多字符的字符.不过,依照李处ASCII字符的方式处理中文字符,就有可能出错.   ...

  3. 应用安全 - 无文件攻击 - Office漏洞 - 汇总

    CVE-2017-0199 Date: -1 类型: 弹窗|内网穿透导致远程代码执行 影响范围: Microsoft Office 2007 Service Pack 3 Microsoft Offi ...

  4. 【Qt开发】QThread介绍

    回顾Qt之线程(QThread),里面讲解了如何使用线程,但还有很多人留言没有看明白,那么今天我们来一起瞅瞅关于QThread管理线程的那些事儿... 一.线程管理 1.线程启动 void start ...

  5. VS2017使用dotnet命令

    添加引用Microsoft.EntityFrameworkCore.Tools 添加引用后提示未找到命令“dotnet ef”向csprog文件添加如下节点 <ItemGroup> < ...

  6. MAC_BOOKPRO苹果电脑系统常用快捷键大全

    Mac 键盘快捷键 我在品多多上拼的Mac终于到货了,安全下车,接下来要熟练使用了! 您可以按下某些组合键来实现通常需要鼠标.触控板或其他输入设备才能完成的操作.   要使用键盘快捷键,请按住一个或多 ...

  7. C#基础篇之C#和 .Net框架的概念和运行原理

    一.微软平台的发展史 二..Net框架包含的东西 1.名词解释 BCL:基类库(Base Class Library)系统和底层提供的最基本的类库 CLR:公共语言运行时(Common Languag ...

  8. phpstudy添加PHP

    想在phpstudy2018里面增加一个php版本,操作如下: 一.下载php-7.2.19-ts文件,解压缩,放在相应的目录下: 二.修改Apache的配置文件1.修改httpd.conf 配置,D ...

  9. Codeforces 1255F Point Ordering(凸包+叉积)

    我们随机选取点1,2作为凸包的一个分割线,那么我们可以直接枚举剩下n-2个点找到他们和向量1-2的叉积大小与正负,然后我们可以根据叉积的正负,先将他们分割出两个区域,在向量1-2的下方还是上方,接下来 ...

  10. POJ 3410 Split convex polygon(凸包)

    题意是逆时针方向给你两个多边形,问你这两个多边形通过旋转和平移能否拼成一个凸包. 首先可以想到的便是枚举边,肯定是有一对长度相同的边贴合,那么我们就可以n2枚举所有边对,接下来就是旋转点对,那么假设多 ...