[关闭]
@01010101 2018-11-05T21:37:33.000000Z 字数 3004 阅读 1056

noip2017

noip


DAY1T1小凯的疑惑

**结论题**a*b-a-b;

DAY1T2时间复杂度

分的情况有点多的模拟。一定要在草稿纸上把情况分清!!

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;
  5. int T,L,hd;
  6. char s[100],op[100],a[100],b[100],c[100];
  7. typedef pair<char,int> pci;
  8. pci sta[1050];
  9. void Solve(){
  10. int p=0,cnt=0,ans=0;hd=0;int flg=0;
  11. scanf("%d%s",&L,s);
  12. // cout<<L<<endl;
  13. if(s[2]=='n'){
  14. int pos=4,len=strlen(s);
  15. while(pos<=len&&s[pos]>='0'&&s[pos]<='9') p=p*10+s[pos++]-'0';
  16. }
  17. else p=0;
  18. while(L--){
  19. scanf("%s",op);
  20. if(op[0]=='F'){
  21. scanf("%s%s%s",a,b,c);
  22. for(int i=1;i<=hd;++i)
  23. if(sta[i].first==a[0])
  24. flg=1;
  25. if(b[0]!='n'&&c[0]=='n') {
  26. if(!hd||sta[hd].second) {
  27. cnt++;
  28. sta[++hd]=make_pair(a[0],2);
  29. }
  30. else{
  31. sta[++hd]=make_pair(a[0],0);
  32. }
  33. }
  34. else if(b[0]=='n'&&c[0]!='n') {
  35. sta[++hd]=make_pair(a[0],0);
  36. }
  37. else if(b[0]=='n'&&c[0]=='n'){
  38. sta[++hd]=make_pair(a[0],1);
  39. }
  40. else{
  41. int x=0,y=0,pos=0,lb=strlen(b),lc=strlen(c);
  42. while(pos<=lb&&b[pos]>='0'&&b[pos]<='9') x=x*10+b[pos++]-'0';
  43. pos=0;
  44. while(pos<=lc&&c[pos]>='0'&&c[pos]<='9') y=y*10+c[pos++]-'0';
  45. if(x<=y){
  46. if(!hd||sta[hd].second) sta[++hd]=make_pair(a[0],1);
  47. else sta[++hd]=make_pair(a[0],0);
  48. }
  49. else{
  50. sta[++hd]=make_pair(a[0],0);
  51. }
  52. }
  53. }
  54. else{
  55. ans=max(cnt,ans);
  56. if(hd&&sta[hd].second==2) cnt--;
  57. hd--;
  58. }
  59. }
  60. if(hd||flg) {
  61. puts("ERR");
  62. return;
  63. }
  64. if(p==ans) {
  65. puts("Yes");
  66. return;
  67. }
  68. puts("No");
  69. }
  70. int main(){
  71. // freopen("a.txt","r",stdin);
  72. scanf("%d",&T);
  73. while(T--){
  74. Solve();
  75. }
  76. return 0;
  77. }

DAY1T3逛公园

先跑出最短路,然后在用dfs来DP。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <queue>
  5. #define ll long long
  6. using namespace std;
  7. inline int read(){
  8. char ch;int op=1;
  9. while((ch=getchar())<'0'||ch>'9') if(ch=='-') op=-1;
  10. int ret=ch-'0';
  11. while((ch=getchar())>='0'&&ch<='9') ret=ret*10+ch-'0';
  12. return ret*op;
  13. }
  14. const int N=100000+10;
  15. const int D=50+2;
  16. const int INF=0x3f3f3f3f;
  17. int T,n,m,k,kk,flg;
  18. int head[N],vis[N],dis[N],g[N][D];
  19. int ans,P,dp[N][D];
  20. struct edge{
  21. int v,w,nxt;
  22. }e[N<<2];
  23. inline void adde(int u,int v,int w){
  24. e[kk].v=v;
  25. e[kk].w=w;
  26. e[kk].nxt=head[u];
  27. head[u]=kk++;
  28. }
  29. typedef pair<int,int> pii;
  30. priority_queue <pii,vector<pii>,greater<pii> >q;
  31. inline void dijkstra(){
  32. memset(dis,INF,sizeof(dis));
  33. memset(vis,0,sizeof(vis));
  34. dis[1]=0;q.push(make_pair(dis[1],1));
  35. while(!q.empty()){
  36. int u=q.top().second;q.pop();
  37. if(vis[u]) continue;
  38. vis[u]=1;
  39. for(register int i=head[u];i!=-1;i=e[i].nxt){
  40. if((i&1)) continue;
  41. int v=e[i].v;
  42. if(dis[v]>dis[u]+e[i].w){
  43. dis[v]=dis[u]+e[i].w;
  44. q.push(make_pair(dis[v],v));
  45. }
  46. }
  47. }
  48. }
  49. ll dfs(int u,int d){
  50. if(~dp[u][d]) return dp[u][d];
  51. g[u][d]=1;
  52. dp[u][d]=0;
  53. for(register int i=head[u];i!=-1;i=e[i].nxt){
  54. if(i&1){
  55. int v=e[i].v,t=dis[u]+d-e[i].w-dis[v];
  56. if(t<0) continue;
  57. if(g[v][t]) flg=1;
  58. dp[u][d]=(dp[u][d]+dfs(v,t))%P;
  59. }
  60. }
  61. g[u][d]=0;
  62. return dp[u][d];
  63. }
  64. int main(){
  65. // freopen("a.txt","r",stdin);
  66. T=read();
  67. while(T--){
  68. memset(head,-1,sizeof(head));
  69. memset(dp,-1,sizeof(dp));
  70. kk=0;flg=0;ans=0;
  71. n=read();m=read();k=read();P=read();
  72. for(register int i=1,a,b,c;i<=m;++i){
  73. a=read();b=read();c=read();
  74. adde(a,b,c);adde(b,a,c);
  75. }
  76. dijkstra();
  77. dp[1][0]=1;
  78. for(register int i=0;i<=k;++i)
  79. ans=(ans+dfs(n,i))%P;
  80. dfs(n,k+1);//-1
  81. if(flg) puts("-1");
  82. else printf("%d\n",ans);
  83. }
  84. return 0;
  85. }

DAY2T1奶酪

模拟直接维护小鼠能到的空洞即可。

DAY2T2宝藏

树上的状压,好题强推。

DAY2T3列队

主席树的思想:动态开点线段树。不过确实不是特别好实现。

数学,结论题
模拟
最短路+dp
模拟
树上状压dp
主席树/动态开点线段树

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注