The 2015 "Orz Panda" Cup Programming Contest

The 2015 "Orz Panda" Cup Programming Contest

集训后的第一次比较正式的组队赛,这次比之前的pk赛和省赛要好多了,之前真是一片狼藉,惨不忍睹啊。。

比赛一开始,onlyAzha就发现了K题这个签到题,马上上去敲了,很快1A。接着是我的E题,矩阵快速幂,uva的原题,也很快就过了。看了一下榜,我们队两题遥遥领先,其他队还没出题。接着是onehxrn的H题,以为是个水题,交上去WA,然后我去调了一下也没过,于是我们决定先过J题,J题是判断点在三角形里,按onehxrn的思路叉积判断一下就行了,交上去WA了一次,队友帮调了一下,很快过了,这时我们队已经三题了,其他队最多才1题。然后是onehxrn在调H题,我和onlyAzha看别的题,我先看的B题,想了一下,没找到规律。onehxrn发现H题意看错了,onlyAzha也发现了F水题,很快我们过了F,刷了一下榜,我们队4题,还是rank1,但是很多队都过了G,于是我们决定开G题,开G题之前效率很高,每个人一题,很快就过了四题,到了G题真是一片混乱啊。。反而是开G题的过程中onehxrn居然过了H。。然后三个人一起写G题,G题是个dp,三个人调两份代码,WA了很多次之后给onlyAzha的代码随便加了排序,交上去居然过了。。。剩下一个 小时,三个人调C题调到比赛结束。结果还不错,6题rank1,比上一级的队多一题。

K题:签到题,很多人直接o(n^2)过,其实记录下次数可以o(n)。

#include<bits/stdc++.h>

using namespace std;

const int maxn=1000100;

char s[maxn];
int len;
int cnt[maxn];

int main()
{
    while(~scanf("%s",s)){
        len=strlen(s);
        memset(cnt,0,sizeof(cnt));
        for(int i=0;i<len;i++) cnt[s[i]]++;
        int snd=-1,pos1=0;;
        for(int i=0;i<len;i++){
            cnt[s[i]]--;
            for(int j='9';j>s[i];j--){
                if(cnt[j]){
                    //cout<<i<<" "<<j-'0'<<endl;
                    pos1=i;
                    snd=j;break;
                }
            }
            if(~snd) break;
        }
        if(snd!=-1){
            int pos2=0;
            for(int i=len-1;i>=0;i--){
                if(s[i]==snd){
                    pos2=i;break;
                }
            }
            swap(s[pos1],s[pos2]);
        }
        printf("%s\n",s);
    }
    return 0;
}
View Code

E题:先找递推式,然后矩阵快速幂。

#include<bits/stdc++.h>
#define REP(i,a,b) for(int i=a;i<=b;i++)
#define MS0(a) memset(a,0,sizeof(a))
 
using namespace std;
 
typedef long long ll;
const int maxn=1000100;
const ll mod=1000000007;
 
struct Matrix
{
    ll a[2][2];
    friend Matrix operator*(Matrix A,Matrix B)
    {
        Matrix C={0,0,0,0};
        REP(i,0,1){
            REP(j,0,1){
                REP(k,0,1)
                    C.a[i][j]=(C.a[i][j]%mod+(A.a[i][k]*B.a[k][j])%mod+mod)%mod;
            }
        }
        return C;
    }
};
ll p,q;
ll n;
 
Matrix qpow(Matrix n,ll k)
{
    Matrix res={1,0,0,1};
    while(k){
        if(k&1) res=res*n;
        n=n*n;
        k>>=1;
    }
    return res;
}
 
int main()
{
    //freopen("in.txt","r",stdin);
    while(cin>>p>>q>>n){
        if(n==0) cout<<2<<endl;
        else{
            Matrix tmp={p,-q,1,0};
            tmp=qpow(tmp,n-1);
            cout<<((tmp.a[0][0]*p+mod)%mod+(tmp.a[0][1]*2)%mod)%mod<<endl;
        }
    }
    return 0;
}
View Code

 J题:简单的叉积,就不写了。

F题:二分水题,也不写了。

G,H,A,C这些必须补。

今天先补A,线段树离线操作。

posted @ 2015-08-26 08:05  __560  阅读(370)  评论(0编辑  收藏  举报