传送门

\(A\)

咕咕咕

  1. //quming
  2. #include<bits/stdc++.h>
  3. #define R register
  4. #define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
  5. #define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
  6. #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
  7. template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
  8. template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
  9. using namespace std;
  10. const int N=15;
  11. char mp[N][N];int vis[N][N],n,m;
  12. bool dfs(int x,int y){
  13. vis[x][y]=1;
  14. if(x==n&&y==m)return true;
  15. R int c=0;
  16. if(x<n&&mp[x+1][y]=='#')++c;
  17. if(y<m&&mp[x][y+1]=='#')++c;
  18. if(c!=1)return false;
  19. if(x<n&&mp[x+1][y]=='#')return dfs(x+1,y);
  20. if(y<m&&mp[x][y+1]=='#')return dfs(x,y+1);
  21. }
  22. int main(){
  23. scanf("%d%d",&n,&m);
  24. fp(i,1,n)scanf("%s",mp[i]+1);
  25. if(mp[1][1]!='#'||mp[n][m]!='#')return puts("Impossible"),0;
  26. if(!dfs(1,1))return puts("Impossible"),0;
  27. fp(i,1,n)fp(j,1,m)if((mp[i][j]=='#')!=vis[i][j])return puts("Impossible"),0;
  28. return puts("Possible"),0;
  29. }

\(B\)

先把\(a\)和\(b\)分别设成\(1\)到\(n\)来满足第一第二个条件

我们发现,如果把\(a_i\)到\(a_n\)全部加上\(x\),且\(b_1\)到\(b_i\)全部加上\(x\),可以使\(a_i+b_i\)相对增加\(x\)且仍满足第一第二个条件

那么我们令\(p_i\)相对增加\(i\)即可满足第三个条件,最大的数是\(O(n^2)\)级别的,不会超过\(10^9\)

  1. const int N=1e5+5;
  2. int a[N],b[N],p[N],n;
  3. int main(){
  4. scanf("%d",&n);
  5. fp(i,1,n)scanf("%d",&p[i]),a[p[i]]+=i,b[p[i]]+=i;
  6. fp(i,1,n)a[i]+=a[i-1];fd(i,n,1)b[i]+=b[i+1];
  7. fp(i,1,n)printf("%d%c",a[i]+i," \n"[i==n]);
  8. fp(i,1,n)printf("%d%c",b[i]+n-i+1," \n"[i==n]);
  9. return 0;
  10. }

\(C\)

完全想不到啊……

首先我们转化为有\(2n+1\)个物品,每次随机删去相邻的两个,求距离的期望和

我们发现一开始时距离是一个等差数列,并且如果维护每两个点间距离的期望,那么一次操作之后仍然是等差数列

具体的证明的话,如果删去的两个点在边界上显然操作之后还是等差,否则如果对于一个长度为\(d+kx\)的段,删去这段的两个顶点之后这一段长度变为\(3d+3kx\),所以令\(d_i\)表示第\(i\)个点和第\(i+1\)个点的期望距离,\(d_i'\)为操作之后的期望距离,那么总共有\(2n\)种删法,所以\(d_i'={i\over 2n}(d_i+2x)+{1\over 2n}(3d_i+3x)+{2n-i-1\over 2n}d_i={2n+2\over 2n}d_i+{2i+3\over 2n}x\),所以\(x'=d_i'-d_{i-1}'={2n+4\over 2x}x={n+2\over n}x\),是一个定值

然后再来考虑新的等差数列的首项,如果删了\(1,2\),首项变为\(d+2x\),如果删了\(2,3\),首项变为\(3x+3d\),否则不变,所以新的首项\(d_1^{'}=\frac{1}{2n}*(d_1+2x)+\frac{1}{2n}*(3d_1+3x)+\frac{2n-2}{2n}*d_1=\frac{(2n+2)d_1+5x}{2n}\)

然后每次计算即可

  1. int n;double d,x,res;
  2. int main(){
  3. scanf("%d%lf%lf",&n,&d,&x);
  4. for(;n;--n){
  5. res+=(d+((n<<1)-1)*x*0.5),
  6. d=(((n<<1)+2)*d+5*x)/(n<<1),
  7. x=(n+2)*x/n;
  8. }
  9. printf("%.12lf\n",res);
  10. return 0;
  11. }

\(D\)

首先我们容易写出一个暴力,设\(f_i\)表示把前\(i\)个数全部处理完的最小时间,则\(f_i=\min_{j<i}(f_j+\max(t,(a_i-a_{j+1})))\)

因为\(\max(t,(a_i-a_{j+1})\)的分界点是随\(i\)递增而不降的,所以我们可以直接把分界点两边的答案分别用\(set\)记录下来然后直接查询就好了

  1. //quming
  2. #include<bits/stdc++.h>
  3. #define R register
  4. #define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
  5. #define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
  6. #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
  7. template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
  8. template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
  9. using namespace std;
  10. typedef long long ll;
  11. const int N=5e5+5;const ll inf=1e18;
  12. int n,t,e,a[N];ll f[N];
  13. inline ll min(R ll x,R ll y){return x<y?x:y;}
  14. inline ll max(R ll x,R ll y){return x>y?x:y;}
  15. struct Queue{
  16. priority_queue<ll,vector<ll>,greater<ll> >A,B;
  17. inline void push(R ll x){A.push(x);}
  18. inline void pop(R ll x){B.push(x);}
  19. inline ll top(){
  20. while(!B.empty()&&A.top()==B.top())A.pop(),B.pop();
  21. return A.empty()?inf:A.top();
  22. }
  23. }s1,s2;
  24. int main(){
  25. scanf("%d%d%d",&n,&e,&t);
  26. fp(i,1,n)scanf("%d",&a[i]);
  27. s2.push(0);
  28. for(R int i=1,j=0;i<=n;++i){
  29. while(j<i&&((a[i]-a[j+1])<<1)>=t)s1.push(f[j]-(a[j+1]<<1)),s2.pop(f[j]),++j;
  30. f[i]=inf,cmin(f[i],s1.top()+(a[i]<<1)),cmin(f[i],s2.top()+t);
  31. s2.push(f[i]);
  32. }
  33. printf("%lld\n",f[n]+e);
  34. return 0;
  35. }

\(E\)

首先肯定要二分答案,且因为每条边只能经过两次,所以进入一颗子树之后必须遍历完其中所有节点才能出来

对于每一个点,记录一个状态\((a,b)\)表示一条合法的路径是花费\(a\)的代价从当前节点走到某个叶子,花费\(b\)的代价从某个叶子走回到当前节点,那么对于左子树的\((a,b)\)和右子树的\((c,d)\),只有当\(b+w_i+c+w_j\leq mid\)的时候它们才能合并成\((a+w_i,d+w_j)\),同理也要判断一下是否能反过来合并成\((c+w_j,b+w_i)\)

每一次把左右儿子的状态进行合并,最后只要\(1\)号点存在合法的状态就说明\(mid\)可行

有一个优化,就是对于一个合法的\(a\)来说,它对应的\(b\)一定是越小越好,那么我们可以对于左子树按第一维排序,右子树按第二位排序,这样合并的复杂度就可以优化到\(O(n)\)了

然而状态数可能会比较多,所以我们每一次用状态数小的去合并状态数大的,这样状态数\(S_u\leq 2\min(S_i,S_j)\),总的状态数是\(O(n\log n)\)的,于是总复杂度为\(O(n\log^2 n)\)

然而比较奇怪的是我如果用状态数大的去合并小的不是\(T\)而是\(WA\)……好迷啊……

  1. //quming
  2. #include<bits/stdc++.h>
  3. #define R register
  4. #define pb push_back
  5. #define fi first
  6. #define se second
  7. #define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
  8. #define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
  9. #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
  10. template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
  11. template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
  12. using namespace std;
  13. typedef pair<int,int> pi;
  14. typedef vector<pi> vc;
  15. const int N=5e5+5;
  16. int ls[N],rs[N],w[N],mn[N],n,l,r,mid,ans;vc f[N];
  17. inline int min(R int x,R int y){return x<y?x:y;}
  18. inline void swap(R int &x,R int &y){R int t=x;x=y,y=t;}
  19. inline bool cmpx(const pi &x,const pi &y){return x.fi<y.fi;}
  20. inline bool cmpy(const pi &x,const pi &y){return x.se<y.se;}
  21. void merge(vc &a,vc &ls,vc &rs){
  22. R int n=ls.size(),m=rs.size();
  23. if(!n||!m)return;
  24. if(n>m)ls.swap(rs),swap(n,m);
  25. sort(ls.begin(),ls.end(),cmpy);
  26. sort(rs.begin(),rs.end(),cmpx);
  27. mn[0]=rs[0].se;fp(i,1,m-1)mn[i]=min(mn[i-1],rs[i].se);
  28. for(R int i=0,j=m-1;i<n;++i){
  29. while(j>=0&&ls[i].se+rs[j].fi>mid)--j;
  30. if(j<0)break;a.pb(pi(ls[i].fi,mn[j]));
  31. }
  32. sort(ls.begin(),ls.end(),cmpx);
  33. sort(rs.begin(),rs.end(),cmpy);
  34. mn[0]=rs[0].fi;fp(i,1,m-1)mn[i]=min(mn[i-1],rs[i].fi);
  35. for(R int i=0,j=m-1;i<n;++i){
  36. while(j>=0&&ls[i].fi+rs[j].se>mid)--j;
  37. if(j<0)break;a.pb(pi(mn[j],ls[i].se));
  38. }
  39. }
  40. void dfs(int u){
  41. f[u].clear();if(!ls[u])return f[u].pb(pi(w[u],w[u])),void();
  42. dfs(ls[u]),dfs(rs[u]);
  43. merge(f[u],f[ls[u]],f[rs[u]]);
  44. for(auto &v:f[u])v.fi+=w[u],v.se+=w[u];
  45. }
  46. int main(){
  47. scanf("%d",&n);
  48. for(R int i=2,fa,x;i<=n;++i){
  49. scanf("%d%d",&fa,&x);
  50. (ls[fa]?rs[fa]:ls[fa])=i,w[i]=x;
  51. }
  52. l=0,r=1e9,ans=1e9;
  53. while(l<=r){
  54. mid=(l+r)>>1,dfs(1);
  55. f[1].empty()?l=mid+1:(ans=mid,r=mid-1);
  56. }
  57. printf("%d\n",ans);
  58. return 0;
  59. }

\(F\)

好迷……

首先我们发现,一个字母往下的轨迹视为一条路径,那么这条路径会是一条折线,且这个折线越早拐弯越好

那么我们对于\(t\)从后往前贪心的匹配,找到\(s\)中最后面的能匹配的位置,然后判断是否会和之前的折线有交点

感觉我还是说不太清楚……建议看一下官方题解的图

  1. //quming
  2. #include<bits/stdc++.h>
  3. #define R register
  4. #define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
  5. #define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
  6. #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
  7. template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
  8. template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
  9. using namespace std;
  10. const int N=1e6+5;
  11. char a[N],b[N];int q[N],h,t,n,res;
  12. int main(){
  13. scanf("%d%s%s",&n,a+1,b+1);
  14. if(!strcmp(a+1,b+1))return puts("0"),0;
  15. h=1,t=0;
  16. for(R int i=n,p=n;i;--i)if(b[i]!=b[i-1]){
  17. cmin(p,i);while(p&&a[p]!=b[i])--p;
  18. if(!p)return puts("-1"),0;
  19. while(h<=t&&q[h]-(t-h+1)>=i)++h;
  20. q[++t]=p;
  21. if(i!=p)cmax(res,t-h+1);
  22. }
  23. printf("%d\n",res+1);
  24. return 0;
  25. }

AtCoder Grand Contest 007题解的更多相关文章

  1. AtCoder Grand Contest 007

    AtCoder Grand Contest 007 A - Shik and Stone 翻译 见洛谷 题解 傻逼玩意 #include<cstdio> int n,m,tot;char ...

  2. AtCoder Grand Contest 007 E:Shik and Travel

    题目传送门:https://agc007.contest.atcoder.jp/tasks/agc007_e 题目翻译 现在有一个二叉树,除了叶子每个结点都有两个儿子.这个二叉树一共有\(m\)个叶子 ...

  3. AtCoder Grand Contest 017 题解

    A - Biscuits 题目: 给出 \(n\) 个物品,每个物品有一个权值. 问有多少种选取方式使得物品权值之和 \(\bmod\space 2\) 为 \(p\). \(n \leq 50\) ...

  4. Atcoder Grand Contest 054 题解

    那天晚上由于毕业晚会与同学吃饭喝酒没打 AGC,第二天稍微补了下题,目前补到了 E,显然 AGC 的 F 对于我来说都是不可做题就没补了(bushi A 简单题,不难发现如果我们通过三次及以上的操作将 ...

  5. AtCoder Grand Contest 030题解

    第一次套刷AtCoder 体验良好 传送门 Poisonous Cookies cout<<b+min(c,a+b+); Tree Burning 难度跨度有点大啊 可以证明当第一次转向之 ...

  6. AtCoder Grand Contest 031题解

    题面 传送门 题解 比赛的之后做完\(AB\)就开始发呆了--简直菜的一笔啊-- \(A - Colorful\ Subsequence\) 如果第\(i\)个字母选,那么它前面任意一个别的字母的选择 ...

  7. AtCoder Grand Contest 039 题解

    传送门 \(A\) 首先只有一串的情况下,遇到相同的肯定是改后面那一个最优,然后两串的话可能要分奇偶讨论一下 //quming #include<bits/stdc++.h> #defin ...

  8. AtCoder Grand Contest 017题解

    传送门 \(A\) 直接转移就是了 typedef long long ll; const int N=55; ll f[N][2];int a[N],n,p; int main(){ scanf(& ...

  9. AtCoder Grand Contest 015题解

    传送门 \(A\) 找到能达到的最大的和最小的,那么中间任意一个都可以被表示出来 typedef long long ll; int n,a,b;ll res; int main(){ scanf(& ...

随机推荐

  1. Spark 系列(一)—— Spark简介

    一.简介 Spark 于 2009 年诞生于加州大学伯克利分校 AMPLab,2013 年被捐赠给 Apache 软件基金会,2014 年 2 月成为 Apache 的顶级项目.相对于 MapRedu ...

  2. Python小爬虫-读取豆瓣电影名称导出csv

    # -*- coding: utf-8 -*- __author__ = 'YongCong Wu' # @Time : 2019/6/20 10:27 # @Email : : 1922878025 ...

  3. 5_PHP数组_3_数组处理函数及其应用_6_数组检索函数

    以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. 数组检索函数 1. array_keys() 函数 程序: <?php $interests[2] = &q ...

  4. Bad state: Stream has already been listened to.

    https://stackoverflow.com/questions/51396769/flutter-bad-state-stream-has-already-been-listened-to T ...

  5. HelloWorld! C++纠错版

    例题:1 #include<iostream> int main() { cout << "HelloWorel!" ; ; } #include < ...

  6. centOS学习part6:安装oracle 11g

    0 大家好.上一章(http://www.cnblogs.com/souvenir/p/3881484.html)我们对oracle在centOS下的安装进行了各项环境准备,本章我们将正式进行oral ...

  7. SVN commit:remains in tree-conflict错误的解决办法

    转自:https://chenjinbo1983.iteye.com/blog/2005123 昨天在提交一个新类包的时候,出错了,重新提交了几次也不行. 错误是:Aborting commit: ‘ ...

  8. 如何在SAP UI5应用里添加使用摄像头拍照的功能

    昨天Jerry的文章 纯JavaScript实现的调用设备摄像头并拍照的功能 介绍了纯JavaScript借助WebRTC API来开发支持调用设备的摄像头拍照的web应用.而我同事遇到的实际情况是, ...

  9. c# 搜索字符串

  10. 常用模块(collections模块,时间模块,random模块,os模块,sys模块,序列化模块,re模块,hashlib模块,configparser模块,logging模块)

    认识模块 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写的 ...