[TJOI2016&HEOI2016]
很有意思。是因为排序那道题才听闻今年tjoi2016的。
题是好题!先把它刷完再去把zhihu look through一遍。
bzoj4552
以后看到什么做不出的题,看看能否写二分!!!!写二分!!!!写二分!!!!!!!!
二分答案,大于mid的取一,否则为0,写的时候注意了一些细节,所以效率比较高。
二分的时候边界少打了个等于,下次要注意回来看边界!
膜鏼添动力--
#include<cstdio> #include<cstring> #include<algorithm> #define N 400100 using namespace std; int n,m,ans; int tree[N],f[N],a[N],z[N],y[N],sum[N],op[N]; void push_down(int p,int st,int ed) { ); f[p+p]=f[p];f[p+p+]=f[p]; tree[p+p]=f[p]-;tree[p+p+]=f[p]-; sum[p+p]=tree[p+p]*(mid-st+);sum[p+p+]=tree[p+p+]*(ed-mid); f[p]=; } int ask(int l,int r,int st,int ed,int p) { if(l==st&&r==ed)return sum[p];push_down(p,st,ed); ; if(r<=mid)return ask(l,r,st,mid,p+p);else ,ed,p+p+);else ,r,mid+,ed,p+p+); } int find(int l,int st,int ed,int p) { if(l==st&&l==ed)return tree[p]; push_down(p,st,ed); ; if(l<=mid)return find(l,st,mid,p+p);else ,ed,p+p+); } void update(int l,int r,int st,int ed,int p,int v) { if(l>r)return; ; if(l==st&&r==ed) { tree[p]=v;sum[p]=v*(ed-st+);f[p]=v+; return; } push_down(p,st,ed); if(r<=mid)update(l,r,st,mid,p+p,v);else ,ed,p+p+,v);else { update(l,mid,st,mid,p+p,v);update(mid+,r,mid+,ed,p+p+,v); } sum[p]=sum[p+p]+sum[p+p+]; } void work(int now) { memset(tree,,,,sizeof(sum)); ;i<=n;i++),n,,); ;i<=m;i++) { int l=z[i],r=y[i]; ,n,);//printf("now==%d %d\n",now,x); ) { update(l,r-x,,n,,);update(r-x+,r,,n,,);//sheng xu }else { update(l,l+x-,,n,,);update(l+x,r,,n,,);//jiang xu } } } int main() { //freopen("4552.in","r",stdin); scanf("%d%d",&n,&m); ;i<=n;i++)scanf("%d",&a[i]); ;i<=m;i++) { scanf("%d%d%d",&op[i],&z[i],&y[i]); } int p; scanf(,r=n; while(l<=r) { ; work(mid);,n,); )l=mid+;; //printf("%d %d\n",l,r); } printf("%d",ans); }
5/29
昨天晚上做了T1,bzoj4551 Tree
#include<cstdio> #include<algorithm> #include<cstring> #define N 200010 using namespace std; int n,m,edgenum,num; int vet[N],next[N],ans[N],head[N],f[N],dis[N],s[N],fa[N],q[N]; void add(int u,int v) { edgenum++;vet[edgenum]=v;next[edgenum]=head[u];head[u]=edgenum; } int find(int x) { if (f[x]!=x)f[x]=find(f[x]);return f[x]; } void dfs(int u,int ff,int dep) { int e=head[u]; ))f[u]=ff;dis[u]=dep;//printf("%d %d\n",u,f[u]); ) { int v=vet[e]; ) { fa[v]=u;dfs(v,u,dep+); } e=next[e]; } } int main() { scanf(]=;f[]=;fa[]=;s[]=; ;i<=n-;i++) { int u,v; scanf("%d%d",&u,&v);add(u,v);add(v,u); } ;i<=m;i++) { ]; scanf("%s%d",st,&q[i]); ]=='Q')q[i]=-q[i];else f[q[i]]=q[i],s[q[i]]++; } dfs(,,); ;i--) { ) { num++,ans[num]=find(-q[i]); }else { int x=q[i],y=find(fa[x]);s[x]--; )f[x]=y; } } ;i--)printf("%d\n",ans[i]); }
4553: [Tjoi2016&Heoi2016]序列
看懂了题意的限制后,就可以知道,若要i可以排在j的前面;只要满足r[i]<=a[j],a[i]<=L[j]即可。
秒yy了一个二分求不下降子序列的方法发现不可以,why?
因为它的限制条件是二维的,无法描述谁比谁更优。---此时就需要求助于cdq分治了
听说要小心写,否则容易写出暴力。
然后这里写的时候有两个需要注意的点,清空树状数组的时候不要偷懒写memset,这样就是暴力了,(个人被坑了好几次)。
还有就是当l==r的时候,切记不要将它直接赋值为1,它是有价值的qaq!
其它就没什么了,将每个点的答案看作一组询问,将询问二分,处理左边和右边,再处理左边对右边的影响,不会分析复杂度
反正是nlognlogn的。。。 以后写题的时候记住cdq的这个思想。。就好了(摔)
#include<cstdio> #define inf 1000000000 #include<algorithm> #include<cstring> #define N 100100 using namespace std; int L[N],c[N],a[N],R[N],ans[N]; int Ans,n,m; struct g{ int l,r,id; }d[N]; bool cmp(g a,g b) { if(a.l==b.l)return a.id<b.id;return a.l<b.l; } void cc(int x,int v) { ;i+=i&(-i)) { c[i]=max(c[i],v);)c[i]=; } } int get(int x) { ; ;i-=i&(-i)) { t=max(t,c[i]); }return t; } void solve(int l,int r) { );return;} ; solve(l,mid); for(int i=l;i<=r;i++) { if(i<=mid) { d[i].l=a[i];d[i].r=R[i]; }else { d[i].l=L[i];d[i].r=a[i]; } d[i].id=i; } sort(d+l,d++r,cmp); for(int i=l;i<=r;i++) if(d[i].id<=mid)cc(d[i].r,ans[d[i].id]); ); for(int i=l;i<=r;i++) ); solve(mid+,r); } int main() { scanf("%d%d",&n,&m); ;i<=n;i++) scanf("%d",&a[i]),L[i]=R[i]=a[i]; int x,y; ;i<=m;i++) { scanf("%d%d",&x,&y); if(y<L[x])L[x]=y;if(y>R[x])R[x]=y; } solve(,n);;i<=n;i++)if(ans[i]>Ans)Ans=ans[i]; printf("%d\n",Ans); }
bzoj4554[Game]
【claim again! you Musn't look through any solution every time when possible!】
对于n<=50,可以有很多思路。。。暴搜(这个稍微靠谱点儿)。。分治。。dp?
做题的时候最好先想想简单条件下的题目可以怎么做啊!!!!(二分都想不到真是受不了自己了)
二分图复杂度O(V*E),因为有硬石头,然后就可以轻易拆行(列) 了。
以前在212训练联赛题的时候做过一道类似的二分图匹配,横的竖的切一切,就是泥泞的牧场!!!
oh my god...我到底是当时做题太不走心还是现在智商+记忆直线下降啊。。。。。。。。。
#include<cstdio> #include<cstring> #include<algorithm> #define N 10000 using namespace std; ][]; ][],y[][],next[N],vet[N],head[N],flag[N],match[N]; void add(int u,int v) { edgenum++;vet[edgenum]=v;next[edgenum]=head[u];head[u]=edgenum; //printf("%d %d\n",u,v); } int dfs(int u) { ; ) { int v=vet[e]; ||(flag[match[v]]==&&dfs(match[v])==)) { match[v]=u; ; } e=next[e]; }; } int main() { scanf("%d%d",&n,&m); ;i<=n;i++) { scanf(); } ,B=; ;i<=n;i++) { ;j<=m;j++) { if(st[i][j]=='#')A++;x[i][j]=A; }A++; } ;j<=m;j++) { ;i<=n;i++) { if(st[i][j]=='#')B++;y[i][j]=B; }B++; } ;i<=n;i++) ;j<=m;j++) if(st[i][j]=='*') { int u=x[i][j],v=y[i][j];add(u,v); } ;i<=A;i++) { memset(flag,,sizeof(flag)); ans+=dfs(i); } printf("%d",ans); }
【bzoj4555】
NTT %%%NiroBC
感觉这辈子都不用做这道题了。。。
【Bzoj4556】
SAM..........orz
[TJOI2016&HEOI2016]的更多相关文章
- BZOJ 4552: [Tjoi2016&Heoi2016]排序
4552: [Tjoi2016&Heoi2016]排序 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 579 Solved: 322[Sub ...
- BZOJ 4551: [Tjoi2016&Heoi2016]树
4551: [Tjoi2016&Heoi2016]树 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 748 Solved: 394[Subm ...
- Bzoj 4556: [Tjoi2016&Heoi2016]字符串
4556: [Tjoi2016&Heoi2016]字符串 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 177 Solved: 92[Sub ...
- Bzoj4556: [Tjoi2016&Heoi2016]字符串 后缀数组
4556: [Tjoi2016&Heoi2016]字符串 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 169 Solved: 87[Sub ...
- bzoj4554: [Tjoi2016&Heoi2016]游戏 二分图匹配
4554: [Tjoi2016&Heoi2016]游戏 Description 在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂.简单的说,这个游戏就是在一张地图上放上若干个炸弹,看 是否能 ...
- BZOJ 4553 Tjoi2016&Heoi2016 序列
Tjoi2016&Heoi2016序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值 可能会变化,但同一个时刻最 ...
- BZOJ 4555: [Tjoi2016&Heoi2016]求和 [分治FFT 组合计数 | 多项式求逆]
4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...
- BZOJ 4555: [Tjoi2016&Heoi2016]求和 [FFT 组合计数 容斥原理]
4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...
- BZOJ4554 - [TJOI2016&HEOI2016]游戏
原题链接 Description 给出一个的地图,地图上有空地.软石头和硬石头.求在这张地图上最多能放上多少个炸弹能使得任意两个炸弹之间不会互相炸到.炸弹能炸到的范围是该炸弹所在的一行和一列,炸弹的威 ...
随机推荐
- yii php 图片上传与生成缩略图
今天需要做图片上传与生成缩略图的功能,把代码进行记录如下: html 视图 ($pic_action_url = $this->createAbsoluteUrl('h ...
- supersr--addSubview和 insertSubView 区别
A addSubview B 是将B直接覆盖在A的最上层 例子: [self.view addSubview:scrollView]; A insertSubView B AtIndex:2 是将 ...
- linux crontab 学习
安装crontab:[root@CentOS ~]# yum install vixie-cron[root@CentOS ~]# yum install crontabs/sbin/service ...
- python基础——定制类
python基础——定制类 看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的. __slots__我们已经知道怎么用了,__len__()方 ...
- 第二课 less的学习以及移动端需要注意的问题
一.LESS的学习笔记: 1.less介绍:一种动态样式语言.less将css赋予了动态语言的特性,如变量,继承,运算,函数,less既可以在客户端上运行(支持IE6+,webkit,firefox) ...
- python 连接sql server
linux 下pymssql模块的安装 所需压缩包:pymssql-2.1.0.tar.bz2freetds-patched.tar.gz 安装: tar -xvf pymssql-2.1.0.tar ...
- SQL学习笔记----更改SQL默认的端口号
1.SQLServer配置管理器----SQLServer网络配置----MSSQLSERVER的协议---TCP/IP(已启用)---IP地址 清空素有的IP,在IPALL下更改默认的端口: 2. ...
- mipi和dsi
转自: http://blog.csdn.net/longxiaowu/article/details/24410021 一.MIPI MIPI(移动行业处理器接口)是Mobile Industry ...
- WCF分布式开发必备知识(2):.Net Remoting
.Net Remoting技术,我们可以将其看作是一种分布式处理方式.作为应用程序之间通信的一种机制,.Net Remoting与MSMQ消息队列不同,它不支持离线脱机消息,另外只适合.Net平台间程 ...
- Java代码实现excel数据导入到Oracle
1.首先需要两个jar包jxl.jar,ojdbc.jar(注意版本,版本不合适会报版本错误)2.代码: Java代码 import java.io.File; import java.io.Fi ...