「雅礼集训 2017 Day2」水箱

我怎么知道这种题目都能构造树形结构。

根据高度构造一棵树,在树上倍增找到最大的小于约束条件高度的隔板,开一个 \(vector\) 记录一下,然后对于每个 \(vector\) 按照高度排序一下,树形 \(dp\) 即可

\(Code\ Below:\)

  1. #include <bits/stdc++.h>
  2. #define pii pair<int,int>
  3. #define mp make_pair
  4. #define F first
  5. #define S second
  6. using namespace std;
  7. const int maxn=200000+10;
  8. int n,m,h[maxn],f[maxn],cnt[maxn],d[maxn],dp[maxn],ch[maxn][2],fa[maxn][18],num;
  9. pii a[maxn];
  10. vector<pii> g[maxn];
  11. inline int read(){
  12. register int x=0,f=1;char ch=getchar();
  13. while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
  14. while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
  15. return (f==1)?x:-x;
  16. }
  17. int find(int x){
  18. return (x==f[x])?x:f[x]=find(f[x]);
  19. }
  20. int main()
  21. {
  22. int T;
  23. scanf("%d",&T);
  24. while(T--){
  25. memset(h,0,sizeof(h));
  26. memset(ch,0,sizeof(ch));
  27. memset(cnt,0,sizeof(cnt));
  28. memset(d,0,sizeof(d));
  29. memset(dp,0,sizeof(dp));
  30. n=read(),m=read();
  31. for(int i=1;i<=n;i++) f[i]=i;
  32. for(int i=1;i<n;i++) h[i]=a[i].F=read(),a[i].S=i;
  33. sort(a+1,a+n);
  34. int x,y,t;num=n;
  35. for(int i=1;i<n;i++){
  36. x=find(a[i].S),y=find(a[i].S+1);
  37. h[++num]=a[i].F;fa[num][0]=0;ch[num][0]=x;ch[num][1]=y;
  38. f[x]=f[y]=f[num]=fa[x][0]=fa[y][0]=num;
  39. }
  40. for(int j=1;j<18;j++)
  41. for(int i=1;i<=num;i++) fa[i][j]=fa[fa[i][j-1]][j-1];
  42. for(int i=1;i<=num;i++) g[i].clear();
  43. for(int i=1;i<=m;i++){
  44. x=read(),y=read(),t=read();
  45. for(int j=17;j>=0;j--)
  46. if(fa[x][j]&&h[fa[x][j]]<=y) x=fa[x][j];
  47. g[x].push_back(mp(y,t));cnt[x]+=(!t);
  48. }
  49. for(int i=1;i<=num;i++) sort(g[i].begin(),g[i].end());
  50. int val;
  51. for(int i=1;i<=num;i++){
  52. dp[i]=val=d[ch[i][0]]+d[ch[i][1]]+cnt[i];
  53. for(int j=0,k;j<g[i].size();j=k){
  54. for(k=j;g[i][k].F==g[i][j].F&&k<g[i].size();k++) val+=(g[i][k].S?1:-1);
  55. dp[i]=max(dp[i],val);
  56. }
  57. d[i]=val;dp[i]=max(dp[i],dp[ch[i][0]]+dp[ch[i][1]]+cnt[i]);
  58. }
  59. printf("%d\n",dp[num]);
  60. }
  61. return 0;
  62. }

「雅礼集训 2017 Day2」棋盘游戏

同 \([JSOI2009]\) 游戏。

这么难的二分图匹配+博弈怎么才蓝呢???

\(Code\ Below:\)

  1. #include <bits/stdc++.h>
  2. #define id(x,y) (((x)-1)*m+(y))
  3. using namespace std;
  4. const int maxn=100000+10;
  5. int n,m,a[110][110],ans[maxn],match[maxn],vis[maxn],tim,sta[maxn],top;
  6. int head[maxn],to[maxn],nxt[maxn],tot;
  7. int nx[4]={0,0,1,-1},ny[4]={1,-1,0,0};
  8. char s[maxn];
  9. inline void add(int x,int y){
  10. to[++tot]=y;
  11. nxt[tot]=head[x];
  12. head[x]=tot;
  13. }
  14. int dfs1(int x){
  15. for(int i=head[x],y;i;i=nxt[i]){
  16. y=to[i];
  17. if(vis[y]==tim) continue;
  18. vis[y]=tim;
  19. if(!match[y]||dfs1(match[y])){
  20. match[y]=x;
  21. return 1;
  22. }
  23. }
  24. return 0;
  25. }
  26. void dfs2(int x){
  27. ans[x]=1;
  28. for(int i=head[x],y;i;i=nxt[i]){
  29. y=to[i];
  30. if(match[y]&&!ans[match[y]]) dfs2(match[y]);
  31. }
  32. }
  33. int main()
  34. {
  35. scanf("%d%d",&n,&m);
  36. for(int i=1;i<=n;i++){
  37. scanf("%s",s+1);
  38. for(int j=1;j<=m;j++)
  39. if(s[j]=='.') a[i][j]=1;
  40. }
  41. int x,y;
  42. for(int i=1;i<=n;i++)
  43. for(int j=1;j<=m;j++)
  44. if(a[i][j])
  45. for(int k=0;k<4;k++){
  46. x=i+nx[k];y=j+ny[k];
  47. if(x<1||x>n||y<1||y>m) continue;
  48. if(a[x][y]) add(id(i,j),id(x,y)+n*m),add(id(x,y)+n*m,id(i,j));
  49. }
  50. for(int i=1;i<=n;i++)
  51. for(int j=1;j<=m;j++)
  52. if(a[i][j]){
  53. tim++;
  54. if(!dfs1(id(i,j))) sta[++top]=id(i,j);
  55. }
  56. if(!top) puts("0");
  57. else {
  58. for(int i=1;i<=top;i++) dfs2(sta[i]);
  59. top=0;
  60. for(int i=1;i<=n;i++)
  61. for(int j=1;j<=m;j++)
  62. if(ans[id(i,j)]) sta[++top]=id(i,j);
  63. printf("%d\n",top);
  64. for(int i=1;i<=top;i++) printf("%d %d\n",(sta[i]-1)/m+1,(sta[i]-1)%m+1);
  65. }
  66. return 0;
  67. }

「雅礼集训 2017 Day2」线段游戏

李超线段树模板题。

\(Code\ Below:\)

  1. #include <bits/stdc++.h>
  2. #define lson (rt<<1)
  3. #define rson (rt<<1|1)
  4. using namespace std;
  5. const int maxn=1000000+10;
  6. const int lim=1000000;
  7. const double inf=1e8;
  8. int n,m,now[maxn<<3],cnt;
  9. double k[maxn<<3],b[maxn<<3];
  10. inline int read(){
  11. register int x=0,f=1;char ch=getchar();
  12. while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
  13. while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
  14. return (f==1)?x:-x;
  15. }
  16. double f(int now,int x){
  17. if(!now) return -inf;
  18. return k[now]*x+b[now];
  19. }
  20. void modify(int l,int r,int x,int rt){
  21. int mid=(l+r)>>1;
  22. if(f(now[rt],mid)<f(x,mid)) swap(now[rt],x);
  23. if(l == r) return ;
  24. if(k[now[rt]]>k[x]) modify(l,mid,x,lson);
  25. else modify(mid+1,r,x,rson);
  26. }
  27. void update(int L,int R,int x,int l,int r,int rt){
  28. if(L <= l && r <= R){
  29. modify(l,r,x,rt);
  30. return ;
  31. }
  32. int mid=(l+r)>>1;
  33. if(L <= mid) update(L,R,x,l,mid,lson);
  34. if(R > mid) update(L,R,x,mid+1,r,rson);
  35. }
  36. double query(int x,int l,int r,int rt){
  37. if(l == r) return f(now[rt],x);
  38. int mid=(l+r)>>1;
  39. if(x <= mid) return max(f(now[rt],x),query(x,l,mid,lson));
  40. return max(f(now[rt],x),query(x,mid+1,r,rson));
  41. }
  42. int main()
  43. {
  44. n=read(),m=read();
  45. int op,x0,x1,y1,x2,y2;double ans;
  46. for(int i=1;i<=n;i++){
  47. x1=read(),y1=read(),x2=read(),y2=read();
  48. if(y1>y2) swap(y1,y2),swap(x1,x2);
  49. k[++cnt]=(x1==x2)?0:1.0*(y2-y1)/(x2-x1);
  50. b[cnt]=y2-k[cnt]*x2;
  51. if(x1>x2) swap(x1,x2);
  52. if(x1<=lim&&x2>=1) update(max(1,x1),min(lim,x2),cnt,1,lim,1);
  53. }
  54. for(int i=1;i<=m;i++){
  55. op=read();
  56. if(op==0){
  57. x1=read(),y1=read(),x2=read(),y2=read();
  58. if(y1>y2) swap(y1,y2),swap(x1,x2);
  59. k[++cnt]=(x1==x2)?0:1.0*(y2-y1)/(x2-x1);
  60. b[cnt]=(double)y2-k[cnt]*x2;
  61. if(x1>x2) swap(x1,x2);
  62. if(x1<=lim&&x2>=1) update(max(1,x1),min(lim,x2),cnt,1,lim,1);
  63. }
  64. else {
  65. x0=read();
  66. ans=query(x0,1,lim,1);
  67. if(ans==-inf) puts("0");
  68. else printf("%.2lf\n",ans);
  69. }
  70. }
  71. return 0;
  72. }

「雅礼集训 2017 Day2」解题报告的更多相关文章

  1. 「雅礼集训 2017 Day1」 解题报告

    「雅礼集训 2017 Day1」市场 挺神仙的一题.涉及区间加.区间除.区间最小值和区间和.虽然标算就是暴力,但是复杂度是有保证的. 我们知道如果线段树上的一个结点,\(max=min\) 或者 \( ...

  2. #6034. 「雅礼集训 2017 Day2」线段游戏 李超树

    #6034. 「雅礼集训 2017 Day2」线段游戏 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统 ...

  3. 【loj6034】「雅礼集训 2017 Day2」线段游戏

    #6034. 「雅礼集训 2017 Day2」线段游戏 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:Special Judge 上传者: 匿名 题目描述 ...

  4. loj#6033. 「雅礼集训 2017 Day2」棋盘游戏(二分图博弈)

    题意 链接 Sol 第一次做在二分图上博弈的题..感觉思路真是清奇.. 首先将图黑白染色. 对于某个点,若它一定在最大匹配上,那么Bob必胜.因为Bob可以一直沿着匹配边都,Alice只能走非匹配边. ...

  5. loj#6032. 「雅礼集训 2017 Day2」水箱(并查集 贪心 扫描线)

    题意 链接 Sol 神仙题+神仙做法%%%%%%%% 我再来复述一遍.. 首先按照\(y\)坐标排序,然后维护一个扫描线从低处往高处考虑. 一个连通块的内状态使用两个变量即可维护\(ans\)表示联通 ...

  6. [LOJ#6033]. 「雅礼集训 2017 Day2」棋盘游戏[二分图博弈、匈牙利算法]

    题意 题目链接 分析 二分图博弈经典模型,首先将棋盘二分图染色. 考虑在某个最大匹配中: 如果存在完美匹配则先手必败,因为先手选定的任何一个起点都在完美匹配中,而后手则只需要走这个点的匹配点,然后先手 ...

  7. LOJ#6032. 「雅礼集训 2017 Day2」水箱

    传送门 首先可以有一个平方复杂度的 \(DP\) 设 \(f_{i,j}\) 表示前面 \(i\) 个小格,高度为 \(j\) 的最大答案 令 \(h_i\) 表示隔板 \(i\) 的高度 当 \(j ...

  8. 「雅礼集训 2017 Day2」水箱

    题目链接 题意分析 我们用\(f[i][j]\)表示当前到达第\(i\)个位置水位高度为\(j\)的答案 如果那么\(h[i]\)为\(i\)和\(i+1\)之间的支柱高度 那么如果\(j≤h[i]\ ...

  9. loj #6032. 「雅礼集训 2017 Day2」水箱 线段树优化DP转移

    $ \color{#0066ff}{ 题目描述 }$ 给出一个长度为 \(n\) 宽度为 \(1\) ,高度无限的水箱,有 \(n-1\) 个挡板将其分为 \(n\) 个 \(1 - 1\) 的小格, ...

随机推荐

  1. Gym-100883F、Gym-101095B状态压缩小结

    状态压缩的核心思想就是将数压缩成二进制,用二进制位来表示对应的位能取或者不能取,相比起来很方便. Eg:Gym-100883F 题意:给你两个字符串,要求你将两个字符串合起来,并不改变原先的顺序,一共 ...

  2. 796. Rotate String

    class Solution { public: bool rotateString(string A, string B) { if(A.length()==B.length()&& ...

  3. 2018.12.17 bzoj3667: Rabin-Miller算法(Pollard-rho)

    传送门 Pollard−rhoPollard-rhoPollard−rho板题. 题意简述:给出几个数,让你判断是不是质数,如果不是质数就求出其最大质因子,数的大小为1e181e181e18以内. 先 ...

  4. hdu-1036(格式题+精确度)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1036 心得:注意,要进行四舍五入的精确可以用+0.5实现. #include<iostream& ...

  5. div配景图片全div显示

    <div class="face-boy" style="width:86px;height:92px;background: url('/${userProfil ...

  6. css 兼容ie8 rgba()用法

    今天遇到了一个问题,要在一个页面中设置一个半透明的白色div.这个貌似不是难题,只需要给这个div设置如下的属性即可: background: rgba(255,255,255,.1); 但是要兼容到 ...

  7. JavaScript常用定义和方法

    1.字符串一些常用方法,注意,调用这些方法本身不会改变原有字符串的内容,而是返回一个新字符串.toUpperCase()把一个字符串全部变为大写: var s = 'Hello'; s.toUpper ...

  8. javascript 经典问题汇总

    1. ["1","2","3"].map(parseInt) 为多少?答:[1,NaN,NaN]array.map(function(cur ...

  9. asp.net 多线程

    //开启一条线程并执行一个方法      Thread oThread = new Thread(new ThreadStart(IIMsSqlToSqlitle2));            oTh ...

  10. HBase thrift2 TIOError

    如果HBase thrift2报:"TIOError exception: Default TException", 这个可能是因为操作的表不存在,不一定是网络或磁盘操作异常. H ...