AGC015做题记录
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做题记录的更多相关文章
- UOJ 做题记录
UOJ 做题记录 其实我这么弱> >根本不会做题呢> > #21. [UR #1]缩进优化 其实想想还是一道非常丝播的题目呢> > 直接对于每个缩进长度统计一遍就好 ...
- project euler做题记录
ProjectEuler_做题记录 简单记录一下. problem 441 The inverse summation of coprime couples 神仙题.考虑答案为: \[\begin{a ...
- Sam做题记录
Sam做题记录 Hihocoder 后缀自动机二·重复旋律5 求一个串中本质不同的子串数 显然,答案是 \(\sum len[i]-len[fa[i]]\) Hihocoder 后缀自动机三·重复旋律 ...
- 退役IV次后做题记录
退役IV次后做题记录 我啥都不会了.... AGC023 D 如果所有的楼房都在\(S\)同一边可以直接得出答案. 否则考虑最左最右两边的票数,如果左边>=右边,那么最右边会投给左边,因为就算车 ...
- 退役III次后做题记录(扯淡)
退役III次后做题记录(扯淡) CF607E Cross Sum 计算几何屎题 直接二分一下,算出每条线的位置然后算 注意相对位置这个不能先搞出坐标,直接算角度就行了,不然会卡精度/px flag:计 ...
- 退役II次后做题记录
退役II次后做题记录 感觉没啥好更的,咕. atcoder1219 历史研究 回滚莫队. [六省联考2017]组合数问题 我是傻逼 按照组合意义等价于\(nk\)个物品,选的物品\(\mod k\) ...
- BJOI做题记录
BJOI做题记录 终于想起还要做一下历年省选题了2333 然而咕了的还是比做了的多2333 LOJ #2178. 「BJOI2017」机动训练 咕了. LOJ #2179. 「BJOI2017」树的难 ...
- FJOI2017前做题记录
FJOI2017前做题记录 2017-04-15 [ZJOI2017] 树状数组 问题转化后,变成区间随机将一个数异或一,询问两个位置的值相等的概率.(注意特判询问有一个区间的左端点为1的情况,因为题 ...
- [日记&做题记录]-Noip2016提高组复赛 倒数十天
写这篇博客的时候有点激动 为了让自己不颓 还是写写日记 存存模板 Nov.8 2016 今天早上买了两个蛋挞 吃了一个 然后就做数论(前天晚上还是想放弃数论 但是昨天被数论虐了 woc noip模拟赛 ...
随机推荐
- html readonly 和 disable 区别
readonly 和 disable的区别Readonly和Disabled它们都能够做到使用户不能够更改表单域中的内容.但是它们之间有着微小的差别,总结如下: Readonly只针对input(te ...
- Git - 对一组仓库进行配置
对一组仓库使用一套配置,另一组仓库使用另一套配置的需求也是有的,比如公司仓库的配置和我个人项目的仓库配置并不完全相同,每次都修改单个仓库的配置太麻烦并且可能会粗心忘改了以错误的配置进行提交,如何对一个 ...
- springMVC4+spring4+hibernate4框架搭建
最近项目不是很忙,整理了一个springMVC框架给大家分享下,框架结构:springMVC4+spring4+hibernate4,主要是spring配置.springmvc配置.hibernate ...
- 在word中的表格指定位置插入一行
//创建一个Document类对象,并加载Word文档 Document doc = new Document(); doc.LoadFromFile(@"C:\Users\Administ ...
- Jmeter之仅一次控制器
在进行压测时,往往登录只需要一次,其他的接口需要循环测试.这里就会用到控制器中的仅一次控制器.只要放置在控制器的请求,不管在哪种情况下,都只执行一次. 1.名称:可以标识在该控制器下主要完成的 工作内 ...
- CentOS安Elasticsearch
工作中有需求用到es做数据分析和日志搜索的,整理记录一下安装部署过程.ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful we ...
- 什么是Shell?Shell脚本基础知识详细介绍
这篇文章主要介绍了什么是Shell?Shell脚本基础知识介绍,本文是一篇Shell脚本入门文章,在本文你可学到什么是Shell.有多少种Shell.一个Shell脚本代码实例,需要的朋友可以参考下 ...
- Kotlin-Note
数字在需要一个可空的引用时,会进行装箱操作,数字装箱不一定保留同一性. val a = 1000 println(a === a) // 输出 "true" val boxedA ...
- python 并发编程 多进程 守护进程
一 守护进程 主进程创建子进程目的是:主进程有一个任务需要并发执行,那开启子进程帮我并发执行任务 主进程创建子进程,然后将该进程设置成守护自己的进程 关于守护进程需要强调两点: 其一:守护进程会在主进 ...
- 八、Zabbix-应用集、监控项
一.应用集 1.应用集一般配合监控项使用,它相当于多个同类型的监控项的分类目录 2.添加应用集 (1)配置—>模板—>需要调整的模板—>应用集 (2)添加应用集 (3) (4)查看应 ...