1006 Football Games

这道题输入也很阴险!!!

这道题过题姿势最优雅的,不是if else if else if。那样很容易wa的。

如果没有平手选项, 赢得加一分的话, 可以用Landau's Theorem(兰道定理)判定。 稍微修改一下这个定理就能做了。

假设S1,S2……Sn是他们的得分序列,从小到排个序。那么这个序列要是合法。那么当且仅当

  • S1+S2+……+Sn = n(n-1)
  • S1+S2+……+Si >= i(i-1)  ( 1 <= i < n)

其实第二条也可以理解成,第i大的得分,不可能多于2(i-1),因为你最多把剩下的队伍全部赢一边。

 #include <cstdio>
 #include <algorithm>
 using namespace std;
  + ;
 int T, n;
 int a[maxn];
 void solve()
 {
     scanf("%d", &n);
     ; i <= n; i++)
     {
         scanf("%d", &a[i]);
     }
     sort(a + , a + n + );
     ;

     ; i <= n; i++)
     {
         sum = sum + a[i];
         ))
         {
             printf("F\n");
             return ;
         }
     }
     ))
         printf("F\n");
     else
         printf("T\n");
 }
 int main()
 {
     while(~scanf("%d", &T))
     {
         while(T--)
         {
             solve();
         }
     }
     ;
 }

1007  Friends and Enemies

二分图。每条边理解成一种颜色。则越坏的情况,需要越多的颜色。最坏的情况就是完全二分图。所以就是求完全二分图的边数来作为边界条件。

 #include <cstdio>
 int main()
 {
     long long n, m;
     while(~scanf("%I64d%I64d", &n, &m))
     {
         ) / ;
          * t;
         if(ans > m)    printf("F\n");
         else printf("T\n");
     }
     ;
 }

1008  Function

这是。。n²的做法吧。。 竟然AC了,说明。。数据可能只有一万???

可能是数据太特殊了吧,st表好像都要跑2000ms。

 #include <set>
 #include <queue>
 #include <cstdio>
 #include <vector>
 #include <cstring>
 #include <algorithm>
 using namespace std;
 typedef long long LL;
 #define mem(x,y) memset(x, y, sizeof(x))
 #define lson l,m,rt << 1
 #define rson m+1,r,rt << 1 | 1

 const int INF = 0x3f3f3f3f;
  +  ;
 int ans, a[maxn], net[maxn];

 int main()
 {
     int T, n, m, l, r;
     scanf("%d", &T);
     while(T--)
     {
         scanf("%d", &n);
         ; i <= n; i++)
         {
             scanf("%d", &a[i]);
         }
         mem(net, -);
         ; i <= n; i++)
         {
             ; j <= n; j++)
             {
                 if(a[j] <= a[i])
                 {
                     net[i] = j;
                     break;
                 }
             }
         }
         scanf("%d", &m);
         while(m--)
         {
             scanf("%d%d", &l, &r);
             ans = a[l];
             for(int i = net[l]; i <= r; i = net[i])
             {
                 ) break;
                              }
             printf("%d\n", ans);
         }
     }
     ;
 }

1009  Sparse Graph(补图上求最短路)

标题是稀疏图的意思,它的补图几近为完全图。所以广搜的时候复杂度没有想象的那么高。

这是梦天的做法。。比起刚刚那个好懂多了。。感觉刚刚那个两个set真的还是挺绕的。比较晦涩。

 #include <set>
 #include <list>
 #include <queue>
 #include <cstdio>
 #include <vector>
 #include <cstring>
 #include <algorithm>
 using namespace std;
 #define mem(x,y) memset(x,y,sizeof(x))
 const int INF = 0x3f3f3f3f;
  + ;
 int dis[maxe];
 int T, n, m, u, v, S;

 void show()
 {
     ; i <= n; i++)
     {
         if(i == S) continue;
         if(dis[i] == INF)   printf("-1%c", i == n ? '\n' : ' ');
         else printf("%d%c", dis[i], i == n ? '\n' : ' ');
     }
 }

 int main()
 {
     scanf("%d", &T);
     while (T--)
     {
         mem(dis, -);
         list<int> notvis;
         set<pair<int, int> > edge;

         scanf("%d%d", &n, &m);

         ; i < m; i++)
         {
             scanf("%d%d", &u, &v);
             edge.insert(make_pair(u, v));
             edge.insert(make_pair(v, u));
         }
         scanf("%d", &S);

         ; i <= n; i++)
         {
             if (i != S) notvis.push_back(i);
         }

         queue<int> que;
         que.push(S);
         dis[S] = ;
         while (!que.empty())
         {
             int cur = que.front();
             que.pop();

             for (list<int>::iterator it = notvis.begin(); it != notvis.end();)
             {
                 if (edge.find(make_pair(cur, *it)) == edge.end())
                 {
                     que.push(*it);
                     dis[*it] = dis[cur] + ;
                     it = notvis.erase(it);
                 }
                 else
                 {
                     it++;
                 }
             }
         }
         show();
     }
     ;

1010  Weak Pair(树的dfs序+离散化)

其实就是统计一下a[u]<=K/a[v],线段树维护。深搜解决。因为数据太大要离散化。

第一种线段树的做法。

 #include <set>
 #include <queue>
 #include <cstdio>
 #include <vector>
 #include <cstring>
 #include <algorithm>
 using namespace std;
 typedef long long LL;
 #define mem(x,y) memset(x, y, sizeof(x))
 #define lson l,m,rt << 1
 #define rson m+1,r,rt << 1 | 1

 const int INF = 0x3f3f3f3f;
 ;

 ], head[maxe * ];
 LL k, ans, num[maxe * ], x[maxe * ], sum[(maxe * ) << ];

 struct Edge{int to, next;}edge[maxe];
 void add_edge(int from,int to)
 {
     edge[tot].to = to;
     edge[tot].next = head[from];
     head[from] = tot++;
 }

 ] + sum[rt <<  | ];}
 void build(int l,int r,int rt)
 {
     ; return ;}
     ;
     build(lson);
     build(rson);
     pushup(rt);
 }
 void update(int p,LL add,int l,int r,int rt)
 {
     if(l == r) {sum[rt] += add; return ;}
     ;
     if(p <= m)
         update(p ,add, lson);
     else
         update(p, add, rson);
     pushup(rt);
 }
 LL query_sum(int ll,int rr,int l,int r,int rt)
 {
     if(ll <= l && rr >= r) return sum[rt];
     LL res = ;
     ;
     if(ll <= m)
         res += query_sum(ll, rr, lson);
     if(rr > m)
         res += query_sum(ll, rr, rson);
     return res;
 }
 void init()
 {
     ans = ;
     tot = ;
     mem(head, -);
     mem(deep, );
 }
 void dfs(int u)
 {
     int o = lower_bound(x, x + numm, k / num[u]) - x;
     ans += query_sum(, o, , numm, );
     int kk = lower_bound(x, x + numm, num[u]) - x;
     update(kk, , , numm, );
     for(int i = head[u]; ~i; i = edge[i].next)
     {
         dfs(edge[i].to);
     }
     update(kk, -, , numm, );

 }

 int main()
 {
     scanf("%d", &T);
     while(T--)
     {
         ;
         scanf("%d%I64d", &n, &k);
         ; i <= n; i++)
         {
             scanf("%I64d", &num[i]);
             x[cnt++] = num[i];
             x[cnt++] = k / num[i];
         }
         sort(x, x + cnt);//*****
         numm = unique(x, x + cnt) - x;//*****

         init();

         ; i < n - ; i++)
         {
             int u, v;
             scanf("%d%d", &u, &v);
             add_edge(u, v);
             deep[v]++;
         }
         build(, numm, );
         ; i <= n; i++)
         {
             )
             {
                 dfs(i);
                 break;
             }
         }
         printf("%I64d\n", ans);
     }
     ;
 }

第二种是树状数组的做法:(待补充)

2016 ACM/ICPC Asia Regional Dalian Online(更新到五道题)的更多相关文章

  1. 2016 ACM/ICPC Asia Regional Dalian Online 1002/HDU 5869

    Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K ( ...

  2. 2016 ACM/ICPC Asia Regional Dalian Online 1006 /HDU 5873

    Football Games Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  3. HDU 5874 Friends and Enemies 【构造】 (2016 ACM/ICPC Asia Regional Dalian Online)

    Friends and Enemies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  4. HDU 5875 Function 【倍增】 (2016 ACM/ICPC Asia Regional Dalian Online)

    Function Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  5. HDU 5873 Football Games 【模拟】 (2016 ACM/ICPC Asia Regional Dalian Online)

    Football Games Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  6. HDU 5876 Sparse Graph 【补图最短路 BFS】(2016 ACM/ICPC Asia Regional Dalian Online)

    Sparse Graph Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)To ...

  7. hdu 5868 2016 ACM/ICPC Asia Regional Dalian Online 1001 (burnside引理 polya定理)

    Different Circle Permutation Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 262144/262144 K ...

  8. 2016 ACM/ICPC Asia Regional Dalian Online HDU 5877 Weak Pair treap + dfs序

    Weak Pair Problem Description   You are given a rooted tree of N nodes, labeled from 1 to N. To the  ...

  9. 2016 ACM/ICPC Asia Regional Dalian Online

    1009 Sparse Graph(hdu5876) 由于每条边的权值都为1,所以最短路bfs就够了,只是要求转置图的最短路,所以得用两个set来维护,一个用来存储上次扩散还没访问的点,一个用来存储这 ...

随机推荐

  1. BZOJ3172: [Tjoi2013]单词

    传送门 做了这么多题怎么还是无法很好的理解AC自动机呢..果然是个制杖 首先题意表述不是很清晰,这些所有的单词组成了那个文章,所以果断建个AC自动机,建的时候给每个点附加一个权值,建树是经过一次权值即 ...

  2. Brackets前端开发IDE工具

    Brackets是一个开源的前端开发IDE工具,网页设计师和前端开发人员必备的前端开发IDE工具. 它能够使你在开发WEB网站实时预览你的网页,目前版本只适用于Chrome浏览器可以实时预览效果 支持 ...

  3. mysql-5.7日志设置

    环境 Windows10企业版X64 mysql安装目录:D:\mysql-5.7.15-winx64. 在mysql安装目录下手工新建一个log目录:mysql\log. mysql\my.ini内 ...

  4. Windows10环境配置nat123端口映射访问mysql

    背景:因工作需要,在宽带路由器内部设置一个台式机(可上网),配置成数据库服务器.分散各处的多台外网机可以通过jdbc连接该数据库服务器进行开发.要进行端口映射. 环境: 宽带通 Windows10企业 ...

  5. Unslider.js Tiny Sample

    <!-- The HTML --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&g ...

  6. 进入OS前的两步之PendSV(任务切换)

    先了解下如何使用PendSV异常.(为何要使用PendSV而不是其他的异常,请参考<cortex-M3权威指南>) 1,如何设定PendSV优先级? NVIC_SYSPRI14 EQU 0 ...

  7. javascript数据结构与算法--基本排序算法分析

    javascript中的基本排序算法 对计算机中存储的数据执行的两种最常见操作是排序和检索,排序和检索算法对于前端开发尤其重要,对此我会对这两种算法做深入的研究,而不会和书上一样只是会贴代码而已,下面 ...

  8. Android中如何控制元素的显示隐藏?

    在Android程序中,有时需要程序开启时默认隐藏某个控件,当单击某个按钮时才触发显示控件的内容.比如在查询员工资料时,提交查询后再显示查询到的表格内容: Android中控制元素的隐藏参考以下代码. ...

  9. 【piu~】制作一只变形小鸡~

    在http://codepen.io/pick上看到的,,,具体是谁忘了,反正我只截了最萌的一段,作者越改越不萌ಥ_ಥ 谷哥哥随便一搜就有很多好玩的,度娘就...(  ̄ ▽ ̄)o╭╯☆#╰ _─﹏─) ...

  10. PHP流式上传和表单上传(美图秀秀)

    最近需要开发一个头像上传的功能,找了很多都需要授权的,后来找到了美图秀秀,功能非常好用. <?php /** * Note:for octet-stream upload * 这个是流式上传PH ...