[关闭]
@994495jj 2017-06-05T14:36:02.000000Z 字数 5224 阅读 943

hanabi组队训练2

(ACM)贪心 (ACM)构造 (ACM)hanabi组队训练 (ACM)思维 201706



(题目链接)[http://codeforces.com/group/mbTSbPlZPV/contest/101341]


A. Streets of Working Lanterns - 2(贪心,实现)

题意

题解

代码

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<queue>
  4. #include<algorithm>
  5. using namespace std;
  6. const int N=200005;
  7. char s[N];
  8. int n;
  9. int ans[N];
  10. struct Node {
  11. int x,y,i;
  12. }a[N];
  13. bool cmp1(Node a,Node b) {
  14. return a.y<b.y;
  15. }
  16. bool cmp2(Node a,Node b) {
  17. return a.x>b.x;
  18. }
  19. void solve() {
  20. int cnt=0;
  21. ///x-y>=0
  22. sort(a+1,a+1+n,cmp1);
  23. int p=1,k=0;
  24. priority_queue<pair<int,int> > q;
  25. for(;;) {
  26. while(p<=n&&a[p].y<=k) {
  27. q.push(make_pair(a[p].x-a[p].y,a[p].i));
  28. ++p;
  29. }
  30. if(q.empty()||q.top().first<0) break;
  31. k=k+q.top().first;
  32. ans[++cnt]=q.top().second;
  33. q.pop();
  34. }
  35. ///x-y<0
  36. sort(a+1,a+1+n,cmp2);
  37. for(int i=1;i<=n;++i) {
  38. if(a[i].x-a[i].y>=0) continue;
  39. if(k>=a[i].y) {
  40. k=k+a[i].x-a[i].y;
  41. ans[++cnt]=a[i].i;
  42. } else {
  43. puts("NO");
  44. return ;
  45. }
  46. }
  47. ///print
  48. if(cnt!=n||k) {
  49. puts("NO");
  50. return ;
  51. }
  52. puts("YES");
  53. for(int i=1;i<=n;++i) printf("%d ",ans[i]);
  54. puts("");
  55. }
  56. int main() {
  57. while(~scanf("%d",&n)) {
  58. ///read
  59. for(int i=1;i<=n;++i) {
  60. scanf("%s",s);
  61. a[i].i=i;
  62. int len=strlen(s);
  63. for(int j=0;j<len;++j) {
  64. if(s[j]=='(') {
  65. ++a[i].x;
  66. } else {
  67. if(a[i].x) --a[i].x;
  68. else ++a[i].y;
  69. }
  70. }
  71. }
  72. ///solve
  73. solve();
  74. }
  75. return 0;
  76. }

F. Circuits(交互题,构造)

题意

题解

真实\询问 ++ +- -+ --
++ 1 0 0 0
+- 0 0 1 1
-+ 0 1 0 1
-- 1 1 1 1

代码

  1. #include<cstdio>
  2. #include<iostream>
  3. using namespace std;
  4. const int N=5005;
  5. int sta[N],ans[N];
  6. int main() {
  7. int n;
  8. while(~scanf("%d",&n)) {
  9. int p=1;sta[p]=1;
  10. for(int i=2;i<=n;++i) {
  11. if(p==0) {
  12. sta[++p]=i;
  13. continue;
  14. }
  15. printf("? %d %d\n",sta[p],i);
  16. cout.flush();
  17. char a,b;scanf(" %c %c",&a,&b);
  18. if(a=='+'&&b=='+') sta[++p]=i;
  19. else --p;
  20. }
  21. int x=sta[1];
  22. p=0;
  23. for(int i=1;i<=n;++i) {
  24. if(i==x) {
  25. ans[++p]=i;
  26. continue;
  27. }
  28. printf("? %d %d\n",x,i);
  29. cout.flush();
  30. char a,b;scanf(" %c %c",&a,&b);
  31. if(a=='+') ans[++p]=i;
  32. }
  33. printf("! %d",p);
  34. for(int i=1;i<=p;++i) printf(" %d",ans[i]);
  35. puts("");
  36. cout.flush();
  37. }
  38. return 0;
  39. }

I. Matrix God(思维)

题意

题解

代码

  1. #include<cstdio>
  2. typedef long long ll;
  3. const int N=1005;
  4. const ll mod=(1e9+7);
  5. int n;
  6. ll a[N][N],b[N][N],c[N][N];
  7. ll d[N],e[N];
  8. void solve() {
  9. for(int i=1;i<=n;++i) d[i]=i;
  10. for(int i=1;i<=n;++i) {
  11. e[i]=0;
  12. for(int j=1;j<=n;++j) {
  13. e[i]=(e[i]+d[j]*a[j][i]%mod)%mod;
  14. }
  15. }
  16. for(int i=1;i<=n;++i) {
  17. d[i]=0;
  18. for(int j=1;j<=n;++j) {
  19. d[i]=(d[i]+e[j]*b[j][i]%mod)%mod;
  20. }
  21. }
  22. for(int i=1;i<=n;++i) {
  23. e[i]=0;
  24. for(int j=1;j<=n;++j) {
  25. e[i]=(e[i]+j*c[j][i]%mod)%mod;
  26. }
  27. if(d[i]!=e[i]) {
  28. puts("NO");
  29. return ;
  30. }
  31. }
  32. puts("YES");
  33. }
  34. int main() {
  35. while(~scanf("%d",&n)) {
  36. ///read
  37. for(int i=1;i<=n;++i) {
  38. for(int j=1;j<=n;++j) {
  39. scanf("%lld",&a[i][j]);
  40. }
  41. }
  42. for(int i=1;i<=n;++i) {
  43. for(int j=1;j<=n;++j) {
  44. scanf("%lld",&b[i][j]);
  45. }
  46. }
  47. for(int i=1;i<=n;++i) {
  48. for(int j=1;j<=n;++j) {
  49. scanf("%lld",&c[i][j]);
  50. }
  51. }
  52. ///solve
  53. solve();
  54. }
  55. return 0;
  56. }

J. Catch the Monster(实现)

题意

题解

代码

  1. #include<cstdio>
  2. #include<vector>
  3. #include<cstring>
  4. using namespace std;
  5. const int N=200005;
  6. vector<int> G[N];
  7. bool ans;
  8. int deg[N],cnt[N];
  9. void dfs1(int u,int fa) {
  10. cnt[u]=(deg[u]>=3);
  11. int sz=G[u].size();
  12. for(int i=0;i<sz;++i) {
  13. int v=G[u][i];
  14. if(v==fa) continue;
  15. dfs1(v,u);
  16. cnt[u]+=cnt[v];
  17. }
  18. }
  19. void dfs2(int u,int fa) {
  20. if(!ans) return ;
  21. int res=(bool)(cnt[1]-cnt[u]);
  22. int sz=G[u].size();
  23. for(int i=0;i<sz;++i) {
  24. int v=G[u][i];
  25. if(v==fa) continue;
  26. dfs2(v,u);
  27. if(cnt[v]) ++res;
  28. }
  29. if(res>2) {
  30. ans=0;
  31. return ;
  32. }
  33. }
  34. int main() {
  35. int n;
  36. while(~scanf("%d",&n)) {
  37. ///init
  38. memset(deg,0,sizeof(deg));
  39. memset(cnt,0,sizeof(cnt));
  40. for(int i=1;i<=n;++i) G[i].clear();
  41. ///read
  42. for(int i=1;i<n;++i) {
  43. int u,v;scanf("%d%d",&u,&v);
  44. ++deg[u];++deg[v];
  45. G[u].push_back(v);
  46. G[v].push_back(u);
  47. }
  48. ///solve
  49. dfs1(1,1);
  50. ans=1;
  51. dfs2(1,1);
  52. ///print
  53. if(ans) puts("YES");
  54. else puts("NO");
  55. }
  56. return 0;
  57. }

K. Competitions(实现,dp)

题意

题解

代码

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. using namespace std;
  5. typedef long long ll;
  6. const int N=200005;
  7. struct Node {
  8. int l,r,i;
  9. ll c;
  10. bool operator < (const Node &tmp) const {
  11. return r<tmp.r;
  12. }
  13. }a[N];
  14. struct D {
  15. ll c,len;
  16. bool operator < (const D &tmp) const {
  17. if(c==tmp.c) return len>tmp.len;
  18. return c<tmp.c;
  19. }
  20. }d[N<<1];
  21. int X[N<<1],now[N<<1],pre[N<<1],res[N];
  22. int main() {
  23. int n;
  24. while(~scanf("%d",&n)) {
  25. ///init
  26. for(int i=0;i<=2*n;++i) d[i].c=d[i].len=0;
  27. memset(now,-1,sizeof(now));
  28. memset(pre,-1,sizeof(pre));
  29. ///read
  30. int cntx=0;
  31. for(int i=1;i<=n;++i) {
  32. int l,r;ll c;
  33. scanf("%d%d%lld",&l,&r,&c);
  34. a[i].l=l;a[i].r=r;
  35. a[i].c=c;a[i].i=i;
  36. X[++cntx]=l;X[++cntx]=r;
  37. }
  38. ///get X
  39. sort(X+1,X+1+cntx);
  40. cntx=unique(X+1,X+1+cntx)-X;
  41. ///solve
  42. sort(a+1,a+1+n);
  43. int ans = 0;
  44. for(int i=1,p=1;p<=n;++p) {
  45. int L=lower_bound(X+1,X+1+cntx,a[p].l)-X;
  46. int R=lower_bound(X+1,X+1+cntx,a[p].r)-X;
  47. for(;i<=cntx&&i<=R;++i) {
  48. d[i]=max(d[i],d[i-1]);
  49. if(d[i].c==d[i-1].c&&d[i].len==d[i-1].len) {
  50. now[i]=now[i-1];
  51. pre[i]=pre[i-1];
  52. }
  53. }
  54. D t = D{d[L].c+a[p].c,d[L].len+a[p].r-a[p].l};
  55. d[R]=max(t,d[R]);
  56. if(d[R].c==t.c&&d[R].len==t.len) {
  57. now[R]=a[p].i;
  58. pre[R]=L;
  59. }
  60. if(d[ans]<d[R]) ans=R;
  61. }
  62. ///print
  63. int cnt=0;
  64. for(int i=ans;i!=-1&&now[i]!=-1;i=pre[i]) {
  65. res[++cnt]=now[i];
  66. }
  67. printf("%d ",cnt);
  68. printf("%lld %lld\n",d[ans].c,d[ans].len);
  69. sort(res+1,res+1+cnt);
  70. for(int i=1;i<=cnt;++i) printf("%d ",res[i]);
  71. puts("");
  72. }
  73. return 0;
  74. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注