1. 程式人生 > >2016ACM/ICPC亞洲區沈陽站

2016ACM/ICPC亞洲區沈陽站

urn pre rst long pen 是個 *** pan 傾斜

emm,a出3題,補了兩題

A,B水題

技術分享
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define read(a) scanf("%d",&a)
#define rread(a,b) scanf("%d%d",&a,&b)
#define pii pair<int,int>
#define C 0.5772156649
#define pi acos(-1.0)
#define
ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 using namespace std; const double g=10.0,eps=1e-7; const int N=200000+10,maxn=60000+10,inf=0x3f3f3f3f; int main() { int n; read(n); for(int i=0;i<n;i++) { int a,b; rread(a,b); printf(
"%d\n",2*max(a,b)+min(a,b)); } return 0; } /******************** ********************/
A 技術分享
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define read(a) scanf("%d",&a)
#define rread(a,b) scanf("%d%d",&a,&b)
#define
pii pair<int,int> #define C 0.5772156649 #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 using namespace std; const double g=10.0,eps=1e-7; const int N=200+10,maxn=60000+10,inf=0x3f3f3f3f; char s[N]; int main() { int n; read(n); for(int i=0;i<n;i++) { int a,b; scanf("%s",&s); int len=strlen(s),ans=0; for(int i=0;i<len;i++) { if(s[i]==H)ans++; else if(s[i]==C)ans+=12; else ans+=16; } printf("%d\n",ans); } return 0; } /******************** ********************/
B

C:遞推,首先想到矩陣快速冪,構造一個7維的矩陣,分別是ai-1,ai-2,i^4,i^3,i^2,i,1,再轉移下去

技術分享
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define read(a) scanf("%d",&a)
#define rread(a,b) scanf("%d%d",&a,&b)
#define pii pair<int,int>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 2147493647
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1

using namespace std;

const double g=10.0,eps=1e-7;
const int N=10+10,maxn=60000+10,inf=0x3f3f3f3f;

struct Node{
    int len;
    ll a[N][N];
};
Node mul(Node x,Node y)
{
    Node ans;
    memset(ans.a,0,sizeof ans.a);
    ans.len=x.len;
    for(int i=0;i<x.len;i++)
    {
        for(int j=0;j<x.len;j++)
        {
            for(int k=0;k<y.len;k++)
            {
                ans.a[i][k]=(ans.a[i][k]+x.a[i][j]*y.a[j][k]%mod)%mod;
            }
        }
    }
    return ans;
}
Node quick_mul(Node x,ll n)
{
    Node ans;
    memset(ans.a,0,sizeof ans.a);
    ans.len=x.len;
    for(int i=0;i<x.len;i++)ans.a[i][i]=1;
    while(n)
    {
        if(n&1)ans=mul(ans,x);
        x=mul(x,x);
        n/=2;
    }
    return ans;
}
int main()
{
    int t;
    read(t);
    for(int i=0;i<t;i++)
    {
        ll n,x,y;
        scanf("%lld%lld%lld",&n,&x,&y);
        if(n==1)
        {
            printf("%lld\n",x%mod);
            continue;
        }
        if(n==2)
        {
            printf("%lld\n",y%mod);
            continue;
        }
        Node A;
        A.len=7;
        A.a[0][0]=1,A.a[0][1]=2,A.a[0][2]=1,A.a[0][3]=0,A.a[0][4]=0,A.a[0][5]=0,A.a[0][6]=0;
        A.a[1][0]=1,A.a[1][1]=0,A.a[1][2]=0,A.a[1][3]=0,A.a[1][4]=0,A.a[1][5]=0,A.a[1][6]=0;
        A.a[2][0]=0,A.a[2][1]=0,A.a[2][2]=1,A.a[2][3]=4,A.a[2][4]=6,A.a[2][5]=4,A.a[2][6]=1;
        A.a[3][0]=0,A.a[3][1]=0,A.a[3][2]=0,A.a[3][3]=1,A.a[3][4]=3,A.a[3][5]=3,A.a[3][6]=1;
        A.a[4][0]=0,A.a[4][1]=0,A.a[4][2]=0,A.a[4][3]=0,A.a[4][4]=1,A.a[4][5]=2,A.a[4][6]=1;
        A.a[5][0]=0,A.a[5][1]=0,A.a[5][2]=0,A.a[5][3]=0,A.a[5][4]=0,A.a[5][5]=1,A.a[5][6]=1;
        A.a[6][0]=0,A.a[6][1]=0,A.a[6][2]=0,A.a[6][3]=0,A.a[6][4]=0,A.a[6][5]=0,A.a[6][6]=1;
        A=quick_mul(A,n-2);
        ll ans=A.a[0][0]*y%mod;
        ans=(ans+A.a[0][1]*x%mod)%mod;
        ans=(ans+A.a[0][2]*3*3*3*3%mod)%mod;
        ans=(ans+A.a[0][3]*3*3*3%mod)%mod;
        ans=(ans+A.a[0][4]*3*3%mod)%mod;
        ans=(ans+A.a[0][5]*3%mod)%mod;
        ans=(ans+A.a[0][6]%mod)%mod;
        printf("%lld\n",ans);
    }
    return 0;
}
/********************

********************/
C

G是個二分+積分題,由於關系找錯了,導致一直沒過,二分水平面和豎直的夾角,用積分求體積和,不傾斜的體積比較

技術分享
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define read(a) scanf("%d",&a)
#define rread(a,b) scanf("%d%d",&a,&b)
#define pii pair<int,int>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 2147493647
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1

using namespace std;

const double g=10.0,eps=1e-7;
const int N=100000+10,maxn=60000+10,inf=0x3f3f3f3f;

double f(double x)
{
    double y=acos(2*tan(x)-1);
    double a1,a2;
    a1=pi*cos(y)-y*cos(y)+sin(y)-(1.0/3.0)*sin(y)*sin(y)*sin(y);
    y=pi;
    a2=pi*cos(y)-y*cos(y)+sin(y)-(1.0/3.0)*sin(y)*sin(y)*sin(y);
    return (1.0/tan(x))*(a1-a2);
}
double bs(double x)
{
    double l=0,r=pi/4;
    while(r-l>1e-10)
    {
        double m=(l+r)/2;
        if(f(m)>x)r=m;
        else l=m;
    }
    return l;
}
int main()
{
    int t;
    scanf("%d",&t);
    for(int i=0;i<t;i++)
    {
        double d;
        scanf("%lf",&d);
        if(d<1e-6)
        {
            printf("%.5f\n",0.0);
            continue;
        }
        double ans=pi*sqrt(1+(2-d)*(2-d));
        if(d<1)
        {
            double ang=bs(d*pi);
            double p=2*tan(ang),ang1=acos(1-p),v=ang1-(1-p)*sqrt(1-(1-p)*(1-p));
            ans=v/sin(ang);
        }
        printf("%.5f\n",ans);
    }
    return 0;
}
/********************

********************/
G

E,求點為m個的團有多少個,因為沒學過最大團的算法,所以不敢寫,補題的時候發現居然dfs就能過= =,直接暴力dfs找到含m個點的團就退出

技術分享
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define read(a) scanf("%d",&a)
#define rread(a,b) scanf("%d%d",&a,&b)
#define pii pair<int,int>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 2147493647
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1

using namespace std;

const double g=10.0,eps=1e-7;
const int N=100+10,maxn=60000+10,inf=0x3f3f3f3f;

bool ok[N][N];
int contain[N],ans;
int n,m,s;
vector<int>v[N];
void dfs(int u,int a[],int sz)
{
    if(sz==s)
    {
        ans++;
        return ;
    }
    for(int i=0;i<v[u].size();i++)
    {
        bool f=0;
        for(int j=0;j<sz;j++)
        {
            if(!ok[v[u][i]][a[j]])
            {
                f=1;
                break;
            }
        }
        if(!f)
        {
            a[sz++]=v[u][i];
            dfs(v[u][i],a,sz);
            sz--;
        }
    }
}
int main()
{
    int t;
    read(t);
    for(int i=0;i<t;i++)
    {
        rread(n,m);read(s);
        for(int i=1;i<=n;i++)v[i].clear();
        memset(ok,0,sizeof ok);
        while(m--)
        {
            int a,b;
            rread(a,b);
            if(a>b)swap(a,b);
            v[a].pb(b);
            ok[a][b]=ok[b][a]=1;
        }
        ans=0;
        for(int i=1;i<=n;i++)
        {
           // memset(contain,0,sizeof contain);
            contain[0]=i;
            dfs(i,contain,1);
        }
        printf("%d\n",ans);
    }
    return 0;
}
/********************

********************/
E

2016ACM/ICPC亞洲區沈陽站