查看: 1386|回復: 0
打印 上一主題 下一主題

[GCJ] 2013 2 A - Ticket Swapping

[複製鏈接]
  • TA的每日心情
    開心
    2015-4-12 10:09
  • 簽到天數: 137 天

    [LV.7]常住居民III

    142

    主題

    686

    帖子

    3559

    積分

    邁向天堂

    蘇多門

    Rank: 8Rank: 8

    積分
    3559

    新手達陣台南一中資訊社程式設計達人 - 2014

    跳轉到指定樓層
    樓主
    發表於 2014-5-23 23:16:34 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

    趕快加入我們來參與討論吧!

    您需要 登錄 才可以下載或查看,沒有帳號?加入我們

    x
    題目(懶得翻譯了): https://code.google.com/codejam/contest/2442487/dashboard#s=p0

    這題基本上,是哪一個人的進出已經不重要,你可以把每個進出分開思考。
    用括號表示,括號代表進出的順序,範例測資可轉換成:
    1. ()()
    2. ()()
    3. (())
    之所以解成括號,就表示這題是其實是個類似括號匹配問題,用stack可解決。
    我自己花了一段時間有想出這題是括號匹配問題,不過沒有嚴謹的證明,大概可以簡單說明:

    用三角形代表每段價錢,看得懂就看吧

    AC CODE:
    (寫出一個蠢bug,34行m*2寫成n)
    #include<bits/stdc++.h>
  • #define MOD 1000002013
  • using namespace std;
  • struct item{
  •     long long count;
  •     long long pos;
  •     char lr;
  •     bool operator<(item b)const
  •     {
  •         if(this->pos!=b.pos)
  •             return this->pos<b.pos;
  •         else
  •             return this->lr<b.lr;
  •     }
  •     item(long long count,long long pos,char lr)
  •     {
  •         this->count=count;
  •         this->pos=pos;
  •         this->lr=lr;
  •     }
  •     item(){}
  • };
  • int n,m;
  • item data[2010];
  • long long cal(long long o,long long e,long long p)
  • {
  •     long long l=e-o;
  •     return (((n+n-l+1)*l/2)%MOD) * p %MOD;
  • }
  • long long solve()
  • {
  •     stack<item> stk;
  •     long long ans=0;
  •     for(int i=0;i<m*2;i++)
  •     {
  •         if(data[i].lr=='(')
  •         {
  •             stk.push(data[i]);
  •         }
  •         else
  •         {
  •             long long left=data[i].count;
  •             while(left!=0)
  •             {
  •                 long long change=min(left,stk.top().count);
  •                 ans+=cal(stk.top().pos,data[i].pos,change);
  •                 ans%=MOD;
  •                 stk.top().count-=change;
  •                 left-=change;
  •                 if(stk.top().count==0)
  •                     stk.pop();
  •             }
  •         }
  •     }
  •     return ans;
  • }
  • int main()
  • {
  •     int T;
  •     cin>>T;
  •     for(int no=1;no<=T;no++)
  •     {
  •         memset(data,0,sizeof data);
  •         cin>>n>>m;
  •         long long origin=0,swapped=0;
  •         for(int i=0;i<m;i++)
  •         {
  •             long long o,e,p;
  •             cin>>o>>e>>p;
  •             origin+=cal(o,e,p);
  •             origin%=MOD;
  •             
  •             data[i*2]=item(p,o,'(');
  •             data[i*2+1]=item(p,e,')');
  •         }
  •         sort(data,data+m*2);
  •         swapped=solve();
  •         printf("Case #%d: %lld\n",no,(origin-swapped+MOD)%MOD);
  •     }
  • }
  • 評分

    參與人數 1金幣 +4 收起 理由
    Sylveon + 4 Great

    查看全部評分

    蘇多門 domen111
    My Web: https://sites.google.com/site/domenprg/
    回復

    使用道具 檢舉

    您需要登錄後才可以回帖 登入 | 加入我們

    本版積分規則

    快速回覆 返回頂部 返回列表