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模拟赛 ...
随机推荐
- gson转换json到bean时重命名
@Expose @SerializedName("0001") public Map<String,ChannelBean> c0001 = new HashMap ...
- 性能测试工具之WebBench
一.简介 WebBench是一款在Linux下使用非常简单的压力测试工具.它的原理是:WebBench首先fork出多个子进程,每个子进程都循环做web访问测试.子进程把访问的结果通过pipe告诉父进 ...
- C# 无焦点获取扫码枪扫码信息
代码网上有的是,多是需要窗体焦点直接show出扫码信息(usb,模拟键盘,hook) 怎样才能真的无焦点获取? 用串口方式 usb转串口 以接收串口通讯消息的方式获取扫码信息
- (四) appium-desktop 脚本录制常用AW使用介绍
通过使用appium-desktop录制脚本,编写app自动化脚本的过程中,会使用到一些AW,下面就这些AW的使用方法做详细的介绍.通过实践可以看到这几个AW可以完成测试工作. AWOpenGiveP ...
- react-native的技巧
按钮定制 給图片添加点击事件 <TouchableOpacity onPress={this.lookAlbum} style={{flex: 0, height: 40, width: 40, ...
- “EndExecuteNonQuery”方法没有任何重载采用“0”个参数
EndExecuteNonQuery需要参数IAsyncResult asyncResult myCmd.ExecuteNonQuery();//执行 ExecuteNonQuery 返回受影响行数
- CentOSLinux系统Nginx优化
Nginx优化 Auther:Rich七哥 Nginx优化一.Nginx隐藏版本号:二.网页缓存.连接超时.网页压缩传输:配置连接超时:3.网页压缩传输:三.访问控制.定义错误页面.自动索引.目录别名 ...
- 把对像生成json并存储到文件
1.创建实体对像json import com.alibaba.fastjson.annotation.JSONField; import java.util.Date; public class S ...
- P1074 靶形数独 dfs+预处理
https://www.luogu.org/problemnew/show/P1074 显然是dfs 而且没有什么剪枝记忆化之类的 但是预处理比较麻烦 我用三个二维数组存状态:visx[x][i]代表 ...
- 小白用Mac
老话说的好,“最近老板发我一个Mac,但是不会用,嘎嘎嘎嘎” 1.安装软件 安装 Homebrew Homebrew:使用 Homebrew 安装 Apple 没有预装但 你需要的东西,尤其是非界面管 ...