【补】20160816训练记录

T1

表示走i步,第i步结尾是向北的方案数

表示走i步的方案数

那么 

然后高精搞一搞

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int m[2333][2333];
int sx,sy,n,ans;
const int dx[]={1,-1,0};
const int dy[]={0,0,-1};
int px[2333],py[2333],f[2333],g[2333];
void dfs(int x,int y,int tm,int px[],int py[]){
    if(tm==n){
        printf("Found path: ");
        for(int i=1;i<=tm;i++)printf("(%d,%d)",px[i],py[i]);printf("(%d,%d)",x,y);puts("");
        ans++;
    }else
    for(int i=0;i<3;i++){
        int nx=x+dx[i],ny=y+dy[i];
        if(!m[nx][ny]&&(nx!=px[tm]||ny!=py[tm])){
            //printf("(%d,%d)->(%d,%d)\n",x,y,nx,ny);
            m[nx][ny]=1;
            px[tm+1]=x;py[tm+1]=y;
            dfs(nx,ny,tm+1,px,py);
            m[nx][ny]=0;
        }
    }
}
struct Bn{
    int f[2333],len;
};
Bn cheng2(Bn a){
    Bn c;c.len=a.len;
    memset(c.f,0,sizeof(c.f));
    for(int i=1;i<=c.len;i++)c.f[i]=a.f[i]*2;
    for(int i=1;i<=c.len;i++)c.f[i+1]=c.f[i]/10+c.f[i+1],c.f[i]%=10;
    while(c.f[c.len+1]>0){
        c.f[c.len+1]+=c.f[c.len]/10;
        c.f[c.len]%=10;
        ++c.len;
    }
    return c;
}
Bn jia(Bn a,Bn b){
    Bn c;c.len=max(a.len,b.len);
    memset(c.f,0,sizeof(c.f));
    for(int i=1;i<=c.len;i++){
        c.f[i]+=a.f[i]+b.f[i];
        c.f[i+1]=c.f[i]/10;
        c.f[i]%=10;
    }
    while(c.f[c.len+1]>0){
        c.f[c.len+1]+=c.f[c.len]/10;
        c.f[c.len]%=10;
        ++c.len;
    }
    return c;
}
Bn F[101];
void test(){
    F[1].f[1]=3;F[1].len=1;
    F[0].f[1]=1;F[0].len=1;
    for(int i=2;i<=n;i++){
        F[i]=jia(cheng2(F[(i-1)]),F[(i-2)]);
    }
    for(int i=F[n].len;i>=1;i--)cout<<F[n].f[i];puts("");
}

int main(){
    freopen("game.in","r",stdin);
    freopen("game.out","w",stdout);
    scanf("%d",&n);
    //f[1]=3;f[0]=1;
//    for(int i=2;i<=n;i++){
//        f[i]=f[i-1]*2+f[i-2];
//    }
    //printf("%d\n",f[n]);
    //shorter digits

    //Bigenumber
    test();
    return 0;
}

T2

随便建下树就好了

#include<stack>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
char s[350000];
struct edge{
    int to,next;
}e[66666];int cnt,last[33333]; int boolean[33333];
void link(int a,int b){
    //printf("~~~%d %d\n",a,b);
    e[++cnt]=(edge){b,last[a]};last[a]=cnt;
    e[++cnt]=(edge){a,last[b]};last[b]=cnt;
}
void initial(){
    memset(last,0,sizeof(last));
    cnt=0;
}
int L[32003],R[32003],qzh[32003],isl[32003];
bool q(int r,int l){

}
void Cpare(){
    puts("--------------------");
    int n=strlen(s+1),_L=0,_R=0;
    stack<int>st;
    for(int i=1;i<=n;i++){
        if(s[i]==‘(‘){
            st.push(i);
        }
        if(s[i]==‘)‘){
            L[st.top()]=i;
            st.pop();
        }
    }
    for(int i=1;i<=n;i++)cout<<L[i]<<endl;
    for(int i=1;i<=n;i++)qzh[i]=qzh[i-1]+(s[i]==‘(‘||s[i]==‘)‘);
    for(int i=1;i<=n;i++)if(L[i])isl[i]=qzh[L[i]]-qzh[i-1]-2;
    for(int i=1;i<=n;i++)if(L[i])cout<<"~"<<isl[i]<<endl;cout<<endl;
    puts("--------------------");
}//debug
int CaseCnt;
struct data{
    int u,d,fa;
};
int dep[333333];
void bfs(){
    queue<data>q;
    q.push((data){1,dep[1]=1,-1});
    while(!q.empty()){
        data c=q.front();q.pop();
        for(int i=last[c.u];i;i=e[i].next){
            if(e[i].to!=c.fa){
                dep[e[i].to]=dep[c.u]+1;
                q.push((data){
                    e[i].to,c.d+1,c.u});
            }
        }
    }
}
int main(){
    freopen("form.in","r",stdin);
    freopen("form.out","w",stdout);
    while(scanf("%s",s+1)!=EOF){
        initial();
        if(strlen(s+1)==2&&s[1]==‘(‘&&s[2]==‘)‘)return 0;

        int n=strlen(s+1);
        s[0]=‘R‘;
        stack<char>st,st2;
        //Cpare();
        int _n=0;
        memset(boolean,-1,sizeof(boolean));
        for(int i=1;i<=n;i++){
            if(s[i]==‘(‘ ){
                if(!st.empty()){
                    link(st.top(),_n+1);
                }
                st.push(++_n);
            }
            if(s[i]==‘F‘||s[i]==‘T‘){
                if((s[i-1]!=‘F‘&&s[i-1]!=‘T‘)&&
                    (s[i+1]!=‘F‘&&s[i+1]!=‘T‘)){
                        //puts("GS");//get stuck
                        boolean[_n+1]=(s[i]==‘T‘);
                        link(st.top(),_n+1);_n++;
                }else{
                    boolean[_n+1]=(s[i]==‘T‘);
                    link(st.top(),++_n);
                }
            }
            if(s[i]==‘)‘)st.pop();
        }
        n=_n;
        bfs();
//        cerr<<"GS";//got safely
        for(int i=n;i>=1;i--){
            if(boolean[i]==-1){
                if(last[i])boolean[i]=boolean[e[last[i]].to];
                if(dep[i]&1){
                    for(int v=e[last[i]].next;v;v=e[v].next)
                        if(dep[e[v].to]>dep[i])
                            boolean[i]=boolean[i]&&boolean[e[v].to];
                }
                else
                    for(int v=e[last[i]].next;v;v=e[v].next)
                        if(dep[e[v].to]>dep[i]){
                            boolean[i]=boolean[i]||boolean[e[v].to];
                        }
            }

            //cout<<boolean[i]<<‘ ‘;
        }//puts("");

        printf("%d. ",++CaseCnt);
        if(boolean[1])printf("true");
        else printf("false");
        puts("");
    }

    return 0;
}

T3

同:BZOJ1041圆上的整点

#include<map>
#include<stack>
#include<queue>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<complex>
#include<iostream>
#include<assert.h>
#include<algorithm>
using namespace std;
#define inf 1001001001
#define infll 1001001001001001001LL
#define FOR0(i,n) for(int (i)=0;(i)<(n);++(i))
#define FOR1(i,n) for(int (i)=1;(i)<=(n);++(i))
#define ll long long
#define dbg(vari) cerr<<#vari<<" = "<<(vari)<<endl
#define gmax(a,b) (a)=max((a),(b))
#define gmin(a,b) (a)=min((a),(b))
#define ios0 ios_base::sync_with_stdio(0)
#define Ri register int
#define gc getchar()
#define il inline
il int read(){
    bool f=true;
    ll x=0;char ch;
    while(!isdigit(ch=gc))if(ch==‘-‘)f=false;
    while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-‘0‘;ch=gc;}
    return f?x:-x;
}
#define gi read()
#define FO(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
double eps=1e-10;
ll n,m,r,ans;
ll pf(ll x){
    return x*x;
}
void get(ll d,ll a,double b){
    ll t=b;
    if(b-t!=0||__gcd(a,t)!=1||a==t){
        return;
    }
    ll y=d*a*t,x;x=(ll)sqrt(pf(r)-pf(y));
    if(x>=n||y>=m)return;
    ans+=(n-x)*(m-y)*2;
}
int main(){
    FO(dist);
    n=gi;m=gi;
    int t=gi;
    while(t--){
        r=gi;
        ans=0;
        if(pf(r)>pf(n-1)+pf(m-1)){
            printf("0 ");continue;
        }
        if(r<n)ans=ans+m*n-m*r;
        if(r<m)ans=ans+m*n-n*r;

        for(ll d=1;pf(d)<=2*r;d++){
            if(2*r%d==0){
                for(ll a=1;pf(a)<=r/d;a++)get(d,a,sqrt(2*r/d-pf(a)));
                if(d!=2*r/d)
                    for(ll a=1;pf(a)<=d/2;a++){
                        get(2*r/d,a,sqrt(d-pf(a)));
                    }
            }
        }

        cout<<ans<<‘ ‘;
    }

}
时间: 2024-12-14 18:49:46

【补】20160816训练记录的相关文章

斜率优化系列——训练记录

斜率优化训练记录 前言 斜率优化一般用于优化dp的转移,借着训练斜率优化的相关问题来提升一些DP思维.选择老学长留下的专题场来练手,由于该场题数较多,以及个人不太愿意长时间进行单一专题训练,因此开此文来记录断续的训练结果和心得. 记录 题一 由一道简单入门题玩具装箱开头,题意和思路比较简单就不讲了. 代码 #include<bits/stdc++.h> #define dd(x) cout<<#x<<" = "<<x<<&qu

训练记录PART1

11/05 bestcoder #93 C 等价于给出很多环,等概率选择N个点,收益为出现过点的环的环长lcm.不同的环只有 \(\sqrt {26}=6\) 个,用\(f_S\)表示点出现在状态为S的那些环里的选取总数,DP一下即可. bestcoder #93 D 考虑meet in the middle.推一下式子,设左侧选的数和为\(A_{left}t\),两两乘积之和为\(B_{left}\),那么满足\(B_{left}+B_{right}+A_{left}*A_{right}>=0

NOI前训练记录

从今年年初开始就没怎么碰oi,学了三个月文化课,然后就是省选到处跑(浪),进了省队后又去北京打(浪)了波(七)铁(天),回家后又生了一星期病,感觉自己noi凉透了... ctsc因为运气的原因有人放弃D3自己才拿到au,apio什么牌都没拿到,自己这么菜的主要原因可能还是没怎么做题吧,五个月不碰oi,已经连dfs都不会了,还有两个月就noi了,再不训练又要为JS丢脸了,自己拿不到au却占了个省队名额,而阿老师邀请赛冠军的水平却没进省队,感觉自己不珍惜这个省队名额真的是说不过去 本文就记录一下本人

Dailight 训练记录

现场赛记录 19 CCPC 湘潭邀请赛  11/Gold 19 ICPC 西安邀请赛 49/Silver 训练规划: hl: 1.深入增强图论,数据结构的能力,包括但不限于树形dp,点分治,多写dp,学习斜率优化,四边形优化 2.保证银牌及以下图论,数据结构,dp的通过率,最好可以在十分钟内出思路 3.养成提交前检查代码的习惯,不出现傻逼错误. 4.学习简单数论(逆元,组合数),尤其是数论结合图论的应用 gbs: 1.加快上机 ->  写完代码过样例 这一过程的速度. 2.减少debug占用机时

二分暑假专题 训练记录 2017-7-29

POJ3258-River Hopscotch 题意: 给你区间[0,L]给你n个石头,然后去除m个石头  最大化 石头间最小的距离 思路: 首先0和L 这两个石头是不可以动的   然后用 s 数组记录 整个区间的石头 然后排序  此时石头的排序就是有序的了  然后二分套模板 接着check函数才是最关键的好的把 从0到 n+1-m   总共就有 n+2-m 个石头了 而由于第0个石头不可以动 , 所以从第一个开始动 同时判断条件是 s[cur] - s[last] < d 而不是 <= #i

dp暑假专题 训练记录

A 回文串的最小划分 题意:给出长度不超过1000的字符串,把它分割成若干个回文字串,求能分成的最少字串数. #include <iostream> #include <cstdio> #include <string.h> #include <string> using namespace std; const int mod = 1e9 + 7; const int maxn = 1000 + 5; const int INF = 0x3f3f3f3f;

20160814训练记录

T1 题意:给定n 求能组成多少个三角形 题解:枚举三个点,但是切记不要用距离算,会有精度误差 因为这样三个点只要不在一个直线上就行 那么即可   T2 题意:给定100个长度小于100的关键字符串,给出十篇文章,对于每一篇文章回答是否都包含所有关键字符串 题解:文章长度1000000 目测一下应该kmp优秀一点能过   那么稍微介绍一下kmp 我们为了匹配串A 和B   暴力是枚举起点比较 然后把起点在失配的时候后移一位 那么我们简化这个过程 我们找到一个不匹配的点,如果我们能找到一段前缀和我

VIM无法补全错误记录

按照教程进行安装 1. 安装 vundle # vundle是vim的包管理器,十分好用 [email protected]: ~$ git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim [email protected]: ~$ vim ~/.vimrc 写入: " description: configuration of vim " author: phillee "

20160813下午训练记录

*下午听说讲课很简单,被拉去隔壁做只可口胡 不可写的题了 T1 江苏省选的时候有道题面差不多的题目,邵战狂当时跟我口胡过这题 我们还是先不考虑1 那么我们选取一个元素,当加入第二个的时候,两个的奇偶性不同,加入第三个数时,肯定不满足. 那么我们特判一下1的数目,然后乱搞一下 int n,a[1234]; bool np[33333333]; int tot,pr[8001234]; const int N=30000000; void sieve(){ for(int i=2;i<=N;i++)